Skip to content

Commit 6085b4d

Browse files
authored
Merge pull request #32 from yaahc/exclude-labels
Add exclude_labels method to GithubQuery
2 parents c8b8f5f + b9783b4 commit 6085b4d

File tree

3 files changed

+29
-5
lines changed

3 files changed

+29
-5
lines changed

tools/agenda-generator/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ authors = ["Mara Bos <m-ou.se@m-ou.se>"]
55
edition = "2018"
66

77
[dependencies]
8-
anyhow = "1.0"
98
chrono = { version = "0.4", features = ["serde"] }
109
reqwest = { version = "0.10", features = ["blocking", "json"] }
1110
serde = { version = "1.0", features = ["derive"] }
1211
serde_json = "1.0"
1312
itertools = "0.10.1"
1413
structopt = "0.3.21"
14+
color-eyre = "0.5.11"

tools/agenda-generator/src/generator.rs

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1-
use anyhow::Result;
21
use chrono::{Duration, NaiveDateTime};
2+
use color_eyre::{
3+
eyre::{Result, WrapErr},
4+
Section, SectionExt,
5+
};
36
use itertools::Itertools;
47
use reqwest::header::{AUTHORIZATION, USER_AGENT};
58
use serde::de::{DeserializeOwned, Deserializer};
@@ -124,6 +127,7 @@ impl Generator {
124127
.labels(&["T-libs-api", "stable-nominated"])
125128
.labels(&["T-libs", "beta-nominated"])
126129
.labels(&["T-libs-api", "beta-nominated"])
130+
.exclude_labels(&["beta-accepted"])
127131
.state(State::Any)
128132
.repo("rust-lang/rust")
129133
.repo("rust-lang/rfcs")
@@ -410,6 +414,7 @@ impl Sort {
410414
struct GithubQuery {
411415
name: &'static str,
412416
labels: Vec<&'static [&'static str]>,
417+
excluded_labels: Vec<&'static [&'static str]>,
413418
repos: Vec<&'static str>,
414419
sort: Option<Sort>,
415420
count: Option<usize>,
@@ -446,6 +451,7 @@ impl GithubQuery {
446451
Self {
447452
name,
448453
labels: vec![],
454+
excluded_labels: vec![],
449455
repos: vec![],
450456
sort: None,
451457
count: None,
@@ -458,6 +464,11 @@ impl GithubQuery {
458464
self
459465
}
460466

467+
fn exclude_labels(&mut self, labels: &'static [&'static str]) -> &mut Self {
468+
self.excluded_labels.push(labels);
469+
self
470+
}
471+
461472
fn repo(&mut self, repo: &'static str) -> &mut Self {
462473
self.repos.push(repo);
463474
self
@@ -497,6 +508,15 @@ impl GithubQuery {
497508

498509
let issues = github_api(&endpoint)?;
499510
let issues = generator.dedup(issues);
511+
512+
let issues = issues.filter(|issue| {
513+
!self.excluded_labels.iter().any(|labels| {
514+
labels
515+
.iter()
516+
.all(|&label| issue.labels.iter().any(|x| x == label))
517+
})
518+
});
519+
500520
let issues: Vec<_> = if let Some(count) = self.count {
501521
issues.take(count).collect()
502522
} else {
@@ -585,7 +605,10 @@ fn github_api<T: DeserializeOwned>(endpoint: &str) -> Result<T> {
585605
client = client.header(AUTHORIZATION, format!("token {}", token));
586606
}
587607
let response = client.send()?;
588-
Ok(response.json()?)
608+
let response = response.text()?;
609+
Ok(serde_json::from_str(&response)
610+
.wrap_err("response body cannot be deserialized")
611+
.with_section(|| response.header("Response:"))?)
589612
}
590613

591614
fn deserialize_labels<'de, D: Deserializer<'de>>(d: D) -> Result<Vec<String>, D::Error> {

tools/agenda-generator/src/main.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
use anyhow::Result;
21
use cli::AgendaKind;
2+
use color_eyre::eyre;
33
use generator::Generator;
44

55
mod cli;
66
mod generator;
77

8-
fn main() -> Result<()> {
8+
fn main() -> eyre::Result<()> {
9+
color_eyre::install()?;
910
let args = cli::Args::from_args();
1011
let generator = Generator::default();
1112
let agenda = match args.agenda {

0 commit comments

Comments
 (0)