Skip to content

Commit 7656c32

Browse files
committed
Add a filter to the triage dashboard
1 parent e01907b commit 7656c32

File tree

3 files changed

+57
-3
lines changed

3 files changed

+57
-3
lines changed

src/main.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,14 @@ async fn serve_req(req: Request<Body>, ctx: Arc<Context>) -> Result<Response<Bod
2121
let params = matcher.params();
2222
let owner = params.find("owner");
2323
let repo = params.find("repo");
24-
return triagebot::triage::pulls(ctx, owner.unwrap(), repo.unwrap()).await;
24+
let filter = if let Some(q) = req.uri.query() {
25+
let pair = url::form_urlencoded::parse(q.as_bytes()).find(|(k, _)| k == "q");
26+
pair.map(|(_, filter)| filter.to_string())
27+
} else {
28+
None
29+
};
30+
31+
return triagebot::triage::pulls(ctx, owner.unwrap(), repo.unwrap(), filter).await;
2532
} else {
2633
return triagebot::triage::index();
2734
}

src/triage.rs

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ pub async fn pulls(
2121
ctx: Arc<Context>,
2222
owner: &str,
2323
repo: &str,
24+
filter: Option<String>,
2425
) -> Result<Response<Body>, hyper::Error> {
2526
let octocrab = &ctx.octocrab;
2627
let res = octocrab
@@ -51,6 +52,24 @@ pub async fn pulls(
5152
next_page = page.next;
5253
}
5354

55+
let mut label_filter = Vec::new();
56+
let mut author_filter = Vec::new();
57+
let mut assignee_filter = Vec::new();
58+
if let Some(filter) = filter.clone() {
59+
let kvs: Vec<&str> = filter.split_whitespace().collect();
60+
for kv in kvs {
61+
match kv.split_once(':') {
62+
Some((k, v)) if !v.is_empty() => match k {
63+
"label" => label_filter.push(v.to_string()),
64+
"author" => author_filter.push(v.to_string()),
65+
"assignee" => assignee_filter.push(v.to_string()),
66+
_ => {}
67+
},
68+
_ => {}
69+
}
70+
}
71+
}
72+
5473
let mut pulls: Vec<Value> = Vec::new();
5574
for base_pull in base_pulls.into_iter() {
5675
let assignee = base_pull.assignee.map_or("".to_string(), |v| v.login);
@@ -71,20 +90,39 @@ pub async fn pulls(
7190
(Utc::now() - base_pull.created_at).num_days()
7291
};
7392

74-
let labels = base_pull.labels.map_or("".to_string(), |labels| {
93+
let labels = base_pull.labels.map_or(Vec::new(), |labels| {
7594
labels
7695
.iter()
7796
.map(|label| label.name.clone())
7897
.collect::<Vec<_>>()
79-
.join(", ")
8098
});
99+
if !label_filter.is_empty() {
100+
let mut flg = false;
101+
for filter in label_filter.iter() {
102+
if !labels.iter().any(|label| *label == *filter) {
103+
flg = true;
104+
}
105+
}
106+
if flg {
107+
continue;
108+
}
109+
}
110+
111+
let labels = labels.join(", ");
81112
let wait_for_author = labels.contains("S-waiting-on-author");
82113
let wait_for_review = labels.contains("S-waiting-on-review");
83114
let html_url = base_pull.html_url;
84115
let number = base_pull.number;
85116
let title = base_pull.title;
86117
let author = base_pull.user.login;
87118

119+
if !author_filter.is_empty() && !author_filter.iter().all(|s| *s == author) {
120+
continue;
121+
}
122+
if !assignee_filter.is_empty() && !assignee_filter.iter().all(|s| *s == assignee) {
123+
continue;
124+
}
125+
88126
let pull = PullRequest {
89127
html_url,
90128
number,
@@ -105,6 +143,11 @@ pub async fn pulls(
105143
context.insert("pulls", &pulls);
106144
context.insert("owner", &owner);
107145
context.insert("repo", &repo);
146+
if let Some(filter) = filter {
147+
context.insert("filter", &filter);
148+
} else {
149+
context.insert("filter", "");
150+
}
108151

109152
let tera = tera::Tera::new("templates/triage/**/*").unwrap();
110153
let body = Body::from(tera.render("pulls.html", &context).unwrap());

templates/triage/pulls.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@
4242

4343
<body>
4444
<h1>Triage dashboard - <a href="https://github.com/{{ owner }}/{{ repo }}">{{ owner }}/{{ repo }}</a></h1>
45+
<form action="/triage/{{ owner }}/{{ repo }}" method="get">
46+
<input type="search" name="q" value="{{ filter }}" style="width: 400px;">
47+
<input type="submit" value="filter">
48+
</form>
4549
<table>
4650
<thead>
4751
<tr>

0 commit comments

Comments
 (0)