diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/commands.rs | 223 | ||||
-rw-r--r-- | src/main.rs | 20 |
2 files changed, 144 insertions, 99 deletions
diff --git a/src/commands.rs b/src/commands.rs index 08db773..4a97bb6 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -55,89 +55,42 @@ pub fn check_ignores(root : &str) { } } -pub fn install(root : &str, verbose : bool) { +pub fn install_all_packages(root : &str, verbose : bool) { let glam_file_path = format!("{}/.glam", root); // Find glam object or create one with default configuration let glam_object = read_glam_file(&glam_file_path); - let glam_packages = glam_object.packages; + let mut glam_packages = glam_object.packages; - for package in glam_packages.iter() { - install_package(root, &package.git_repo, "", verbose); + for package in glam_packages.iter_mut() { + clone_or_fetch_package(root, &package, verbose); + let commit = package.commit.to_string(); + install_glam_package(root, &commit, package, false, true, verbose); } } -pub fn install_package(root : &str, git_repo : &str, commit : &str, verbose : bool) { +pub fn install_package(root : &str, git_repo : &str, commit : &str, copy_files : bool, verbose : bool) { let glam_file_path = format!("{}/.glam", root); // Find glam object or create one with default configuration let mut glam_object = read_glam_file(&glam_file_path); let mut glam_packages = glam_object.packages; - let mut package_index = 0; - let mut found_package = false; let name = utils::get_repo_name(git_repo); - - for (i, package) in glam_packages.iter().enumerate() { - if package.name == name { - package_index = i; - found_package = true; - } - } - - if !found_package { - let package = GlamPackage{ + let (_, target_package) = find_package( + &mut glam_packages, + &name, + Some(GlamPackage{ git_repo : git_repo.to_string(), name : name.to_string(), commit : "".to_string(), - }; - - glam_packages.push(package); - package_index = glam_packages.len() - 1; - } - - let target_package = &mut glam_packages[package_index]; + })); clone_or_fetch_package(root, &target_package, verbose); // Update package folder to commit hash - if commit != "" { - target_package.commit = commit.to_string(); - } - - if target_package.commit == "" { - let res = utils::run_shell_command( - &format!("cd .glam.d/{} && git rev-parse HEAD", - target_package.name), - &root, - verbose).unwrap(); - target_package.commit = res.trim().to_string(); - } else { - utils::log_info("Git checkout to package commit"); - utils::run_shell_command( - &format!("cd .glam.d/{} && git checkout {}", - target_package.name, - target_package.commit), - &root, - verbose); - } - - // If project addon folder doesn't exist, create it - utils::run_shell_command( - &format!("mkdir -p {}/addons/{}", root, name), - &root, - verbose - ); - - // TODO: use source_folder to copy files from (default: /addons/) - // TODO: use target_folder to copy files to (defautl: (root)/) - // Copy addon repository content to target folder - utils::run_shell_command( - &format!("cp -f -r .glam.d/{}/addons/* -t {}/addons/", name, root), - &root, - verbose - ); + install_glam_package(root, commit, target_package, false, copy_files, verbose); // Write .glam file glam_object.packages = glam_packages; @@ -148,12 +101,16 @@ pub fn update_all_packages(root : &str, verbose : bool) { let glam_file_path = format!("{}/.glam", root); // Find glam object or create one with default configuration - let glam_object = read_glam_file(&glam_file_path); - let glam_packages = glam_object.packages; + let mut glam_object = read_glam_file(&glam_file_path); + let mut glam_packages = glam_object.packages; - for package in glam_packages.iter() { - install_package(root, &package.git_repo, "", verbose); + for package in glam_packages.iter_mut() { + clone_or_fetch_package(root, &package, verbose); + install_glam_package(root, "", package, true, true, verbose); } + + glam_object.packages = glam_packages; + write_glam_file(&glam_file_path, &glam_object); } pub fn update_package(root : &str, package_name : &str, verbose : bool) { @@ -163,58 +120,146 @@ pub fn update_package(root : &str, package_name : &str, verbose : bool) { let mut glam_object = read_glam_file(&glam_file_path); let mut glam_packages = glam_object.packages; + + let (_, mut target_package) = find_package(&mut glam_packages, package_name, None); + + clone_or_fetch_package(root, &target_package, verbose); + install_glam_package(root, "", &mut target_package, true, true, verbose); + + // Write .glam file + glam_object.packages = glam_packages; + write_glam_file(&glam_file_path, &glam_object); +} + +pub fn remove_package(root : &str, package_name : &str, verbose : bool) { + let glam_file_path = format!("{}/.glam", root); + + // Find package to update + + let mut glam_object = read_glam_file(&glam_file_path); + let mut glam_packages = glam_object.packages; + let (index, target_package) = find_package(&mut glam_packages, package_name, None); + + remove_glam_package_files(root, &target_package, verbose); + + glam_packages.remove(index); + + // Write .glam file + glam_object.packages = glam_packages; + write_glam_file(&glam_file_path, &glam_object); +} + +pub fn apply_changes(root : &str, package_name : &str, verbose : bool) { + let glam_file_path = format!("{}/.glam", root); + + // Find package to update + + let glam_object = read_glam_file(&glam_file_path); + let mut glam_packages = glam_object.packages; + let (_, target_package) = find_package(&mut glam_packages, package_name, None); + + apply_glam_package_files(root, &target_package, verbose); +} + +fn find_package<'a>(packages : &'a mut Vec<GlamPackage>, name : &str, new_package : Option<GlamPackage>) -> (usize, &'a mut GlamPackage) { let mut package_index = 0; let mut found_package = false; - for (i, package) in glam_packages.iter().enumerate() { - if package.name == package_name { + for (i, package) in packages.iter().enumerate() { + if package.name == name { package_index = i; found_package = true; } } if !found_package { - utils::log_error("Package not found!"); - exit(1); + match new_package { + None => { + utils::log_error("Package not found!"); + exit(1); + }, + Some(package) => { + packages.push(package); + package_index = packages.len() - 1; + } + } } - let target_package = &mut glam_packages[package_index]; + return (package_index, &mut packages[package_index]); +} - clone_or_fetch_package(root, &target_package, verbose); +fn install_glam_package(root : &str, commit : &str, package : &mut GlamPackage, update_package : bool, copy_files : bool, verbose : bool) { + // Update package folder to commit hash + if update_package { + package.commit = "".to_string(); + } - let res = utils::run_shell_command( - &format!("cd .glam.d/{} && git rev-parse HEAD", - target_package.name), - &root, - verbose).unwrap(); - target_package.commit = res.trim().to_string(); + if commit != "" { + package.commit = commit.to_string(); + } - // If project addon folder doesn't exist, create it + if package.commit == "" { + let res = utils::run_shell_command( + &format!("cd .glam.d/{} && git rev-parse HEAD", + package.name), + &root, + verbose).unwrap(); + package.commit = res.trim().to_string(); + } else { + utils::log_info("Git checkout to package commit"); + utils::run_shell_command( + &format!("cd .glam.d/{} && git checkout {}", + package.name, + package.commit), + &root, + verbose); + } + + if copy_files { + // If project addon folder doesn't exist, create it + utils::run_shell_command( + &format!("mkdir -p {}/addons/{}", root, package.name), + &root, + verbose + ); + + // TODO: use source_folder to copy files from (default: /addons/) + // TODO: use target_folder to copy files to (defautl: (root)/) + // Copy addon repository content to target folder + utils::run_shell_command( + &format!("cp -rf .glam.d/{}/addons/* -t {}/addons/", package.name, root), + &root, + verbose + ); + } +} + +fn apply_glam_package_files(root : &str, package : &GlamPackage, verbose : bool) { + // TODO: use source_folder to copy files from (default: /addons/) + // TODO: use target_folder to copy files to (defautl: (root)/) + // Copy addon repository content to target folder utils::run_shell_command( - &format!("mkdir -p {}/addons/{}", root, target_package.name), + &format!("for f in $(ls ./.glam.d/{}/addons/); do cp -rf ./addons/$f ./.glam.d/{}/addons/; done", package.name, package.name), &root, verbose ); +} +fn remove_glam_package_files(root : &str, package : &GlamPackage, verbose : bool) { // TODO: use source_folder to copy files from (default: /addons/) // TODO: use target_folder to copy files to (defautl: (root)/) // Copy addon repository content to target folder utils::run_shell_command( - &format!("cp -f -r .glam.d/{}/addons/* -t {}/addons/", target_package.name, root), + &format!("for f in $(ls ./.glam.d/{}/addons/); do rm -rf ./addons/$f ; done", package.name), &root, verbose ); - // Write .glam file - glam_object.packages = glam_packages; - write_glam_file(&glam_file_path, &glam_object); -} - -pub fn remove_package(root : &str, package : &str, verbose : bool) { -} - -pub fn apply_changes(root : &str, package : &str, verbose : bool) { - + utils::run_shell_command( + &format!("rm -rf ./.glam.d/{}", package.name), + &root, + verbose + ); } pub fn initialize_glam_files(root : &str) { diff --git a/src/main.rs b/src/main.rs index 6b7691b..5d05698 100644 --- a/src/main.rs +++ b/src/main.rs @@ -22,20 +22,20 @@ enum Commands { /// Package project git git_repo: String, /// Commit to checkout (default is latest) - #[clap(short, long, required=false)] + #[clap(short, long, required = false, default_value = "")] commit: String, + /// Don't copy to target folder + #[clap(short, long, required = false, takes_value = false)] + no_copy: bool, }, - /// Install packages on .glam file + /// Install all packages on .glam file Install { - /// Verbose (output subshell commands) - #[clap(short, long, takes_value = false)] - verbose: bool }, + /// Update a single GLAM package UpdatePackage { /// Name of the package to update (default is all packages) - #[clap(short, long)] package_name: String, }, @@ -66,18 +66,18 @@ fn main() { commands::initialize(&root); }, - Commands::InstallPackage {git_repo, commit} => { + Commands::InstallPackage {git_repo, commit, no_copy} => { let root = commands::search_project_root(); commands::check_ignores(&root); commands::initialize_glam_files(&root); - commands::install_package(&root, git_repo, commit, cli.verbose); + commands::install_package(&root, git_repo, commit, !*no_copy, cli.verbose); }, - Commands::Install { verbose } => { + Commands::Install { } => { let root = commands::search_project_root(); commands::check_ignores(&root); commands::initialize_glam_files(&root); - commands::install(&root, *verbose); + commands::install_all_packages(&root, cli.verbose); }, Commands::UpdatePackage { package_name } => { |