diff options
-rw-r--r-- | combine-diff.c | 10 | ||||
-rw-r--r-- | diff-files.c | 2 | ||||
-rw-r--r-- | diff-tree.c | 68 | ||||
-rw-r--r-- | diff.h | 4 |
4 files changed, 46 insertions, 38 deletions
diff --git a/combine-diff.c b/combine-diff.c index 210ffcbce3..250de1c629 100644 --- a/combine-diff.c +++ b/combine-diff.c @@ -608,7 +608,7 @@ static void reuse_combine_diff(struct sline *sline, unsigned long cnt, } int show_combined_diff(struct combine_diff_path *elem, int num_parent, - int dense, const char *header, int show_empty) + int dense, const char *header) { unsigned long size, cnt, lno; char *result, *cp, *ep; @@ -742,8 +742,7 @@ int show_combined_diff(struct combine_diff_path *elem, int num_parent, } int diff_tree_combined_merge(const unsigned char *sha1, - const char *header, - int show_empty_merge, int dense) + const char *header, int dense) { struct commit *commit = lookup_commit(sha1); struct diff_options diffopts; @@ -777,12 +776,11 @@ int diff_tree_combined_merge(const unsigned char *sha1, if (p->len) num_paths++; } - if (num_paths || show_empty_merge) { + if (num_paths) { for (p = paths; p; p = p->next) { if (!p->len) continue; - if (show_combined_diff(p, num_parent, dense, header, - show_empty_merge)) + if (show_combined_diff(p, num_parent, dense, header)) header = NULL; } } diff --git a/diff-files.c b/diff-files.c index 4cafd3ea20..4ba59f1a25 100644 --- a/diff-files.c +++ b/diff-files.c @@ -160,7 +160,7 @@ int main(int argc, const char **argv) if (combine_merges && num_compare_stages == 2) { show_combined_diff(&combine.p, 2, dense_combined_merges, - NULL, 0); + NULL); free(combine.p.path); continue; } diff --git a/diff-tree.c b/diff-tree.c index 2df23c65fd..f3280a13ee 100644 --- a/diff-tree.c +++ b/diff-tree.c @@ -6,7 +6,6 @@ static int show_root_diff = 0; static int no_commit_id = 0; static int verbose_header = 0; static int ignore_merges = 1; -static int show_empty_combined = 0; static int combine_merges = 0; static int dense_combined_merges = 0; static int read_stdin = 0; @@ -101,23 +100,15 @@ static const char *generate_header(const unsigned char *commit_sha1, return this_header; } -static int diff_tree_commit(const unsigned char *commit_sha1) +static int diff_tree_commit(struct commit *commit) { - struct commit *commit; struct commit_list *parents; - char name[50]; - unsigned char sha1[20]; + unsigned const char *sha1 = commit->object.sha1; - sprintf(name, "%s^0", sha1_to_hex(commit_sha1)); - if (get_sha1(name, sha1)) - return -1; - name[40] = 0; - commit = lookup_commit(sha1); - /* Root commit? */ if (show_root_diff && !commit->parents) { header = generate_header(sha1, NULL, commit); - diff_root_tree(commit_sha1, ""); + diff_root_tree(sha1, ""); } /* More than one parent? */ @@ -127,7 +118,6 @@ static int diff_tree_commit(const unsigned char *commit_sha1) else if (combine_merges) { header = generate_header(sha1, sha1, commit); return diff_tree_combined_merge(sha1, header, - show_empty_combined, dense_combined_merges); } } @@ -135,7 +125,7 @@ static int diff_tree_commit(const unsigned char *commit_sha1) for (parents = commit->parents; parents; parents = parents->next) { struct commit *parent = parents->item; header = generate_header(sha1, parent->object.sha1, commit); - diff_tree_sha1_top(parent->object.sha1, commit_sha1, ""); + diff_tree_sha1_top(parent->object.sha1, sha1, ""); if (!header && verbose_header) { header_prefix = "\ndiff-tree "; /* @@ -147,28 +137,49 @@ static int diff_tree_commit(const unsigned char *commit_sha1) return 0; } +static int diff_tree_commit_sha1(const unsigned char *sha1) +{ + struct commit *commit = lookup_commit_reference(sha1); + if (!commit) + return -1; + return diff_tree_commit(commit); +} + static int diff_tree_stdin(char *line) { int len = strlen(line); - unsigned char commit[20], parent[20]; - static char this_header[1000]; - int abbrev = diff_options.abbrev; + unsigned char sha1[20]; + struct commit *commit; if (!len || line[len-1] != '\n') return -1; line[len-1] = 0; - if (get_sha1_hex(line, commit)) + if (get_sha1_hex(line, sha1)) + return -1; + commit = lookup_commit(sha1); + if (!commit || parse_commit(commit)) return -1; - if (isspace(line[40]) && !get_sha1_hex(line+41, parent)) { - line[40] = 0; - line[81] = 0; - sprintf(this_header, "%s (from %s)\n", - diff_unique_abbrev(commit, abbrev), - diff_unique_abbrev(parent, abbrev)); - header = this_header; - return diff_tree_sha1_top(parent, commit, ""); + if (isspace(line[40]) && !get_sha1_hex(line+41, sha1)) { + /* Graft the fake parents locally to the commit */ + int pos = 41; + struct commit_list **pptr, *parents; + + /* Free the real parent list */ + for (parents = commit->parents; parents; ) { + struct commit_list *tmp = parents->next; + free(parents); + parents = tmp; + } + commit->parents = NULL; + pptr = &(commit->parents); + while (line[pos] && !get_sha1_hex(line + pos, sha1)) { + struct commit *parent = lookup_commit(sha1); + if (parent) { + pptr = &commit_list_insert(parent, pptr)->next; + } + pos += 41; + } } - line[40] = 0; return diff_tree_commit(commit); } @@ -278,7 +289,6 @@ int main(int argc, const char **argv) if (combine_merges) { diff_options.output_format = DIFF_FORMAT_PATCH; - show_empty_combined = !ignore_merges; ignore_merges = 0; } @@ -291,7 +301,7 @@ int main(int argc, const char **argv) usage(diff_tree_usage); break; case 1: - diff_tree_commit(sha1[0]); + diff_tree_commit_sha1(sha1[0]); break; case 2: diff_tree_sha1_top(sha1[0], sha1[1], ""); @@ -68,9 +68,9 @@ struct combine_diff_path { }; int show_combined_diff(struct combine_diff_path *elem, int num_parent, - int dense, const char *header, int show_empty); + int dense, const char *header); -extern int diff_tree_combined_merge(const unsigned char *sha1, const char *, int, int); +extern int diff_tree_combined_merge(const unsigned char *sha1, const char *, int); extern void diff_addremove(struct diff_options *, int addremove, |