From e3c3a550d4815d34b5674776c36cdd6d8a31ab85 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Sun, 5 Feb 2006 22:25:00 -0800 Subject: combine-diff: remove misguided --show-empty hack. Now --always flag is available in diff-tree, there is no reason to have that hack in the diffcore side. Signed-off-by: Junio C Hamano --- combine-diff.c | 10 ++++------ diff-files.c | 2 +- diff-tree.c | 3 --- diff.h | 4 ++-- 4 files changed, 7 insertions(+), 12 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..e7410b4e0b 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; @@ -127,7 +126,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); } } @@ -278,7 +276,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; } diff --git a/diff.h b/diff.h index 32134d79b5..ff41c5859d 100644 --- a/diff.h +++ b/diff.h @@ -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, -- cgit v1.2.3 From 45392a648d7449d237ecc2507bc92378bf920bf0 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Sun, 5 Feb 2006 23:00:41 -0800 Subject: git-diff-tree --stdin: show all parents. git-diff-tree --stdin ignored second and subsequent parents when fed git-rev-list --parents output. Update diff_tree_commit() function to take a commit object, and pass a fabricated commit object after grafting the fake parents from diff_tree_stdin(). Signed-off-by: Junio C Hamano --- diff-tree.c | 65 ++++++++++++++++++++++++++++++++++++------------------------- 1 file changed, 39 insertions(+), 26 deletions(-) diff --git a/diff-tree.c b/diff-tree.c index e7410b4e0b..f3280a13ee 100644 --- a/diff-tree.c +++ b/diff-tree.c @@ -100,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? */ @@ -133,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 "; /* @@ -145,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); } @@ -288,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], ""); -- cgit v1.2.3