use git2::{Repository, RepositoryInitOptions};
use tempfile::TempDir;
pub fn repo_init() -> (TempDir, Repository) {
let td = TempDir::new().unwrap();
let mut opts = RepositoryInitOptions::new();
opts.initial_head("main");
let repo = Repository::init_opts(td.path(), &opts).unwrap();
{
let mut config = repo.config().unwrap();
config.set_str("user.name", "name").unwrap();
config.set_str("user.email", "email").unwrap();
let mut index = repo.index().unwrap();
let id = index.write_tree().unwrap();
let tree = repo.find_tree(id).unwrap();
let sig = repo.signature().unwrap();
repo.commit(Some("HEAD"), &sig, &sig, "initial", &tree, &[])
.unwrap();
}
(td, repo)
}
pub fn create_commit(repo: &git2::Repository, path: &str, data: &[u8], message: &str) -> git2::Oid {
let sig = git2::Signature::now("Bob Villa", "bob@example.com").unwrap();
let blob_oid = repo.blob(data).unwrap();
let mut treebuilder = repo.treebuilder(Option::None).unwrap();
let file_mode: i32 = i32::from(git2::FileMode::Blob);
treebuilder.insert(path, blob_oid, file_mode).unwrap();
let tree_oid = treebuilder.write().unwrap();
let tree = repo.find_tree(tree_oid).unwrap();
let parent_oid = repo.head().unwrap().target().unwrap();
let parent_commit = repo.find_commit(parent_oid).unwrap();
repo.commit(
Option::Some("HEAD"),
&sig,
&sig,
message,
&tree,
&[&parent_commit],
)
.unwrap()
}