diff options
| author | Max Audron <audron@cocaine.farm> | 2022-06-07 12:28:18 +0200 |
|---|---|---|
| committer | Maximilian Manz <maximilian.manz@de.clara.net> | 2022-06-20 11:33:04 +0200 |
| commit | e9dc01ffb547d0fa605bfe38b34672ddd5161be4 (patch) | |
| tree | 5ca50547512b7cc2256ef457d468c4252ae23a0b /src/local/aggregate.rs | |
| parent | implement cloning of new repos (diff) | |
reorganize file structure and cleanup lints
Diffstat (limited to 'src/local/aggregate.rs')
| -rw-r--r-- | src/local/aggregate.rs | 107 |
1 files changed, 0 insertions, 107 deletions
diff --git a/src/local/aggregate.rs b/src/local/aggregate.rs deleted file mode 100644 index 21a1dad..0000000 --- a/src/local/aggregate.rs +++ /dev/null @@ -1,107 +0,0 @@ -use std::path::PathBuf; - -use git2::Repository; - -use tracing::{debug, error}; -use walkdir::WalkDir; - -use crate::forge::Project; - -use super::{Repo, Repos}; - -#[async_trait::async_trait] -pub trait Aggregator { - async fn from_local(root: &str, scope: &str) -> Repos; - async fn from_forge(root: &str, projects: Vec<Project>) -> Repos; - async fn aggregate(mut local: Repos, mut remote: Repos) -> Repos; -} - -#[async_trait::async_trait] -impl Aggregator for Repos { - #[tracing::instrument(level = "trace")] - async fn from_local(root: &str, scope: &str) -> Repos { - let mut repos = Vec::new(); - - let path: std::path::PathBuf = [root, scope].iter().collect(); - - if !path.exists() { - return repos; - } - - let mut walker = WalkDir::new(path).into_iter(); - - loop { - let entry = match walker.next() { - None => break, - Some(Err(err)) => panic!("ERROR: {}", err), - Some(Ok(entry)) => entry, - }; - - if entry.file_type().is_dir() { - let mut dir = std::fs::read_dir(entry.path()).unwrap(); - - if let Some(_) = dir.find(|dir| { - if let Ok(dir) = dir { - dir.file_name() == ".git" - } else { - false - } - }) { - walker.skip_current_dir(); - - match Repository::open(entry.path()) { - Ok(repo) => repos.push(Repo { - name: entry - .path() - .strip_prefix(root) - .unwrap() - .to_str() - .unwrap() - .to_string(), - path: entry.path().to_path_buf(), - repo: Some(repo), - ..Repo::default() - }), - Err(err) => error!("could not open repository: {}", err), - } - } else { - continue; - } - } - } - - return repos; - } - - #[tracing::instrument(level = "trace")] - async fn from_forge(root: &str, projects: Vec<Project>) -> Repos { - projects - .iter() - .map(|project| { - let mut repo: Repo = project.into(); - repo.path = [root, &repo.name].iter().collect(); - return repo; - }) - .collect() - } - - #[tracing::instrument(level = "trace", skip(local, remote))] - async fn aggregate(mut local: Repos, mut remote: Repos) -> Repos { - local = local - .into_iter() - .map(|mut left| { - if let Some(i) = remote.iter().position(|right| *right == left) { - let right = remote.remove(i); - left.forge = right.forge; - } - - left - }) - .collect(); - - local.append(&mut remote); - local.sort(); - - return local; - } -} |
