mirror of
https://git.proxmox.com/git/libgit2
synced 2025-05-08 15:24:11 +00:00
Extract shared functionality.
This commit is contained in:
parent
eca07bcd83
commit
917f85a1a4
104
src/merge.c
104
src/merge.c
@ -62,16 +62,14 @@ struct merge_diff_df_data {
|
|||||||
|
|
||||||
/* Merge base computation */
|
/* Merge base computation */
|
||||||
|
|
||||||
int git_merge_base_many(git_oid *out, git_repository *repo, size_t length, const git_oid input_array[])
|
int merge_bases_many(git_commit_list **out, git_revwalk **walk_out, git_repository *repo, size_t length, const git_oid input_array[])
|
||||||
{
|
{
|
||||||
git_revwalk *walk;
|
git_revwalk *walk = NULL;
|
||||||
git_vector list;
|
git_vector list;
|
||||||
git_commit_list *result = NULL;
|
git_commit_list *result = NULL;
|
||||||
|
git_commit_list_node *commit;
|
||||||
int error = -1;
|
int error = -1;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
git_commit_list_node *commit;
|
|
||||||
|
|
||||||
assert(out && repo && input_array);
|
|
||||||
|
|
||||||
if (length < 2) {
|
if (length < 2) {
|
||||||
giterr_set(GITERR_INVALID, "At least two commits are required to find an ancestor. Provided 'length' was %u.", length);
|
giterr_set(GITERR_INVALID, "At least two commits are required to find an ancestor. Provided 'length' was %u.", length);
|
||||||
@ -82,104 +80,92 @@ int git_merge_base_many(git_oid *out, git_repository *repo, size_t length, const
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (git_revwalk_new(&walk, repo) < 0)
|
if (git_revwalk_new(&walk, repo) < 0)
|
||||||
goto cleanup;
|
goto on_error;
|
||||||
|
|
||||||
for (i = 1; i < length; i++) {
|
for (i = 1; i < length; i++) {
|
||||||
commit = git_revwalk__commit_lookup(walk, &input_array[i]);
|
commit = git_revwalk__commit_lookup(walk, &input_array[i]);
|
||||||
if (commit == NULL)
|
if (commit == NULL)
|
||||||
goto cleanup;
|
goto on_error;
|
||||||
|
|
||||||
git_vector_insert(&list, commit);
|
git_vector_insert(&list, commit);
|
||||||
}
|
}
|
||||||
|
|
||||||
commit = git_revwalk__commit_lookup(walk, &input_array[0]);
|
commit = git_revwalk__commit_lookup(walk, &input_array[0]);
|
||||||
if (commit == NULL)
|
if (commit == NULL)
|
||||||
goto cleanup;
|
goto on_error;
|
||||||
|
|
||||||
if (git_merge__bases_many(&result, walk, commit, &list) < 0)
|
if (git_merge__bases_many(&result, walk, commit, &list) < 0)
|
||||||
goto cleanup;
|
goto on_error;
|
||||||
|
|
||||||
if (!result) {
|
if (!result) {
|
||||||
giterr_set(GITERR_MERGE, "No merge base found");
|
giterr_set(GITERR_MERGE, "No merge base found");
|
||||||
error = GIT_ENOTFOUND;
|
error = GIT_ENOTFOUND;
|
||||||
goto cleanup;
|
goto on_error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*out = result;
|
||||||
|
*walk_out = walk;
|
||||||
|
|
||||||
|
git_vector_free(&list);
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
on_error:
|
||||||
|
git_vector_free(&list);
|
||||||
|
git_revwalk_free(walk);
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
int git_merge_base_many(git_oid *out, git_repository *repo, size_t length, const git_oid input_array[])
|
||||||
|
{
|
||||||
|
git_revwalk *walk;
|
||||||
|
git_commit_list *result = NULL;
|
||||||
|
int error = 0;
|
||||||
|
|
||||||
|
assert(out && repo && input_array);
|
||||||
|
|
||||||
|
if ((error = merge_bases_many(&result, &walk, repo, length, input_array)) < 0)
|
||||||
|
return error;
|
||||||
|
|
||||||
git_oid_cpy(out, &result->item->oid);
|
git_oid_cpy(out, &result->item->oid);
|
||||||
|
|
||||||
error = 0;
|
|
||||||
|
|
||||||
cleanup:
|
|
||||||
git_commit_list_free(&result);
|
git_commit_list_free(&result);
|
||||||
git_revwalk_free(walk);
|
git_revwalk_free(walk);
|
||||||
git_vector_free(&list);
|
|
||||||
return error;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int git_merge_bases_many(git_oidarray *out, git_repository *repo, size_t length, const git_oid input_array[])
|
int git_merge_bases_many(git_oidarray *out, git_repository *repo, size_t length, const git_oid input_array[])
|
||||||
{
|
{
|
||||||
git_revwalk *walk;
|
git_revwalk *walk;
|
||||||
git_vector list;
|
git_commit_list *list, *result = NULL;
|
||||||
git_commit_list *current, *result = NULL;
|
int error = 0;
|
||||||
int error = -1;
|
|
||||||
unsigned int i;
|
|
||||||
git_commit_list_node *commit;
|
|
||||||
git_array_oid_t array;
|
git_array_oid_t array;
|
||||||
|
|
||||||
assert(out && repo && input_array);
|
assert(out && repo && input_array);
|
||||||
|
|
||||||
if (length < 2) {
|
if ((error = merge_bases_many(&result, &walk, repo, length, input_array)) < 0)
|
||||||
giterr_set(GITERR_INVALID, "At least two commits are required to find an ancestor. Provided 'length' was %u.", length);
|
return error;
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (git_vector_init(&list, length - 1, NULL) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (git_revwalk_new(&walk, repo) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
for (i = 1; i < length; i++) {
|
|
||||||
commit = git_revwalk__commit_lookup(walk, &input_array[i]);
|
|
||||||
if (commit == NULL)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
git_vector_insert(&list, commit);
|
|
||||||
}
|
|
||||||
|
|
||||||
commit = git_revwalk__commit_lookup(walk, &input_array[0]);
|
|
||||||
if (commit == NULL)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (git_merge__bases_many(&result, walk, commit, &list) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (!result) {
|
|
||||||
giterr_set(GITERR_MERGE, "No merge base found");
|
|
||||||
error = GIT_ENOTFOUND;
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
git_array_init(array);
|
git_array_init(array);
|
||||||
|
|
||||||
current = result;
|
list = result;
|
||||||
while (current) {
|
while (list) {
|
||||||
git_oid *id = git_array_alloc(array);
|
git_oid *id = git_array_alloc(array);
|
||||||
if (id == NULL)
|
if (id == NULL) {
|
||||||
|
error = -1;
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
git_oid_cpy(id, ¤t->item->oid);
|
git_oid_cpy(id, &list->item->oid);
|
||||||
current = current->next;
|
list = list->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
git_oidarray__from_array(out, &array);
|
git_oidarray__from_array(out, &array);
|
||||||
|
|
||||||
error = 0;
|
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
git_commit_list_free(&result);
|
git_commit_list_free(&result);
|
||||||
git_revwalk_free(walk);
|
git_revwalk_free(walk);
|
||||||
git_vector_free(&list);
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user