feat: add filter
All checks were successful
continuous-integration/drone/push Build is passing

Signed-off-by: kjuulh <contact@kjuulh.io>
This commit is contained in:
2024-04-12 22:30:45 +02:00
parent 3709e37599
commit 706a62a292
5 changed files with 81 additions and 4 deletions

View File

@@ -19,3 +19,4 @@ tower-http = { version = "0.5.2", features = ["cors", "trace"] }
futures = "0.3.30"
reqwest = {version = "0.12.3", default-features = false, features = ["json", "rustls-tls"]}
itertools = "0.12.1"
regex = "1.10.4"

View File

@@ -23,6 +23,9 @@ enum Commands {
user: Option<String>,
#[arg(long)]
org: Option<Vec<String>>,
#[arg(long, env = "CONTRACTOR_FILTER")]
filter: Option<String>,
},
}
@@ -61,12 +64,12 @@ async fn main() -> anyhow::Result<()> {
result??
}
}
Some(Commands::Reconcile { user, org }) => {
Some(Commands::Reconcile { user, org, filter }) => {
tracing::info!("running reconcile");
let state = SharedState::from(Arc::new(State::new().await?));
state.reconciler().reconcile(user, org).await?;
state.reconciler().reconcile(user, org, filter).await?;
}
None => {}
}

View File

@@ -1,4 +1,4 @@
use std::{ops::Deref, pin::Pin, sync::Arc};
use std::{fmt::Display, ops::Deref, pin::Pin, sync::Arc};
type DynGiteaClient = Arc<dyn traits::GiteaClient + Send + Sync + 'static>;
pub struct GiteaClient(DynGiteaClient);
@@ -23,6 +23,12 @@ pub struct Repository {
pub name: String,
}
impl Display for Repository {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_fmt(format_args!("{}/{}", self.owner, self.name))
}
}
impl TryFrom<GiteaRepository> for Repository {
type Error = anyhow::Error;

View File

@@ -1,3 +1,4 @@
use anyhow::Context;
use futures::{stream::FuturesUnordered, StreamExt};
use itertools::Itertools;
@@ -18,11 +19,38 @@ impl Reconciler {
&self,
user: Option<String>,
orgs: Option<Vec<String>>,
filter: Option<String>,
) -> anyhow::Result<()> {
let repos = self.get_repos(user, orgs).await?;
tracing::debug!("found repositories: {}", repos.len());
let renovate_enabled = self.get_renovate_enabled(&repos).await?;
let filtered_repos = match filter {
Some(filter) => {
let re = regex::Regex::new(&filter).context(
"filter regex failed to compile, make sure it is valid against rust-lang/regex",
)?;
repos
.into_iter()
.filter(|r| {
if re.is_match(&r.to_string()) {
true
} else {
tracing::trace!(
filter = &filter,
"repository: {}, didn't match filter",
r.to_string(),
);
false
}
})
.collect()
}
None => repos,
};
tracing::debug!("filtered repositories: {}", filtered_repos.len());
let renovate_enabled = self.get_renovate_enabled(&filtered_repos).await?;
tracing::debug!(
"found repositories with renovate enabled: {}",
renovate_enabled.len()