mirror of
				https://git.proxmox.com/git/libgit2
				synced 2025-11-04 07:09:14 +00:00 
			
		
		
		
	Merge pull request #151 from carlosmn/root-commit.
Support root commits
This commit is contained in:
		
						commit
						cc3b82e376
					
				
							
								
								
									
										13
									
								
								src/commit.c
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								src/commit.c
									
									
									
									
									
								
							@ -224,9 +224,18 @@ int git_commit_create(
 | 
			
		||||
		if (error < GIT_SUCCESS)
 | 
			
		||||
			return error;
 | 
			
		||||
 | 
			
		||||
		if (git_reference_type(head) == GIT_REF_SYMBOLIC) {
 | 
			
		||||
			if ((error = git_reference_resolve(&head, head)) < GIT_SUCCESS)
 | 
			
		||||
		error = git_reference_resolve(&head, head);
 | 
			
		||||
		if (error < GIT_SUCCESS) {
 | 
			
		||||
			if (error != GIT_ENOTFOUND)
 | 
			
		||||
				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);
 | 
			
		||||
 | 
			
		||||
@ -1482,8 +1482,9 @@ int git_reference_resolve(git_reference **resolved_ref, git_reference *ref)
 | 
			
		||||
	for (i = 0; i < MAX_NESTING_LEVEL; ++i) {
 | 
			
		||||
		reference_symbolic *ref_sym;
 | 
			
		||||
 | 
			
		||||
		*resolved_ref = ref;
 | 
			
		||||
 | 
			
		||||
		if (ref->type & GIT_REF_OID) {
 | 
			
		||||
			*resolved_ref = ref;
 | 
			
		||||
			return GIT_SUCCESS;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -474,6 +474,72 @@ BEGIN_TEST(write0, "write a new commit object from memory to disk")
 | 
			
		||||
	git_repository_free(repo);
 | 
			
		||||
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)
 | 
			
		||||
	ADD_TEST(parse0);
 | 
			
		||||
@ -483,4 +549,6 @@ BEGIN_SUITE(commit)
 | 
			
		||||
 | 
			
		||||
	ADD_TEST(write0);
 | 
			
		||||
	//ADD_TEST(write1);
 | 
			
		||||
 | 
			
		||||
	ADD_TEST(root0);
 | 
			
		||||
END_SUITE
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user