static int handle_octopus(int count, const char **args, int show_all) { struct commit_list *revs = NULL; struct commit_list *result, *rev; int i; for (i = count - 1; i >= 0; i--) commit_list_insert(get_commit_reference(args[i]), &revs); result = get_octopus_merge_bases(revs); free_commit_list(revs); reduce_heads_replace(&result); if (!result) return 1; for (rev = result; rev; rev = rev->next) { printf("%s\n", oid_to_hex(&rev->item->object.oid)); if (!show_all) break; } free_commit_list(result); return 0; }
/** * Sets merge_base to the octopus merge base of curr_head, merge_head and * fork_point. Returns 0 if a merge base is found, 1 otherwise. */ static int get_octopus_merge_base(struct object_id *merge_base, const struct object_id *curr_head, const struct object_id *merge_head, const struct object_id *fork_point) { struct commit_list *revs = NULL, *result; commit_list_insert(lookup_commit_reference(the_repository, curr_head), &revs); commit_list_insert(lookup_commit_reference(the_repository, merge_head), &revs); if (!is_null_oid(fork_point)) commit_list_insert(lookup_commit_reference(the_repository, fork_point), &revs); result = get_octopus_merge_bases(revs); free_commit_list(revs); reduce_heads_replace(&result); if (!result) return 1; oidcpy(merge_base, &result->item->object.oid); free_commit_list(result); return 0; }
static int handle_independent(int count, const char **args) { struct commit_list *revs = NULL, *rev; int i; for (i = count - 1; i >= 0; i--) commit_list_insert(get_commit_reference(args[i]), &revs); reduce_heads_replace(&revs); if (!revs) return 1; for (rev = revs; rev; rev = rev->next) printf("%s\n", oid_to_hex(&rev->item->object.oid)); free_commit_list(revs); return 0; }