use std::env;
use clap::Parser;
use cli::CliArgs;
use log::{error, info};
use tokio::{process::Command, time::sleep};
use walkdir::WalkDir;
mod cli;
mod error;
#[tokio::main]
async fn main() {
env::set_var("RUST_LOG", "info");
env_logger::init();
loop {
do_sync_task(CliArgs::parse()).await
}
}
async fn do_sync_task(args: CliArgs) {
info!("Performing sync task.");
for dir in WalkDir::new(args.directory)
.max_depth(3)
.into_iter()
.filter_map(|err| err.ok())
{
let refs_tag = Command::new("git")
.arg("--git-dir")
.arg(dir.clone().into_path())
.arg("config")
.arg("--get")
.arg("remote.origin.fetch")
.output()
.await
.expect("Failed to retrieve upstream URL")
.stdout;
if !refs_tag.is_empty() {
let status = Command::new("git")
.arg("--git-dir")
.arg(dir.clone().into_path())
.arg("fetch")
.arg("--all")
.status()
.await
.expect("Unable to fetch repository");
if !status.success() {
error!("Failed to update repository {:?}", dir.path())
}
}
}
info!("Sleeping until the next refresh.");
sleep(args.refresh_time.into()).await;
}