use civet::{Config, Server}; use conduit_git_http_backend as git_backend; use std::fs::File; use std::path::Path; use tempfile::TempDir; const PORT: u16 = 7848; fn main() { unsafe { git2_curl::register(curl::easy::Easy::new()); } // Spin up a server for git-http-backend let td = TempDir::new().unwrap(); let mut cfg = Config::new(); cfg.port(PORT).threads(1); let _a = Server::start(cfg, git_backend::Serve(td.path().to_path_buf())); // Prep a repo with one file called `foo` let sig = git2::Signature::now("foo", "bar").unwrap(); let r1 = git2::Repository::init(td.path()).unwrap(); File::create(&td.path().join(".git").join("git-daemon-export-ok")).unwrap(); { let mut index = r1.index().unwrap(); File::create(&td.path().join("foo")).unwrap(); index.add_path(Path::new("foo")).unwrap(); index.write().unwrap(); let tree_id = index.write_tree().unwrap(); r1.commit( Some("HEAD"), &sig, &sig, "test", &r1.find_tree(tree_id).unwrap(), &[], ) .unwrap(); } // Clone through the git-http-backend let td2 = TempDir::new().unwrap(); let r = git2::Repository::clone(&format!("http://localhost:{}", PORT), td2.path()).unwrap(); assert!(File::open(&td2.path().join("foo")).is_ok()); { File::create(&td.path().join("bar")).unwrap(); let mut index = r1.index().unwrap(); index.add_path(&Path::new("bar")).unwrap(); index.write().unwrap(); let tree_id = index.write_tree().unwrap(); let parent = r1.head().ok().and_then(|h| h.target()).unwrap(); let parent = r1.find_commit(parent).unwrap(); r1.commit( Some("HEAD"), &sig, &sig, "test", &r1.find_tree(tree_id).unwrap(), &[&parent], ) .unwrap(); } let mut remote = r.find_remote("origin").unwrap(); remote .fetch(&["refs/heads/*:refs/heads/*"], None, None) .unwrap(); let b = r.find_branch("master", git2::BranchType::Local).unwrap(); let id = b.get().target().unwrap(); let obj = r.find_object(id, None).unwrap(); r.reset(&obj, git2::ResetType::Hard, None).unwrap(); assert!(File::open(&td2.path().join("bar")).is_ok()); }