Skip to content

Commit c0e3c8d

Browse files
committed
Add remaining code to revamp oldest unreviewed PRs
1 parent ceaada4 commit c0e3c8d

File tree

6 files changed

+281
-94
lines changed

6 files changed

+281
-94
lines changed

src/actions.rs

Lines changed: 94 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ pub struct Step<'a> {
1919
}
2020

2121
pub struct Query<'a> {
22-
pub repos: Vec<&'a str>,
22+
/// Vec of (owner, name)
23+
pub repos: Vec<(&'a str, &'a str)>,
2324
pub queries: Vec<QueryMap<'a>>,
2425
}
2526

@@ -57,7 +58,7 @@ lazy_static! {
5758
};
5859
}
5960

60-
fn to_human(d: DateTime<Utc>) -> String {
61+
pub fn to_human(d: DateTime<Utc>) -> String {
6162
let d1 = chrono::Utc::now() - d;
6263
let days = d1.num_days();
6364
if days > 60 {
@@ -78,74 +79,104 @@ impl<'a> Action for Step<'a> {
7879
for Query { repos, queries } in &self.actions {
7980
for repo in repos {
8081
let repository = Repository {
81-
full_name: repo.to_string(),
82+
owner: repo.0.to_string(),
83+
name: repo.1.to_string(),
8284
};
8385

8486
for QueryMap { name, kind, query } in queries {
85-
let query = match query {
86-
github::GithubQuery::REST(query) => query,
87-
};
88-
match kind {
89-
QueryKind::List => {
90-
let issues_search_result = repository.get_issues(&gh, &query).await;
91-
92-
match issues_search_result {
93-
Ok(issues) => {
94-
let issues_decorator: Vec<_> = issues
95-
.iter()
96-
.map(|issue| IssueDecorator {
97-
title: issue.title.clone(),
98-
number: issue.number,
99-
html_url: issue.html_url.clone(),
100-
repo_name: repository
101-
.full_name
102-
.split("/")
103-
.last()
104-
.expect("Failed to split repository name")
105-
.to_string(),
106-
labels: issue
107-
.labels
108-
.iter()
109-
.map(|l| l.name.as_ref())
110-
.collect::<Vec<_>>()
111-
.join(", "),
112-
assignees: issue
113-
.assignees
87+
match query {
88+
github::GithubQuery::REST(query) => {
89+
match kind {
90+
QueryKind::List => {
91+
let issues_search_result = repository.get_issues(&gh, &query).await;
92+
93+
match issues_search_result {
94+
Ok(issues) => {
95+
let issues_decorator: Vec<_> = issues
11496
.iter()
115-
.map(|u| u.login.as_ref())
116-
.collect::<Vec<_>>()
117-
.join(", "),
118-
updated_at: to_human(issue.updated_at),
119-
})
120-
.collect();
121-
122-
results
123-
.entry(*name)
124-
.or_insert(Vec::new())
125-
.extend(issues_decorator);
97+
.map(|issue| IssueDecorator {
98+
title: issue.title.clone(),
99+
number: issue.number,
100+
html_url: issue.html_url.clone(),
101+
repo_name: repository.name.clone(),
102+
labels: issue
103+
.labels
104+
.iter()
105+
.map(|l| l.name.as_ref())
106+
.collect::<Vec<_>>()
107+
.join(", "),
108+
assignees: issue
109+
.assignees
110+
.iter()
111+
.map(|u| u.login.as_ref())
112+
.collect::<Vec<_>>()
113+
.join(", "),
114+
updated_at: to_human(issue.updated_at),
115+
})
116+
.collect();
117+
118+
results
119+
.entry(*name)
120+
.or_insert(Vec::new())
121+
.extend(issues_decorator);
122+
}
123+
Err(err) => {
124+
eprintln!("ERROR: {}", err);
125+
err.chain()
126+
.skip(1)
127+
.for_each(|cause| eprintln!("because: {}", cause));
128+
std::process::exit(1);
129+
}
130+
}
126131
}
127-
Err(err) => {
128-
eprintln!("ERROR: {}", err);
129-
err.chain()
130-
.skip(1)
131-
.for_each(|cause| eprintln!("because: {}", cause));
132-
std::process::exit(1);
132+
133+
QueryKind::Count => {
134+
let count = repository.get_issues_count(&gh, &query).await;
135+
136+
match count {
137+
Ok(count) => {
138+
let result = if let Some(value) = context.get(*name) {
139+
value.as_u64().unwrap() + count as u64
140+
} else {
141+
count as u64
142+
};
143+
144+
context.insert(*name, &result);
145+
}
146+
Err(err) => {
147+
eprintln!("ERROR: {}", err);
148+
err.chain()
149+
.skip(1)
150+
.for_each(|cause| eprintln!("because: {}", cause));
151+
std::process::exit(1);
152+
}
153+
}
133154
}
134155
}
135-
}
136-
137-
QueryKind::Count => {
138-
let count = repository.get_issues_count(&gh, &query).await;
139-
140-
match count {
141-
Ok(count) => {
142-
let result = if let Some(value) = context.get(*name) {
143-
value.as_u64().unwrap() + count as u64
144-
} else {
145-
count as u64
146-
};
147-
148-
context.insert(*name, &result);
156+
},
157+
github::GithubQuery::GraphQL(query) => {
158+
let issues = query.query(&repository, &gh).await;
159+
160+
match issues {
161+
Ok(issues_decorator) => {
162+
match kind {
163+
QueryKind::List => {
164+
results
165+
.entry(*name)
166+
.or_insert(Vec::new())
167+
.extend(issues_decorator);
168+
}
169+
QueryKind::Count => {
170+
let count = issues_decorator.len();
171+
let result = if let Some(value) = context.get(*name) {
172+
value.as_u64().unwrap() + count as u64
173+
} else {
174+
count as u64
175+
};
176+
177+
context.insert(*name, &result);
178+
}
179+
}
149180
}
150181
Err(err) => {
151182
eprintln!("ERROR: {}", err);

src/agenda.rs

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ pub fn prioritization<'a>() -> Box<dyn Action> {
9292
});
9393

9494
actions.push(Query {
95-
repos: vec!["rust-lang/compiler-team"],
95+
repos: vec![("rust-lang", "compiler-team")],
9696
queries,
9797
});
9898

@@ -135,7 +135,7 @@ pub fn prioritization<'a>() -> Box<dyn Action> {
135135
});
136136

137137
actions.push(Query {
138-
repos: vec!["rust-lang/rust"],
138+
repos: vec![("rust-lang", "rust")],
139139
queries,
140140
});
141141

@@ -178,7 +178,7 @@ pub fn prioritization<'a>() -> Box<dyn Action> {
178178
});
179179

180180
actions.push(Query {
181-
repos: vec!["rust-lang/rust-forge"],
181+
repos: vec![("rust-lang", "rust-forge")],
182182
queries,
183183
});
184184

@@ -481,16 +481,11 @@ pub fn prioritization<'a>() -> Box<dyn Action> {
481481
queries.push(QueryMap {
482482
name: "top_unreviewed_prs",
483483
kind: QueryKind::List,
484-
query: github::GithubQuery::REST(github::Query {
485-
filters: vec![("state", "open"), ("is", "pull-request"), ("draft", "false")],
486-
include_labels: vec!["S-waiting-on-review", "T-compiler"],
487-
exclude_labels: vec![],
488-
ordering,
489-
}),
484+
query: github::GithubQuery::GraphQL(Box::new(github::graphql::LeastRecentlyReviewedPullRequests)),
490485
});
491486

492487
actions.push(Query {
493-
repos: vec!["rust-lang/rust"],
488+
repos: vec![("rust-lang", "rust")],
494489
queries,
495490
});
496491

@@ -511,7 +506,7 @@ pub fn prioritization<'a>() -> Box<dyn Action> {
511506
});
512507

513508
actions.push(Query {
514-
repos: vec!["rust-lang/rfcs"],
509+
repos: vec![("rust-lang", "rfcs")],
515510
queries,
516511
});
517512

@@ -526,7 +521,7 @@ pub fn lang<'a>() -> Box<dyn Action> {
526521
name: "lang_agenda",
527522
actions: vec![
528523
Query {
529-
repos: vec!["rust-lang/lang-team"],
524+
repos: vec![("rust-lang", "lang-team")],
530525
queries: vec![
531526
QueryMap {
532527
name: "pending_project_proposals",
@@ -561,7 +556,7 @@ pub fn lang<'a>() -> Box<dyn Action> {
561556
],
562557
},
563558
Query {
564-
repos: vec!["rust-lang/rfcs"],
559+
repos: vec![("rust-lang", "rfcs")],
565560
queries: vec![QueryMap {
566561
name: "rfcs_waiting_to_be_merged",
567562
kind: QueryKind::List,
@@ -579,10 +574,10 @@ pub fn lang<'a>() -> Box<dyn Action> {
579574
},
580575
Query {
581576
repos: vec![
582-
"rust-lang/rfcs",
583-
"rust-lang/rust",
584-
"rust-lang/reference",
585-
"rust-lang/lang-team",
577+
("rust-lang", "rfcs"),
578+
("rust-lang", "rust"),
579+
("rust-lang", "reference"),
580+
("rust-lang", "lang-team"),
586581
],
587582
queries: vec![
588583
QueryMap {
@@ -646,7 +641,7 @@ pub fn lang_planning<'a>() -> Box<dyn Action> {
646641
name: "lang_planning_agenda",
647642
actions: vec![
648643
Query {
649-
repos: vec!["rust-lang/lang-team"],
644+
repos: vec![("rust-lang", "lang-team")],
650645
queries: vec![
651646
QueryMap {
652647
name: "pending_project_proposals",
@@ -681,7 +676,7 @@ pub fn lang_planning<'a>() -> Box<dyn Action> {
681676
],
682677
},
683678
Query {
684-
repos: vec!["rust-lang/lang-team"],
679+
repos: vec![("rust-lang", "lang-team")],
685680
queries: vec![QueryMap {
686681
name: "active_initiatives",
687682
kind: QueryKind::List,

src/github.rs

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use std::{
1313
time::{Duration, SystemTime},
1414
};
1515

16-
mod graphql;
16+
pub mod graphql;
1717

1818
#[derive(Debug, PartialEq, Eq, serde::Deserialize)]
1919
pub struct User {
@@ -759,11 +759,17 @@ pub struct IssueSearchResult {
759759

760760
#[derive(Debug, serde::Deserialize)]
761761
pub struct Repository {
762-
pub full_name: String,
762+
pub owner: String,
763+
pub name: String,
763764
}
764765

765766
impl Repository {
766767
const GITHUB_API_URL: &'static str = "https://api.github.com";
768+
const GITHUB_GRAPHQL_API_URL: &'static str = "https://api.github.com/graphql";
769+
770+
pub fn full_name(&self) -> String {
771+
return format!("{}/{}", self.owner, self.name);
772+
}
767773

768774
pub async fn get_issues<'a>(
769775
&self,
@@ -875,7 +881,7 @@ impl Repository {
875881
format!(
876882
"{}/repos/{}/{}?{}",
877883
Repository::GITHUB_API_URL,
878-
self.full_name,
884+
self.full_name(),
879885
endpoint,
880886
filters
881887
)
@@ -902,7 +908,7 @@ impl Repository {
902908
.iter()
903909
.map(|label| format!("-label:{}", label)),
904910
)
905-
.chain(std::iter::once(format!("repo:{}", self.full_name)))
911+
.chain(std::iter::once(format!("repo:{}", self.full_name())))
906912
.collect::<Vec<_>>()
907913
.join("+");
908914
format!(
@@ -918,6 +924,7 @@ impl Repository {
918924

919925
pub enum GithubQuery<'a> {
920926
REST(Query<'a>),
927+
GraphQL(Box<dyn graphql::IssuesQuery + Send + Sync>),
921928
}
922929

923930
pub struct Query<'a> {
@@ -959,12 +966,12 @@ pub enum Event {
959966
}
960967

961968
impl Event {
962-
pub fn repo_name(&self) -> &str {
969+
pub fn repo_name(&self) -> String {
963970
match self {
964-
Event::Create(event) => &event.repository.full_name,
965-
Event::IssueComment(event) => &event.repository.full_name,
966-
Event::Issue(event) => &event.repository.full_name,
967-
Event::Push(event) => &event.repository.full_name,
971+
Event::Create(event) => event.repository.full_name(),
972+
Event::IssueComment(event) => event.repository.full_name(),
973+
Event::Issue(event) => event.repository.full_name(),
974+
Event::Push(event) => event.repository.full_name(),
968975
}
969976
}
970977

0 commit comments

Comments
 (0)