Add category feature
This commit is contained in:
parent
789b5fb6b9
commit
d1592e83a5
|
@ -18,13 +18,15 @@ pub struct Config {
|
|||
pub struct Repository {
|
||||
pub name: String,
|
||||
pub url: String,
|
||||
pub category: Option<String>,
|
||||
}
|
||||
|
||||
impl Repository {
|
||||
pub fn new(name: String, url: String) -> Repository {
|
||||
pub fn new(name: String, url: String, category: Option<String>) -> Repository {
|
||||
Repository {
|
||||
name,
|
||||
url,
|
||||
category,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
72
src/lib.rs
72
src/lib.rs
|
@ -14,6 +14,7 @@ pub struct State {
|
|||
cmd: Option<Cmd>,
|
||||
url: Option<String>,
|
||||
name: Option<String>,
|
||||
category: Option<String>,
|
||||
pub config: String,
|
||||
}
|
||||
|
||||
|
@ -45,6 +46,7 @@ impl State {
|
|||
cmd: None,
|
||||
url: None,
|
||||
name: None,
|
||||
category: None,
|
||||
config: format!("{}/.config/shepherd/config.toml", env::var("HOME").unwrap()),
|
||||
};
|
||||
|
||||
|
@ -79,7 +81,19 @@ impl State {
|
|||
} else if let None = state.cmd {
|
||||
// add command
|
||||
if x == "add" {
|
||||
let name = args.next();
|
||||
let next = args.next();
|
||||
let name: Option<String>;
|
||||
match next {
|
||||
Some(ref x) => match &x[..] {
|
||||
"--category" => {
|
||||
state.category = args.next();
|
||||
name = args.next();
|
||||
}
|
||||
_ => name = next,
|
||||
},
|
||||
None => name = None,
|
||||
}
|
||||
eprintln!("Category: {:?}", name);
|
||||
match name {
|
||||
Some(x) => {
|
||||
state.name = Some(x);
|
||||
|
@ -150,6 +164,10 @@ pub fn run(state: State, mut config: Config) -> Result<(), Box<dyn Error>> {
|
|||
Some(x) => x,
|
||||
_ => String::new(),
|
||||
},
|
||||
match state.category {
|
||||
Some(x) => Some(x),
|
||||
_ => None,
|
||||
},
|
||||
);
|
||||
if let None = config.repositories.iter().find(|x| **x == repo) {
|
||||
config.repositories.push(repo);
|
||||
|
@ -161,7 +179,7 @@ pub fn run(state: State, mut config: Config) -> Result<(), Box<dyn Error>> {
|
|||
}
|
||||
Some(Cmd::List) => {
|
||||
// Get the largest entry by name
|
||||
let width: usize = match config
|
||||
let name_width: usize = match config
|
||||
.repositories
|
||||
.iter()
|
||||
.max_by(|x, y| x.name.len().cmp(&y.name.len()))
|
||||
|
@ -169,9 +187,33 @@ pub fn run(state: State, mut config: Config) -> Result<(), Box<dyn Error>> {
|
|||
Some(x) => x.name.len(),
|
||||
None => 0,
|
||||
};
|
||||
println!("{:width$} URL", "Name", width = width);
|
||||
let url_width: usize = match config
|
||||
.repositories
|
||||
.iter()
|
||||
.max_by(|x, y| x.url.len().cmp(&y.url.len()))
|
||||
{
|
||||
Some(x) => x.url.len(),
|
||||
None => 0,
|
||||
};
|
||||
println!(
|
||||
"{:name$} {:url$} Category",
|
||||
"Name",
|
||||
"URL",
|
||||
name = name_width,
|
||||
url = url_width
|
||||
);
|
||||
for repo in config.repositories.iter() {
|
||||
println!("{:width$} {}", repo.name, repo.url, width = width);
|
||||
println!(
|
||||
"{name:name_w$} {url:url_w$} {cat}",
|
||||
name = repo.name,
|
||||
name_w = name_width,
|
||||
url = repo.url,
|
||||
url_w = url_width,
|
||||
cat = match &repo.category {
|
||||
Some(x) => x,
|
||||
None => "",
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
Some(Cmd::Fetch) => {
|
||||
|
@ -194,23 +236,29 @@ fn fetch_repos(config: Config) {
|
|||
|
||||
// Loop through the repositories
|
||||
for repo in config.repositories.iter() {
|
||||
// Get the full path to the repository
|
||||
let path: String = match &repo.category {
|
||||
Some(x) => format!("{}/{}/", config.source_dir, x),
|
||||
None => config.source_dir.clone(),
|
||||
};
|
||||
let fullpath: String = format!("{}/{}", path, repo.name);
|
||||
// Check to see if the folder is already cloned, if so, just fetch
|
||||
if std::path::Path::new(&format!("{}/{}", config.source_dir, repo.name)).is_dir() {
|
||||
if std::path::Path::new(&fullpath).is_dir() {
|
||||
println!("=== FETCHING {} ===", repo.name);
|
||||
Command::new("git")
|
||||
.args([
|
||||
"-C",
|
||||
&format!("{}/{}", config.source_dir, repo.name),
|
||||
"fetch",
|
||||
"--all",
|
||||
])
|
||||
.args(["-C", &fullpath, "fetch", "--all"])
|
||||
.status()
|
||||
.unwrap();
|
||||
} else {
|
||||
println!("=== {} doesn't exist locally ===", repo.name);
|
||||
println!("=== CLONING {} ===", repo.name);
|
||||
match fs::create_dir_all(&path) {
|
||||
Err(e) => eprintln!("{}", e),
|
||||
_ => {}
|
||||
}
|
||||
println!("{}", path);
|
||||
Command::new("git")
|
||||
.args(["-C", &config.source_dir, "clone", &repo.url, &repo.name])
|
||||
.args(["-C", &path, "clone", &repo.url, &repo.name])
|
||||
.status()
|
||||
.unwrap();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue