static int builtin_diff_combined(struct rev_info *revs, int argc, const char **argv, struct object_array_entry *ent, int ents) { const unsigned char (*parent)[20]; int i; if (argc > 1) usage(builtin_diff_usage); if (!revs->dense_combined_merges && !revs->combine_merges) revs->dense_combined_merges = revs->combine_merges = 1; parent = xmalloc(ents * sizeof(*parent)); for (i = 0; i < ents; i++) hashcpy((unsigned char *)(parent + i), ent[i].item->sha1); diff_tree_combined(parent[0], parent + 1, ents - 1, revs->dense_combined_merges, revs); return 0; }
static int builtin_diff_combined(struct rev_info *revs, int argc, const char **argv, struct object_array_entry *ent, int ents) { struct sha1_array parents = SHA1_ARRAY_INIT; int i; if (argc > 1) usage(builtin_diff_usage); if (!revs->dense_combined_merges && !revs->combine_merges) revs->dense_combined_merges = revs->combine_merges = 1; for (i = 1; i < ents; i++) sha1_array_append(&parents, ent[i].item->sha1); diff_tree_combined(ent[0].item->sha1, &parents, revs->dense_combined_merges, revs); sha1_array_clear(&parents); return 0; }
static void commit_need_pushing(struct commit *commit, struct commit_list *parent, int *needs_pushing) { const unsigned char (*parents)[20]; unsigned int i, n; struct rev_info rev; n = commit_list_count(parent); parents = xmalloc(n * sizeof(*parents)); for (i = 0; i < n; i++) { hashcpy((unsigned char *)(parents + i), parent->item->object.sha1); parent = parent->next; } init_revisions(&rev, NULL); rev.diffopt.output_format |= DIFF_FORMAT_CALLBACK; rev.diffopt.format_callback = collect_submodules_from_diff; rev.diffopt.format_callback_data = needs_pushing; diff_tree_combined(commit->object.sha1, parents, n, 1, &rev); free(parents); }
void diff_tree_combined_merge(const unsigned char *sha1, int dense, struct rev_info *rev) { int num_parent; const unsigned char (*parent)[20]; struct commit *commit = lookup_commit(sha1); struct commit_list *parents; /* count parents */ for (parents = commit->parents, num_parent = 0; parents; parents = parents->next, num_parent++) ; /* nothing */ parent = xmalloc(num_parent * sizeof(*parent)); for (parents = commit->parents, num_parent = 0; parents; parents = parents->next, num_parent++) hashcpy((unsigned char*)(parent + num_parent), parents->item->object.sha1); diff_tree_combined(sha1, parent, num_parent, dense, rev); }