feat(git): started work on using spinners
Spinners are a blinking lights UX component. Ideally, a flag will be added to run silently. This only implements a sketch for using spinners when doing a quick sync. Signed-off-by: Christina Sørensen <christina@cafkafk.com>
This commit is contained in:
parent
58b9c50b83
commit
b6e04cf4a4
4 changed files with 92 additions and 17 deletions
67
Cargo.lock
generated
67
Cargo.lock
generated
|
@ -129,7 +129,7 @@ dependencies = [
|
||||||
"heck",
|
"heck",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn",
|
"syn 2.0.18",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -199,6 +199,7 @@ dependencies = [
|
||||||
"relative-path",
|
"relative-path",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_yaml",
|
"serde_yaml",
|
||||||
|
"spinners",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -276,6 +277,12 @@ version = "1.0.6"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6"
|
checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "lazy_static"
|
||||||
|
version = "1.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libc"
|
name = "libc"
|
||||||
version = "0.2.144"
|
version = "0.2.144"
|
||||||
|
@ -297,6 +304,12 @@ dependencies = [
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "maplit"
|
||||||
|
version = "1.0.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "memchr"
|
name = "memchr"
|
||||||
version = "2.5.0"
|
version = "2.5.0"
|
||||||
|
@ -386,6 +399,12 @@ dependencies = [
|
||||||
"windows-sys",
|
"windows-sys",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rustversion"
|
||||||
|
version = "1.0.12"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ryu"
|
name = "ryu"
|
||||||
version = "1.0.13"
|
version = "1.0.13"
|
||||||
|
@ -409,7 +428,7 @@ checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
"syn",
|
"syn 2.0.18",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -425,12 +444,56 @@ dependencies = [
|
||||||
"unsafe-libyaml",
|
"unsafe-libyaml",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "spinners"
|
||||||
|
version = "4.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "08615eea740067d9899969bc2891c68a19c315cb1f66640af9a9ecb91b13bcab"
|
||||||
|
dependencies = [
|
||||||
|
"lazy_static",
|
||||||
|
"maplit",
|
||||||
|
"strum",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "strsim"
|
name = "strsim"
|
||||||
version = "0.10.0"
|
version = "0.10.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
|
checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "strum"
|
||||||
|
version = "0.24.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f"
|
||||||
|
dependencies = [
|
||||||
|
"strum_macros",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "strum_macros"
|
||||||
|
version = "0.24.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59"
|
||||||
|
dependencies = [
|
||||||
|
"heck",
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"rustversion",
|
||||||
|
"syn 1.0.109",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "syn"
|
||||||
|
version = "1.0.109"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
|
||||||
|
dependencies = [
|
||||||
|
"proc-macro2",
|
||||||
|
"quote",
|
||||||
|
"unicode-ident",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syn"
|
name = "syn"
|
||||||
version = "2.0.18"
|
version = "2.0.18"
|
||||||
|
|
|
@ -16,6 +16,7 @@ log = "0.4"
|
||||||
#env_logger = "0.9"
|
#env_logger = "0.9"
|
||||||
pretty_env_logger = "0.4"
|
pretty_env_logger = "0.4"
|
||||||
relative-path = "1.8.0"
|
relative-path = "1.8.0"
|
||||||
|
spinners = "4.1.0"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
clap = { version = "4.3.2", features = ["derive", "cargo", "env", "help"] }
|
clap = { version = "4.3.2", features = ["derive", "cargo", "env", "help"] }
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
cargo rustc
|
# cargo rustc
|
||||||
cargo install --path .
|
cargo install --debug --path .
|
||||||
|
|
37
src/git.rs
37
src/git.rs
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
use log::{debug, error, info, trace, warn};
|
use log::{debug, error, info, trace, warn};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
use spinners::{Spinner, Spinners};
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::fs::canonicalize;
|
use std::fs::canonicalize;
|
||||||
use std::os::unix::fs::symlink;
|
use std::os::unix::fs::symlink;
|
||||||
|
@ -24,6 +25,9 @@ use std::{fs, process::Command};
|
||||||
|
|
||||||
// why not make it O(log n) instead of a vec that's /only/ O(n)
|
// why not make it O(log n) instead of a vec that's /only/ O(n)
|
||||||
// ...because premature optimization is the root of all evil!
|
// ...because premature optimization is the root of all evil!
|
||||||
|
//
|
||||||
|
// it's time
|
||||||
|
|
||||||
#[derive(PartialOrd, Ord, PartialEq, Eq, Serialize, Deserialize, Debug)]
|
#[derive(PartialOrd, Ord, PartialEq, Eq, Serialize, Deserialize, Debug)]
|
||||||
pub enum RepoFlags {
|
pub enum RepoFlags {
|
||||||
Push,
|
Push,
|
||||||
|
@ -41,6 +45,9 @@ pub struct Config {
|
||||||
pub links: Vec<Links>,
|
pub links: Vec<Links>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Represents a category of repositories
|
||||||
|
///
|
||||||
|
/// This allows you to organize your repositories into categories
|
||||||
#[derive(PartialEq, Debug, Serialize, Deserialize)]
|
#[derive(PartialEq, Debug, Serialize, Deserialize)]
|
||||||
pub struct Category {
|
pub struct Category {
|
||||||
pub flags: Vec<RepoFlags>, // FIXME: not implemented
|
pub flags: Vec<RepoFlags>, // FIXME: not implemented
|
||||||
|
@ -120,9 +127,9 @@ impl GitRepo {
|
||||||
.arg("clone")
|
.arg("clone")
|
||||||
.arg(&self.url)
|
.arg(&self.url)
|
||||||
.arg(&self.name)
|
.arg(&self.name)
|
||||||
.status()
|
.output()
|
||||||
.unwrap_or_else(|_| panic!("git repo failed to clone: {:?}", &self,));
|
.unwrap_or_else(|_| panic!("git repo failed to clone: {:?}", &self,));
|
||||||
info!("{out}");
|
// info!("{out}");
|
||||||
} else {
|
} else {
|
||||||
info!("{} has clone set to false, not cloned", &self.name);
|
info!("{} has clone set to false, not cloned", &self.name);
|
||||||
}
|
}
|
||||||
|
@ -132,9 +139,9 @@ impl GitRepo {
|
||||||
let out = Command::new("git")
|
let out = Command::new("git")
|
||||||
.current_dir(format!("{}{}", &self.path, &self.name))
|
.current_dir(format!("{}{}", &self.path, &self.name))
|
||||||
.arg("pull")
|
.arg("pull")
|
||||||
.status()
|
.output()
|
||||||
.unwrap_or_else(|_| panic!("git repo failed to pull: {:?}", &self,));
|
.unwrap_or_else(|_| panic!("git repo failed to pull: {:?}", &self,));
|
||||||
info!("{out}");
|
// info!("{out}");
|
||||||
}
|
}
|
||||||
/// Adds all files in the repository.
|
/// Adds all files in the repository.
|
||||||
fn add_all(&self) {
|
fn add_all(&self) {
|
||||||
|
@ -143,9 +150,9 @@ impl GitRepo {
|
||||||
.current_dir(format!("{}{}", &self.path, &self.name))
|
.current_dir(format!("{}{}", &self.path, &self.name))
|
||||||
.arg("add")
|
.arg("add")
|
||||||
.arg(".")
|
.arg(".")
|
||||||
.status()
|
.output()
|
||||||
.unwrap_or_else(|_| panic!("git repo failed to add: {:?}", &self,));
|
.unwrap_or_else(|_| panic!("git repo failed to add: {:?}", &self,));
|
||||||
info!("{out}");
|
// info!("{out}");
|
||||||
} else {
|
} else {
|
||||||
info!("{} has clone set to false, not cloned", &self.name);
|
info!("{} has clone set to false, not cloned", &self.name);
|
||||||
}
|
}
|
||||||
|
@ -157,9 +164,9 @@ impl GitRepo {
|
||||||
let out = Command::new("git")
|
let out = Command::new("git")
|
||||||
.current_dir(format!("{}{}", &self.path, &self.name))
|
.current_dir(format!("{}{}", &self.path, &self.name))
|
||||||
.arg("commit")
|
.arg("commit")
|
||||||
.status()
|
.output()
|
||||||
.unwrap_or_else(|_| panic!("git repo failed to commit: {:?}", &self,));
|
.unwrap_or_else(|_| panic!("git repo failed to commit: {:?}", &self,));
|
||||||
info!("{out}");
|
// info!("{out}");
|
||||||
} else {
|
} else {
|
||||||
info!("{} has clone set to false, not cloned", &self.name);
|
info!("{} has clone set to false, not cloned", &self.name);
|
||||||
}
|
}
|
||||||
|
@ -172,9 +179,9 @@ impl GitRepo {
|
||||||
.arg("commit")
|
.arg("commit")
|
||||||
.arg("-m")
|
.arg("-m")
|
||||||
.arg(msg)
|
.arg(msg)
|
||||||
.status()
|
.output()
|
||||||
.unwrap_or_else(|_| panic!("git repo failed to commit: {:?}", &self,));
|
.unwrap_or_else(|_| panic!("git repo failed to commit: {:?}", &self,));
|
||||||
info!("{out}");
|
// info!("{out}");
|
||||||
} else {
|
} else {
|
||||||
info!("{} has clone set to false, not cloned", &self.name);
|
info!("{} has clone set to false, not cloned", &self.name);
|
||||||
}
|
}
|
||||||
|
@ -185,9 +192,9 @@ impl GitRepo {
|
||||||
let out = Command::new("git")
|
let out = Command::new("git")
|
||||||
.current_dir(format!("{}{}", &self.path, &self.name))
|
.current_dir(format!("{}{}", &self.path, &self.name))
|
||||||
.arg("push")
|
.arg("push")
|
||||||
.status()
|
.output()
|
||||||
.unwrap_or_else(|_| panic!("git repo failed to push: {:?}", &self,));
|
.unwrap_or_else(|_| panic!("git repo failed to push: {:?}", &self,));
|
||||||
info!("{out}");
|
// info!("{out}");
|
||||||
} else {
|
} else {
|
||||||
info!("{} has clone set to false, not cloned", &self.name);
|
info!("{} has clone set to false, not cloned", &self.name);
|
||||||
}
|
}
|
||||||
|
@ -224,7 +231,6 @@ impl Config {
|
||||||
F: Fn(&GitRepo),
|
F: Fn(&GitRepo),
|
||||||
{
|
{
|
||||||
for (_, category) in self.categories.iter() {
|
for (_, category) in self.categories.iter() {
|
||||||
println!("{category:?}");
|
|
||||||
for (_, repo) in category.repos.iter() {
|
for (_, repo) in category.repos.iter() {
|
||||||
f(repo);
|
f(repo);
|
||||||
}
|
}
|
||||||
|
@ -270,10 +276,15 @@ impl Config {
|
||||||
pub fn quick(&self, msg: &String) {
|
pub fn quick(&self, msg: &String) {
|
||||||
debug!("exectuting quick");
|
debug!("exectuting quick");
|
||||||
self.on_all(|repo| {
|
self.on_all(|repo| {
|
||||||
|
let mut sp = Spinner::new(Spinners::Dots10, format!("{}: pull", repo.name).into());
|
||||||
repo.pull();
|
repo.pull();
|
||||||
|
sp = Spinner::new(Spinners::Dots10, format!("{}: add_all", repo.name).into());
|
||||||
repo.add_all();
|
repo.add_all();
|
||||||
|
sp = Spinner::new(Spinners::Dots10, format!("{}: commit", repo.name).into());
|
||||||
repo.commit_with_msg(msg);
|
repo.commit_with_msg(msg);
|
||||||
|
sp = Spinner::new(Spinners::Dots10, format!("{}: push", repo.name).into());
|
||||||
repo.push();
|
repo.push();
|
||||||
|
sp.stop_and_persist("✔", format!("{}: quick", repo.name).into());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue