Commit cc3b82e3 by Vicent Martí

Merge pull request #151 from carlosmn/root-commit.

Support root commits
parents fde97669 79b61557
...@@ -224,9 +224,18 @@ int git_commit_create( ...@@ -224,9 +224,18 @@ int git_commit_create(
if (error < GIT_SUCCESS) if (error < GIT_SUCCESS)
return error; return error;
if (git_reference_type(head) == GIT_REF_SYMBOLIC) { error = git_reference_resolve(&head, head);
if ((error = git_reference_resolve(&head, head)) < GIT_SUCCESS) if (error < GIT_SUCCESS) {
if (error != GIT_ENOTFOUND)
return error; return error;
/*
* The target of the reference was not found. This can happen
* just after a repository has been initialized (the master
* branch doesn't exist yet, as it doesn't have anything to
* point to) or after an orphan checkout, so if the target
* branch doesn't exist yet, create it and return.
*/
return git_reference_create_oid_f(&head, repo, git_reference_target(head), oid);
} }
error = git_reference_set_oid(head, oid); error = git_reference_set_oid(head, oid);
......
...@@ -1482,8 +1482,9 @@ int git_reference_resolve(git_reference **resolved_ref, git_reference *ref) ...@@ -1482,8 +1482,9 @@ int git_reference_resolve(git_reference **resolved_ref, git_reference *ref)
for (i = 0; i < MAX_NESTING_LEVEL; ++i) { for (i = 0; i < MAX_NESTING_LEVEL; ++i) {
reference_symbolic *ref_sym; reference_symbolic *ref_sym;
*resolved_ref = ref;
if (ref->type & GIT_REF_OID) { if (ref->type & GIT_REF_OID) {
*resolved_ref = ref;
return GIT_SUCCESS; return GIT_SUCCESS;
} }
......
...@@ -474,6 +474,72 @@ BEGIN_TEST(write0, "write a new commit object from memory to disk") ...@@ -474,6 +474,72 @@ BEGIN_TEST(write0, "write a new commit object from memory to disk")
git_repository_free(repo); git_repository_free(repo);
END_TEST END_TEST
#define ROOT_COMMIT_MESSAGE "This is a root commit\n\
This is a root commit and should be the only one in this branch\n"
BEGIN_TEST(root0, "create a root commit")
git_repository *repo;
git_commit *commit;
git_oid tree_id, commit_id;
const git_oid *branch_oid;
const git_signature *author, *committer;
const char *branch_name = "refs/heads/root-commit-branch";
git_reference *head, *branch;
char *head_old;
must_pass(git_repository_open(&repo, REPOSITORY_FOLDER));
git_oid_mkstr(&tree_id, tree_oid);
/* create signatures */
committer = git_signature_new(COMMITTER_NAME, COMMITTER_EMAIL, 123456789, 60);
must_be_true(committer != NULL);
author = git_signature_new(COMMITTER_NAME, COMMITTER_EMAIL, 987654321, 90);
must_be_true(author != NULL);
/* First we need to update HEAD so it points to our non-existant branch */
must_pass(git_reference_lookup(&head, repo, "HEAD"));
must_be_true(git_reference_type(head) == GIT_REF_SYMBOLIC);
head_old = git__strdup(git_reference_target(head));
must_be_true(head_old != NULL);
must_pass(git_reference_set_target(head, branch_name));
must_pass(git_commit_create_v(
&commit_id, /* out id */
repo,
"HEAD",
author,
committer,
ROOT_COMMIT_MESSAGE,
&tree_id,
0));
git_signature_free((git_signature *)committer);
git_signature_free((git_signature *)author);
/*
* The fact that creating a commit works has already been
* tested. Here we just make sure it's our commit and that it was
* written as a root commit.
*/
must_pass(git_commit_lookup(&commit, repo, &commit_id));
must_be_true(git_commit_parentcount(commit) == 0);
must_pass(git_reference_lookup(&branch, repo, branch_name));
branch_oid = git_reference_oid(branch);
must_pass(git_oid_cmp(branch_oid, &commit_id));
must_be_true(!strcmp(git_commit_message(commit), ROOT_COMMIT_MESSAGE));
/* Remove the data we just added to the repo */
must_pass(git_reference_lookup(&head, repo, "HEAD"));
must_pass(git_reference_set_target(head, head_old));
must_pass(git_reference_delete(branch));
must_pass(remove_loose_object(REPOSITORY_FOLDER, (git_object *)commit));
free(head_old);
git_commit_close(commit);
git_repository_free(repo);
END_TEST
BEGIN_SUITE(commit) BEGIN_SUITE(commit)
ADD_TEST(parse0); ADD_TEST(parse0);
...@@ -483,4 +549,6 @@ BEGIN_SUITE(commit) ...@@ -483,4 +549,6 @@ BEGIN_SUITE(commit)
ADD_TEST(write0); ADD_TEST(write0);
//ADD_TEST(write1); //ADD_TEST(write1);
ADD_TEST(root0);
END_SUITE END_SUITE
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment