diff options
author | Junio C Hamano <junkio@cox.net> | 2006-02-05 23:55:45 -0800 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2006-02-05 23:55:45 -0800 |
commit | a2c641c4ab66b5bdcb62c36a5f748b9f929d61b8 (patch) | |
tree | c7f414f8d89f51a19ff04ad04f19f25ecc643e6b /diff-tree.c | |
parent | 12db4852de8d377d317e5a7cf11467e5d4c5773d (diff) | |
parent | 45392a648d7449d237ecc2507bc92378bf920bf0 (diff) | |
download | git-a2c641c4ab66b5bdcb62c36a5f748b9f929d61b8.tar.gz |
Merge branch 'jc/diff'
* jc/diff:
git-diff-tree --stdin: show all parents.
combine-diff: remove misguided --show-empty hack.
Diffstat (limited to 'diff-tree.c')
-rw-r--r-- | diff-tree.c | 68 |
1 files changed, 39 insertions, 29 deletions
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], ""); |