refactor merge_bases() as preparation to libify merge-base
Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
parent
75dedd5a21
commit
52cab8a084
64
merge-base.c
64
merge-base.c
@ -124,8 +124,6 @@ static struct commit *interesting(struct commit_list *list)
|
|||||||
* to contaminate D and E.
|
* to contaminate D and E.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int show_all = 0;
|
|
||||||
|
|
||||||
static void mark_reachable_commits(struct commit_list *result,
|
static void mark_reachable_commits(struct commit_list *result,
|
||||||
struct commit_list *list)
|
struct commit_list *list)
|
||||||
{
|
{
|
||||||
@ -167,34 +165,33 @@ static void mark_reachable_commits(struct commit_list *result,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int merge_base(struct commit *rev1, struct commit *rev2)
|
struct commit_list *get_merge_bases(struct commit *rev1, struct commit *rev2)
|
||||||
{
|
{
|
||||||
struct commit_list *list = NULL;
|
struct commit_list *list = NULL;
|
||||||
struct commit_list *result = NULL;
|
struct commit_list *result = NULL;
|
||||||
struct commit_list *tmp = NULL;
|
struct commit_list *tmp = NULL;
|
||||||
|
|
||||||
if (rev1 == rev2) {
|
if (rev1 == rev2)
|
||||||
printf("%s\n", sha1_to_hex(rev1->object.sha1));
|
return commit_list_insert(rev1, &result);
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
parse_commit(rev1);
|
parse_commit(rev1);
|
||||||
parse_commit(rev2);
|
parse_commit(rev2);
|
||||||
|
|
||||||
rev1->object.flags |= 1;
|
rev1->object.flags |= PARENT1;
|
||||||
rev2->object.flags |= 2;
|
rev2->object.flags |= PARENT2;
|
||||||
insert_by_date(rev1, &list);
|
insert_by_date(rev1, &list);
|
||||||
insert_by_date(rev2, &list);
|
insert_by_date(rev2, &list);
|
||||||
|
|
||||||
while (interesting(list)) {
|
while (interesting(list)) {
|
||||||
struct commit *commit = list->item;
|
struct commit *commit = list->item;
|
||||||
struct commit_list *parents;
|
struct commit_list *parents;
|
||||||
int flags = commit->object.flags & 7;
|
int flags = commit->object.flags
|
||||||
|
& (PARENT1 | PARENT2 | UNINTERESTING);
|
||||||
|
|
||||||
tmp = list;
|
tmp = list;
|
||||||
list = list->next;
|
list = list->next;
|
||||||
free(tmp);
|
free(tmp);
|
||||||
if (flags == 3) {
|
if (flags == (PARENT1 | PARENT2)) {
|
||||||
insert_by_date(commit, &result);
|
insert_by_date(commit, &result);
|
||||||
|
|
||||||
/* Mark parents of a found merge uninteresting */
|
/* Mark parents of a found merge uninteresting */
|
||||||
@ -213,21 +210,52 @@ static int merge_base(struct commit *rev1, struct commit *rev2)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!result)
|
if (!result)
|
||||||
return 1;
|
return NULL;
|
||||||
|
|
||||||
if (result->next && list)
|
if (result->next && list)
|
||||||
mark_reachable_commits(result, list);
|
mark_reachable_commits(result, list);
|
||||||
|
|
||||||
|
/* cull duplicates */
|
||||||
|
for (tmp = result, list = NULL; tmp; ) {
|
||||||
|
struct commit *commit = tmp->item;
|
||||||
|
struct commit_list *next = tmp->next;
|
||||||
|
if (commit->object.flags & UNINTERESTING) {
|
||||||
|
if (list != NULL)
|
||||||
|
list->next = next;
|
||||||
|
free(tmp);
|
||||||
|
} else {
|
||||||
|
if (list == NULL)
|
||||||
|
result = tmp;
|
||||||
|
list = tmp;
|
||||||
|
commit->object.flags |= UNINTERESTING;
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp = next;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* reset flags */
|
||||||
|
clear_commit_marks(rev1, PARENT1 | PARENT2 | UNINTERESTING);
|
||||||
|
clear_commit_marks(rev2, PARENT1 | PARENT2 | UNINTERESTING);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int show_all = 0;
|
||||||
|
|
||||||
|
static int merge_base(struct commit *rev1, struct commit *rev2)
|
||||||
|
{
|
||||||
|
struct commit_list *result = get_merge_bases(rev1, rev2);
|
||||||
|
|
||||||
|
if (!result)
|
||||||
|
return 1;
|
||||||
|
|
||||||
while (result) {
|
while (result) {
|
||||||
struct commit *commit = result->item;
|
printf("%s\n", sha1_to_hex(result->item->object.sha1));
|
||||||
result = result->next;
|
|
||||||
if (commit->object.flags & UNINTERESTING)
|
|
||||||
continue;
|
|
||||||
printf("%s\n", sha1_to_hex(commit->object.sha1));
|
|
||||||
if (!show_all)
|
if (!show_all)
|
||||||
return 0;
|
return 0;
|
||||||
commit->object.flags |= UNINTERESTING;
|
result = result->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user