From 4f67b5cd41abb231a234e7539ed402781f27915b Mon Sep 17 00:00:00 2001 From: Igor Gnatenko Date: Feb 09 2018 19:04:17 +0000 Subject: use worktree's rather than cloning whole repository Before: 16.69user 5.00system 0:21.16elapsed 102%CPU (0avgtext+0avgdata 240120maxresident)k 0inputs+59544outputs (0major+1461900minor)pagefaults 0swaps After: 14.16user 4.82system 0:19.04elapsed 99%CPU (0avgtext+0avgdata 42576maxresident)k 8inputs+8outputs (0major+1369338minor)pagefaults 0swaps Signed-off-by: Igor Gnatenko --- diff --git a/src/main.rs b/src/main.rs index 8373cfc..a9c6a1f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -29,9 +29,6 @@ fn run(opt: &Opt) -> Result<(), Error> { walker.set_sorting(git2::SORT_TOPOLOGICAL); walker.push_head()?; - let dir = TempDir::new("git-rpm-changelog")?; - let srepo = Repository::clone(repo.path().to_str().unwrap(), &dir)?; - let workdir = srepo.workdir().unwrap(); let spec = format!( "{}.spec", repo.workdir() @@ -45,10 +42,17 @@ fn run(opt: &Opt) -> Result<(), Error> { let oid = id?; let commit = repo.find_commit(oid).unwrap(); - srepo.set_head_detached(oid)?; - srepo.checkout_head(Some(&mut git2::build::CheckoutBuilder::new() - .force() - .remove_untracked(true)))?; + let worktree = TempDir::new("git-rpm-changelog")?; + let workrepo = Repository::open(&opt.path)?; + workrepo.set_workdir(worktree.path(), false)?; + let object = workrepo.find_object(oid, Some(git2::ObjectType::Commit))?; + workrepo.checkout_tree( + &object, + Some(&mut git2::build::CheckoutBuilder::new() + .force() + .update_index(false)), + )?; + let workdir = workrepo.workdir().unwrap(); let author = commit.author(); let atime = author.when(); @@ -83,7 +87,6 @@ fn run(opt: &Opt) -> Result<(), Error> { println!("{}\n{}\n", chlog_header, chlog_entry); } - dir.close()?; Ok(()) }