diff --git a/src/main.rs b/src/main.rs index 7a8899d..087a699 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,30 +1,52 @@ -extern crate git2; extern crate dirs; +extern crate git2; use git2::Repository; +//use git2::build::CheckoutBuilder; use std::path::PathBuf; fn config_path() -> PathBuf { let mut config_dir = dirs::config_dir().expect("cannot open config dir"); config_dir.push("gitmoji-rust"); - return config_dir; + config_dir } fn gitmoji_path() -> PathBuf { let mut path = config_path(); path.push("gitmoji"); - return path; + path +} + +fn update_emojis(url: &str, repo_dir: &PathBuf) -> Result<(), git2::Error> { + let repo = match Repository::open(&repo_dir) { + Ok(r) => r, + Err(_) => Repository::clone(url, &repo_dir)? + }; + + let mut origin = repo.find_remote("origin")?; + origin.fetch(&["master"], None, None)?; + /* + origin.update_tips(None, true, git2::AutotagOption::Unspecified, None)?; + let c = repo.find_branch("origin/master", git2::BranchType::Remote)?.get().peel_to_commit()?; + + repo.checkout_tree(c.as_object(), Some(CheckoutBuilder::new().force()))?; + repo.set_head("FETCH_HEAD")?; + */ + let b = repo.find_branch("origin/master", git2::BranchType::Remote)?.get(); + let c = repo.reference_to_annotated_commit(&b)?; + repo.merge(&[&c], None, None)?; + let s = git2::Signature::now("a", "a@a.com"); + repo.commit(Some("HEAD"), &s, &s, "merge", ); + repo.cleanup_state()?; + + Ok(()) } fn main() { let url = "https://github.com/carloscuesta/gitmoji/"; - let repo_dir = gitmoji_path(); - let repo = match Repository::open(&repo_dir) { - Ok(r) => Ok(r), - Err(_) => Repository::clone(url, &repo_dir), //TODO check error kind - }; - repo.expect(&format!("error opening repository {}", repo_dir.to_str().expect("path error"))); + + update_emojis(url, &repo_dir).unwrap(); }