auths-infra-git 0.1.2

Git client adapter for Auths - enables communication with Auths services over Git
Documentation
use auths_infra_git::audit::Git2LogProvider;
use auths_sdk::ports::git::{CommitRecord, SignatureStatus};
use auths_sdk::testing::fakes::FakeGitLogProvider;

fn make_test_commit(hash: &str) -> CommitRecord {
    CommitRecord {
        hash: hash.to_string(),
        author_name: "Test Author".to_string(),
        author_email: "test@example.com".to_string(),
        timestamp: "2024-01-15T10:00:00+00:00".to_string(),
        message: "test commit".to_string(),
        signature_status: SignatureStatus::Unsigned,
    }
}

fn create_commit(repo: &git2::Repository, message: &str) {
    let sig = repo.signature().unwrap();
    let tree_builder = repo.treebuilder(None).unwrap();
    let tree_oid = tree_builder.write().unwrap();
    let tree = repo.find_tree(tree_oid).unwrap();

    let parents: Vec<git2::Commit<'_>> = match repo.head() {
        Ok(head) => {
            let oid = head.target().unwrap();
            vec![repo.find_commit(oid).unwrap()]
        }
        Err(_) => vec![],
    };
    let parent_refs: Vec<&git2::Commit<'_>> = parents.iter().collect();
    repo.commit(Some("HEAD"), &sig, &sig, message, &tree, &parent_refs)
        .unwrap();
}

auths_sdk::git_log_provider_contract_tests!(
    fake,
    {
        let commits = vec![
            make_test_commit("abc1"),
            make_test_commit("def2"),
            make_test_commit("ghi3"),
        ];
        (FakeGitLogProvider::with_commits(commits), ())
    },
    3,
);

auths_sdk::git_log_provider_contract_tests!(
    git2_provider,
    {
        let (dir, repo) = auths_test_utils::git::init_test_repo();
        create_commit(&repo, "first");
        create_commit(&repo, "second");
        create_commit(&repo, "third");
        let provider = Git2LogProvider::open(dir.path()).unwrap();
        (provider, dir)
    },
    3,
);