| 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()); |
| } |