Implement fetch command
This commit is contained in:
parent
50ade80ab9
commit
9da42c44c3
43
src/lib.rs
43
src/lib.rs
|
@ -2,6 +2,8 @@ pub mod config;
|
|||
use config::{Config, Repository};
|
||||
use std::env;
|
||||
use std::error::Error;
|
||||
use std::fs;
|
||||
use std::process::Command;
|
||||
|
||||
#[derive(Debug)]
|
||||
/// Holds the current state of the application.
|
||||
|
@ -35,6 +37,9 @@ impl State {
|
|||
/// - `--long-flag` type arguments
|
||||
/// - `-mcsf` multi character short flag type arguments
|
||||
/// - `command` type arguments
|
||||
///
|
||||
/// The command argument is deterministic in the sense that it doesn't change once it's set. If
|
||||
/// no command has been given by the end of the parsing loop, it defaults to the help command
|
||||
pub fn new(mut args: std::env::Args) -> State {
|
||||
let mut state = State {
|
||||
cmd: None,
|
||||
|
@ -124,6 +129,9 @@ impl State {
|
|||
}
|
||||
|
||||
#[allow(unreachable_patterns)]
|
||||
/// This is the main run function for the program.
|
||||
///
|
||||
/// It starts by interpreting the state of the program as set by the argument parsing.
|
||||
pub fn run(state: State, mut config: Config) -> Result<(), Box<dyn Error>> {
|
||||
match state.cmd {
|
||||
Some(Cmd::Help) => {
|
||||
|
@ -166,6 +174,9 @@ pub fn run(state: State, mut config: Config) -> Result<(), Box<dyn Error>> {
|
|||
println!("{:width$} {}", repo.name, repo.url, width = width);
|
||||
}
|
||||
}
|
||||
Some(Cmd::Fetch) => {
|
||||
fetch_repos(config);
|
||||
}
|
||||
Some(x) => {
|
||||
println!("{:?} hasn't been implemented yet!", x)
|
||||
}
|
||||
|
@ -174,6 +185,38 @@ pub fn run(state: State, mut config: Config) -> Result<(), Box<dyn Error>> {
|
|||
Ok(())
|
||||
}
|
||||
|
||||
fn fetch_repos(config: Config) {
|
||||
// Make sure sources directory exists
|
||||
match fs::create_dir_all(&config.source_dir) {
|
||||
Err(e) => eprintln!("{}", e),
|
||||
_ => {}
|
||||
}
|
||||
|
||||
// Loop through the repositories
|
||||
for repo in config.repositories.iter() {
|
||||
// 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() {
|
||||
println!("=== FETCHING {} ===", repo.name);
|
||||
Command::new("git")
|
||||
.args([
|
||||
"-C",
|
||||
&format!("{}/{}", config.source_dir, repo.name),
|
||||
"fetch",
|
||||
"--all",
|
||||
])
|
||||
.status()
|
||||
.unwrap();
|
||||
} else {
|
||||
println!("=== {} doesn't exist locally ===", repo.name);
|
||||
println!("=== CLONING {} ===", repo.name);
|
||||
Command::new("git")
|
||||
.args(["-C", &config.source_dir, "clone", &repo.url, &repo.name])
|
||||
.status()
|
||||
.unwrap();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn help_msg() -> String {
|
||||
format!(
|
||||
"Git repository manager
|
||||
|
|
Loading…
Reference in New Issue