From 8dcfcea21d92617df30a7de98649e549ef5a2b41 Mon Sep 17 00:00:00 2001 From: Jakob Meier Date: Mon, 14 Aug 2023 12:00:03 +0200 Subject: [PATCH] Added build-all command to package all packages in the repo --- src/cmds/build.rs | 19 +++++++++++++++++-- src/cmds/mod.rs | 2 +- src/cmds/tree.rs | 8 +++++--- src/main.rs | 16 ++++++++++++++++ 4 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/cmds/build.rs b/src/cmds/build.rs index 20bf6ab..5ddbcd6 100644 --- a/src/cmds/build.rs +++ b/src/cmds/build.rs @@ -45,7 +45,7 @@ fn build_package(name: &str, db: &Database, arch: &Option, verbose:bool) .arg("-c") .arg( &format!( - "cd {} && echo $CBUILD_ARCH && echo $APORTSDIR && abuild rootbld", + "cd {} && echo $APORTSDIR && abuild rootbld", pkg.path.to_str().expect("Unable to read path"), )); } else { @@ -77,7 +77,7 @@ fn build_package(name: &str, db: &Database, arch: &Option, verbose:bool) /// builds a package including the dependencies fn build_group(name: PackageName, db: &Database, arch: &Option, verbose:bool) { - let tasks = super::tree::topological_sort(&name, &db) + let tasks = super::tree::topological_sort(vec![name], &db) .expect("Unable to resolve dependencies, as there is a cycle in the graph"); let num = tasks.len(); @@ -100,3 +100,18 @@ pub fn build(name: PackageName, db: Option, arch: Option, build build_package(&name, &db, &arch, verbose); } } +/// attempts to build every package and its dependencies from the repo +pub fn build_all(db: Option, arch: Option, verbose:bool) { + let db = Database::from_file(db.unwrap_or(PathBuf::from("db.yml"))) + .expect("Unable to open database"); + + let tasks = super::tree::topological_sort(db.packages.keys().map(|s|s.to_string()).collect(), &db) + .expect("Unable to resolve dependencies, as there is a cycle in the graph"); + + let num = tasks.len(); + + for (i, task) in tasks.iter().enumerate() { + println!("Building {} ({}/{})", task, i+1, num); + build_package(task, &db, &arch, verbose); + } +} diff --git a/src/cmds/mod.rs b/src/cmds/mod.rs index c6572e2..d1aa173 100644 --- a/src/cmds/mod.rs +++ b/src/cmds/mod.rs @@ -6,5 +6,5 @@ mod tree; pub use scan::scan; pub use list::list; pub use info::info; -pub use build::build; +pub use build::{build, build_all}; pub use tree::tree; diff --git a/src/cmds/tree.rs b/src/cmds/tree.rs index 848e8fa..34da545 100644 --- a/src/cmds/tree.rs +++ b/src/cmds/tree.rs @@ -75,10 +75,12 @@ fn list_all_deps(start: PackageName, db: &Database) -> HashSet { /// topologically sorts all local dependencies /// filters unknown dependencies -pub fn topological_sort(start: &PackageName, db: &Database) -> Result, Vec<(PackageName, PackageName)>> { +pub fn topological_sort(start: Vec, db: &Database) -> Result, Vec<(PackageName, PackageName)>> { let mut stack = LinkedList::new(); let mut marker = HashSet::new(); - stack.push_front(start.to_string()); + for node in start { + stack.push_front(node.to_string()); + } let mut edge_out = HashMap::new(); let mut edge_in = HashMap::new(); @@ -185,7 +187,7 @@ pub fn tree(name: PackageName, db: Option, local_only: bool) { .expect("Unable to open database"); if local_only { - match topological_sort(&name, &db) { + match topological_sort(vec![name], &db) { Ok(sorted) => { for dep in sorted { println!("{}", dep); diff --git a/src/main.rs b/src/main.rs index ac93c51..a515740 100644 --- a/src/main.rs +++ b/src/main.rs @@ -19,6 +19,21 @@ enum Commands { /// package database path db: Option }, + /// Build all packages in repo + BuildAll { + /// build the package for a target architecture + /// requires abuild-rootbld to be installed, + /// and the .rootbld-repositories file to be configured correctly + /// (even if set to host architecture) + #[arg(short='a',long)] + arch: Option, + /// package database path + #[arg(short='d',long)] + db: Option, + /// allows the build log to be toggled on and off + #[arg(short='v', default_value="false")] + verbose: bool + }, /// Builds the package Build { /// the packagename @@ -89,6 +104,7 @@ fn main() { Commands::Info { package, db, show_depends, show_provides } => cmds::info(package, db, show_provides, show_depends), Commands::Build { package, db, arch, no_build_dependencies, verbose } => cmds::build(package, db, arch, !no_build_dependencies, verbose), Commands::Tree { package, db, only_local } => cmds::tree(package, db, only_local), + Commands::BuildAll { arch, db, verbose } => cmds::build_all(db, arch, verbose), _ => panic!("Unimplemented") } } -- 2.38.5