diff --git a/src/main.rs b/src/main.rs index fd33032..5e29c93 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,10 @@ -use git2::Repository; +use git2::{Cred, RemoteCallbacks, Repository}; use serde::{Deserialize, Serialize}; -use std::{collections::HashMap, fs, path::Path}; +use std::{ + collections::HashMap, + fs, + path::{Path, PathBuf}, +}; use walkdir::WalkDir; #[derive(Debug, Serialize, Deserialize)] @@ -73,6 +77,40 @@ fn freeze_repos(dir: String) -> anyhow::Result<()> { Ok(()) } -fn thaw_repos(_dir: String) -> anyhow::Result<()> { +fn thaw_repos(dir: String) -> anyhow::Result<()> { + let lockfile = fs::read_to_string("gitice.lock").expect("unable to read lockfile!"); + let repos: HashMap = toml::from_str(&lockfile)?; + + let mut callbacks = RemoteCallbacks::new(); + callbacks.credentials(|_url, username_from_url, _allowed_types| { + Cred::ssh_key( + username_from_url.unwrap(), + None, + Path::new(&format!( + "{}/.ssh/id_rsa", + std::env::var("HOME").expect("unable to find homedir!") + )), + // TODO: implement for keys that require a passphrase + None, + ) + }); + + let mut fo = git2::FetchOptions::new(); + fo.remote_callbacks(callbacks); + + let mut builder = git2::build::RepoBuilder::new(); + builder.fetch_options(fo); + + for (name, repo) in repos { + match builder.clone(&repo.remote_url, PathBuf::from(&dir).join(&name).as_path()) { + Ok(_) => { + println!("Thawed {}", name); + } + Err(e) => { + println!("Error thawing {}: {}. Continuing...", name, e); + } + }; + } + Ok(()) -} \ No newline at end of file +}