void cl_repo_commit_from_index( git_oid *out, git_repository *repo, git_signature *sig, git_time_t time, const char *msg) { git_index *index; git_oid commit_id, tree_id; git_object *parent = NULL; git_reference *ref = NULL; git_tree *tree = NULL; char buf[128]; int free_sig = (sig == NULL); /* it is fine if looking up HEAD fails - we make this the first commit */ git_revparse_ext(&parent, &ref, repo, "HEAD"); /* write the index content as a tree */ cl_git_pass(git_repository_index(&index, repo)); cl_git_pass(git_index_write_tree(&tree_id, index)); cl_git_pass(git_index_write(index)); git_index_free(index); cl_git_pass(git_tree_lookup(&tree, repo, &tree_id)); if (sig) cl_assert(sig->name && sig->email); else if (!time) cl_git_pass(git_signature_now(&sig, CL_COMMIT_NAME, CL_COMMIT_EMAIL)); else cl_git_pass(git_signature_new( &sig, CL_COMMIT_NAME, CL_COMMIT_EMAIL, time, 0)); if (!msg) { strcpy(buf, CL_COMMIT_MSG); git_oid_tostr(buf + strlen(CL_COMMIT_MSG), sizeof(buf) - strlen(CL_COMMIT_MSG), &tree_id); msg = buf; } cl_git_pass(git_commit_create_v( &commit_id, repo, ref ? git_reference_name(ref) : "HEAD", sig, sig, NULL, msg, tree, parent ? 1 : 0, parent)); if (out) git_oid_cpy(out, &commit_id); git_object_free(parent); git_reference_free(ref); if (free_sig) git_signature_free(sig); git_tree_free(tree); }
void test_index_read_index__initialize(void) { git_object *head; git_reference *head_ref; _repo = cl_git_sandbox_init("testrepo"); cl_git_pass(git_revparse_ext(&head, &head_ref, _repo, "HEAD")); cl_git_pass(git_reset(_repo, head, GIT_RESET_HARD, NULL)); cl_git_pass(git_repository_index(&_index, _repo)); git_reference_free(head_ref); git_object_free(head); }
int git_revparse_single(git_object **out, git_repository *repo, const char *spec) { int error; git_object *obj = NULL; git_reference *ref = NULL; *out = NULL; if ((error = git_revparse_ext(&obj, &ref, repo, spec)) < 0) goto cleanup; git_reference_free(ref); *out = obj; return 0; cleanup: git_object_free(obj); git_reference_free(ref); return error; }