diff options
author | Junio C Hamano <junkio@cox.net> | 2005-05-05 15:35:49 -0700 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2005-05-05 15:35:49 -0700 |
commit | 660265909fc178581ef327076716dfd3550e6e7b (patch) | |
tree | 9fe5a9fe58366cdff6c54ab71ccdf58a59e982b7 /diff-cache.c | |
parent | ed4eeaf203d0f293bd5ffc2a0ad8711f052db1f3 (diff) | |
download | git-660265909fc178581ef327076716dfd3550e6e7b.tar.gz git-660265909fc178581ef327076716dfd3550e6e7b.tar.xz |
diff-cache shows differences for unmerged paths without --cache.
While manually resolving a merge conflict, being able to run
diff-cache without --cache option between files in the work tree
and either of the ancestor trees is helpful to verify the hand
merged result. However, diff-cache refuses to handle unmerged
paths, even when run without --cache option.
This changes the behaviour so that the above use case will
report the differences between the compared tree and the magic
0{40} SHA1 (i.e. "look at the work tree"). When there is no
corresponding file in the work tree, or when the command is run
with "--cache" option, it continues to report "unmerged".
Signed-off-by: Junio C Hamano <junkio@cox.net>
Diffstat (limited to 'diff-cache.c')
-rw-r--r-- | diff-cache.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/diff-cache.c b/diff-cache.c index ef522cd23..7e87d28f3 100644 --- a/diff-cache.c +++ b/diff-cache.c @@ -57,14 +57,17 @@ static void show_new_file(struct cache_entry *new) show_file("+", new, sha1, mode); } -static int show_modified(struct cache_entry *old, struct cache_entry *new) +static int show_modified(struct cache_entry *old, + struct cache_entry *new, + int report_missing) { unsigned int mode, oldmode; unsigned char *sha1; unsigned char old_sha1_hex[60]; if (get_stat_data(new, &sha1, &mode) < 0) { - show_file("-", old, old->sha1, old->ce_mode); + if (report_missing) + show_file("-", old, old->sha1, old->ce_mode); return -1; } @@ -101,7 +104,7 @@ static int diff_cache(struct cache_entry **ac, int entries) break; } /* Show difference between old and new */ - show_modified(ac[1], ce); + show_modified(ac[1], ce, 1); break; case 1: /* No stage 3 (merge) entry? That means it's been deleted */ @@ -109,7 +112,19 @@ static int diff_cache(struct cache_entry **ac, int entries) show_file("-", ce, ce->sha1, ce->ce_mode); break; } - /* Otherwise we fall through to the "unmerged" case */ + /* We come here with ce pointing at stage 1 + * (original tree) and ac[1] pointing at stage + * 3 (unmerged). show-modified with + * report-mising set to false does not say the + * file is deleted but reports true if work + * tree does not have it, in which case we + * fall through to report the unmerged state. + * Otherwise, we show the differences between + * the original tree and the work tree. + */ + if (!cached_only && !show_modified(ce, ac[1], 0)) + break; + /* fallthru */ case 3: if (generate_patch) diff_unmerge(ce->name); |