diff --git a/CHANGELOG.md b/CHANGELOG.md index b4b2176..ed1bc9e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,30 @@ All notable changes to this project will be documented in this file. +## [0.1.2] - 2023-07-03 + +### Features + +- Implemented quiet flag + +## [0.1.1] - 2023-07-03 + +### Bug Fixes + +- Fixed help formatting + +### Documentation + +- Added asciinema demo + +### Features + +- Added no-emoji flag + +### Miscellaneous Tasks + +- Bump to v0.1.1 + ## [0.1.0] - 2023-07-03 ### Documentation @@ -16,6 +40,10 @@ All notable changes to this project will be documented in this file. - Made SUCCESS/FAILURE emoji const - Added flag no-emoji +### Miscellaneous Tasks + +- Bump v0.1.0, housekeeping + ### Refactor - Made code more idiomatic diff --git a/Cargo.lock b/Cargo.lock index 6dd9650..9415f31 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -179,7 +179,7 @@ dependencies = [ [[package]] name = "gg" -version = "0.1.0" +version = "0.1.2" dependencies = [ "clap", "clap_mangen", diff --git a/Cargo.toml b/Cargo.toml index 10a1fc3..2af5769 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "gg" -version = "0.1.0" +version = "0.1.2" edition = "2021" authors = ["Christina Sørensen"] repository = "https://github.com/cafkafk/gg" diff --git a/README.org b/README.org index 1a922e0..b8a8bcd 100644 --- a/README.org +++ b/README.org @@ -7,6 +7,8 @@ with "dotfiles", and with git support as a first class feature. Configuration is done throug a single yaml file, giving it a paradigm that should bring joy to those that use declarative operating systems and package managers. +#+HTML: + Although this isn't really a case where it matters *that* much for performance, being written in rust instead of e.g. /janky/ scripting languages does also mean it is snappy and reliable, and the /extensive/ (hardly, but eventually) testing diff --git a/doc/roadmap.org b/doc/roadmap.org index 8ebeb22..194466f 100644 --- a/doc/roadmap.org +++ b/doc/roadmap.org @@ -3,9 +3,9 @@ * 0.2.0 (maybe) - [ ] Links in categories? * 0.1.2 -- [ ] Implement Quiet flag +- [X] Implement Quiet flag * 0.1.1 -- [ ] Implement no-emoji flag +- [X] Implement no-emoji flag * 0.1.0 [100%] [5/5] - [X] No functionality regressions - [X] commit works in quick, fast diff --git a/src/cli.rs b/src/cli.rs index 29d0183..8c9ed78 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -24,13 +24,14 @@ use clap::{ArgAction, CommandFactory, Parser, Subcommand}; const CONFIG_FILE: &str = "/.config/gg/config.yaml"; const HELP_TEMPLATE: &str = "\ - {before-help}{name} {version} - {author-with-newline}{about-with-newline} - {usage-heading} {usage} +{before-help}{name} {version} +{about-with-newline} - {all-args}{after-help} +{usage-heading} {usage} - "; +{all-args}{after-help} + +"; //#[clap(author, version, about, long_about = None)] #[derive(Parser, Debug)] diff --git a/src/git.rs b/src/git.rs index e495b4e..8734bc3 100644 --- a/src/git.rs +++ b/src/git.rs @@ -25,7 +25,8 @@ use std::os::unix::fs::symlink; use std::path::Path; use std::{fs, process::Command}; -use crate::utils::strings::{FAILURE_EMOJI, SUCCESS_EMOJI}; +use crate::settings; +use crate::utils::strings::{failure_str, success_str}; /// An enum containing flags that change behaviour of repos and categories #[derive(PartialOrd, Ord, PartialEq, Eq, Serialize, Deserialize, Debug)] @@ -349,11 +350,15 @@ impl Config { { for category in self.categories.values() { for (_, repo) in category.repos.as_ref().expect("failed to get repos").iter() { - let mut sp = Spinner::new(Spinners::Dots10, format!("{}: {}", repo.name, op)); - if f(repo) { - sp.stop_and_persist(SUCCESS_EMOJI, format!("{}: {}", repo.name, op)); + if !settings::QUIET.load(std::sync::atomic::Ordering::Relaxed) { + let mut sp = Spinner::new(Spinners::Dots10, format!("{}: {}", repo.name, op)); + if f(repo) { + sp.stop_and_persist(success_str(), format!("{}: {}", repo.name, op)); + } else { + sp.stop_and_persist(failure_str(), format!("{}: {}", repo.name, op)); + } } else { - sp.stop_and_persist(FAILURE_EMOJI, format!("{}: {}", repo.name, op)); + f(repo); } } } @@ -405,12 +410,17 @@ impl Config { for instruction in &closures { let f = &instruction.closure; let op = instruction.operation; - let mut sp = Spinner::new(Spinners::Dots10, format!("{}: {}", repo.name, op)); - if f(repo) { - sp.stop_and_persist(SUCCESS_EMOJI, format!("{}: {}", repo.name, op)); + if !settings::QUIET.load(std::sync::atomic::Ordering::Relaxed) { + let mut sp = + Spinner::new(Spinners::Dots10, format!("{}: {}", repo.name, op)); + if f(repo) { + sp.stop_and_persist(success_str(), format!("{}: {}", repo.name, op)); + } else { + sp.stop_and_persist(failure_str(), format!("{}: {}", repo.name, op)); + break; + } } else { - sp.stop_and_persist(FAILURE_EMOJI, format!("{}: {}", repo.name, op)); - break; + f(repo); } } } @@ -451,11 +461,16 @@ impl Config { for instruction in &closures { let f = &instruction.closure; let op = instruction.operation; - let mut sp = Spinner::new(Spinners::Dots10, format!("{}: {}", repo.name, op)); - if f(repo) { - sp.stop_and_persist(SUCCESS_EMOJI, format!("{}: {}", repo.name, op)); + if !settings::QUIET.load(std::sync::atomic::Ordering::Relaxed) { + let mut sp = + Spinner::new(Spinners::Dots10, format!("{}: {}", repo.name, op)); + if f(repo) { + sp.stop_and_persist(success_str(), format!("{}: {}", repo.name, op)); + } else { + sp.stop_and_persist(failure_str(), format!("{}: {}", repo.name, op)); + } } else { - sp.stop_and_persist(FAILURE_EMOJI, format!("{}: {}", repo.name, op)); + f(repo); } } } diff --git a/src/main.rs b/src/main.rs index d97985b..1503283 100644 --- a/src/main.rs +++ b/src/main.rs @@ -39,6 +39,8 @@ mod cli; #[allow(unused)] mod git; #[allow(unused)] +mod settings; +#[allow(unused)] mod utils; use cli::{Args, Commands}; @@ -50,6 +52,8 @@ use clap::Parser; #[allow(unused)] use log::{debug, error, info, trace, warn}; +use std::sync::atomic::Ordering; + /// The main loop of the binary /// /// Here, we handle parsing the configuration file, as well as matching commands @@ -62,7 +66,8 @@ fn main() { args if args.license => println!("{}", utils::strings::INTERACTIVE_LICENSE), args if args.warranty => println!("{}", utils::strings::INTERACTIVE_WARRANTY), args if args.code_of_conduct => println!("{}", utils::strings::INTERACTIVE_COC), - args if args.quiet => todo!(), + args if args.quiet => settings::QUIET.store(true, Ordering::Relaxed), + args if args.no_emoji => settings::EMOJIS.store(true, Ordering::Relaxed), _ => (), } match &mut args.command { diff --git a/src/settings.rs b/src/settings.rs new file mode 100644 index 0000000..fda53d7 --- /dev/null +++ b/src/settings.rs @@ -0,0 +1,5 @@ +use std::sync::atomic::AtomicBool; + +pub static QUIET: AtomicBool = AtomicBool::new(false); + +pub static EMOJIS: AtomicBool = AtomicBool::new(false); diff --git a/src/test/test.yaml b/src/test/test.yaml index e433730..56c844b 100644 --- a/src/test/test.yaml +++ b/src/test/test.yaml @@ -1,32 +1,4 @@ categories: - utils: - repos: - li: - name: li - path: /home/ces/org/src/git/ - url: git@github.com:cafkafk/li.git - flags: - - Clone - - Push - gg: - name: gg - path: /home/ces/.dots/ - url: git@github.com:cafkafk/gg.git - flags: - - Clone - - Push - empty: {} - stuff: - flags: [] - repos: - li: - name: li - path: /home/ces/org/src/git/ - url: git@github.com:cafkafk/li.git - gg: - name: gg - path: /home/ces/.dots/ - url: git@github.com:cafkafk/gg.git config: flags: [] repos: @@ -44,6 +16,34 @@ categories: flags: - Clone - Push + stuff: + flags: [] + repos: + li: + name: li + path: /home/ces/org/src/git/ + url: git@github.com:cafkafk/li.git + gg: + name: gg + path: /home/ces/.dots/ + url: git@github.com:cafkafk/gg.git + utils: + repos: + gg: + name: gg + path: /home/ces/.dots/ + url: git@github.com:cafkafk/gg.git + flags: + - Clone + - Push + li: + name: li + path: /home/ces/org/src/git/ + url: git@github.com:cafkafk/li.git + flags: + - Clone + - Push + empty: {} links: - name: gg rx: /home/ces/.config/gg diff --git a/src/utils/strings.rs b/src/utils/strings.rs index 876b80d..b11eebc 100644 --- a/src/utils/strings.rs +++ b/src/utils/strings.rs @@ -19,14 +19,18 @@ //! Ideally, at a VERY long term scale, this should be a nice pattern for //! possible translations. +use std::sync::atomic::Ordering; + +use crate::settings; + /// Contains the notice for interactive programs from the GPLv3's "How to Apply /// These Terms to Your New Programs" pub const INTERACTIVE_NOTICE: &str = "\ -gg Copyright (C) 2023 Christina Sørensen -This program comes with ABSOLUTELY NO WARRANTY; for details type `gg --warranty'. -This is free software, and you are welcome to redistribute it -under certain conditions; type `gg --license' for details. -"; +gg Copyright (C) 2023 Christina Sørensen + +This program comes with ABSOLUTELY NO WARRANTY; for details type `gg +--warranty'. This is free software, and you are welcome to redistribute it under +certain conditions; type `gg --license' for details. "; /// Contains the license part of the long notice for interactive programs from /// the GPLv3's "How to Apply These Terms to Your New Programs" @@ -65,3 +69,25 @@ pub const SUCCESS_EMOJI: &str = "✔"; /// Failure emoji pub const FAILURE_EMOJI: &str = "❌"; + +/// Success string +pub const SUCCESS_STRING: &str = "SUCC"; + +/// Failure string +pub const FAILURE_STRING: &str = "FAIL"; + +pub fn success_str() -> &'static str { + if !settings::EMOJIS.load(Ordering::Relaxed) { + SUCCESS_EMOJI + } else { + SUCCESS_STRING + } +} + +pub fn failure_str() -> &'static str { + if !settings::EMOJIS.load(Ordering::Relaxed) { + FAILURE_EMOJI + } else { + FAILURE_STRING + } +}