aboutsummaryrefslogtreecommitdiff
path: root/diff-cache.c
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2005-05-19 19:00:36 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-05-19 22:33:07 -0700
commit57fe64a40d95dd99d798c6d7c81c1a76d24a8e7c (patch)
tree8f12e1e6f5bf259b5118dc8cd4a22b23d6c9f32b /diff-cache.c
parentdc26bd890d0a8571c38397e2ab33c0f3963c01a7 (diff)
downloadgit-57fe64a40d95dd99d798c6d7c81c1a76d24a8e7c.tar.gz
git-57fe64a40d95dd99d798c6d7c81c1a76d24a8e7c.tar.xz
[PATCH] diff overhaul
This cleans up the way calls are made into the diff core from diff-tree family and diff-helper. Earlier, these programs had "if (generating_patch)" sprinkled all over the place, but those ugliness are gone and handled uniformly from the diff core, even when not generating patch format. This also allowed diff-cache and diff-files to acquire -R (reverse) option to generate diff in reverse. Users of diff-tree can swap two trees easily so I did not add -R there. [ Linus' note: I'll add -R to "diff-tree" too, since a "commit diff" doesn't have another tree to switch around: the other tree is always the parent(s) of the commit ] Also -M<digits-as-mantissa> suggestion made by Linus has been implemented. Documentation updates are also included. Signed-off-by: Junio C Hamano <junkio@cox.net> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'diff-cache.c')
-rw-r--r--diff-cache.c42
1 files changed, 17 insertions, 25 deletions
diff --git a/diff-cache.c b/diff-cache.c
index 8f32beed1..40fd6b496 100644
--- a/diff-cache.c
+++ b/diff-cache.c
@@ -6,15 +6,13 @@ static int generate_patch = 0;
static int match_nonexisting = 0;
static int line_termination = '\n';
static int detect_rename = 0;
+static int reverse_diff = 0;
+static int diff_score_opt = 0;
/* A file entry went away or appeared */
static void show_file(const char *prefix, struct cache_entry *ce, unsigned char *sha1, unsigned int mode)
{
- if (generate_patch)
- diff_addremove(prefix[0], ntohl(mode), sha1, ce->name, NULL);
- else
- printf("%s%06o\tblob\t%s\t%s%c", prefix, ntohl(mode),
- sha1_to_hex(sha1), ce->name, line_termination);
+ diff_addremove(prefix[0], ntohl(mode), sha1, ce->name, NULL);
}
static int get_stat_data(struct cache_entry *ce, unsigned char **sha1p, unsigned int *modep)
@@ -64,7 +62,6 @@ static int show_modified(struct cache_entry *old,
{
unsigned int mode, oldmode;
unsigned char *sha1;
- char old_sha1_hex[60];
if (get_stat_data(new, &sha1, &mode) < 0) {
if (report_missing)
@@ -79,15 +76,8 @@ static int show_modified(struct cache_entry *old,
mode = ntohl(mode);
oldmode = ntohl(oldmode);
- if (generate_patch)
- diff_change(oldmode, mode,
- old->sha1, sha1, old->name, NULL);
- else {
- strcpy(old_sha1_hex, sha1_to_hex(old->sha1));
- printf("*%06o->%06o\tblob\t%s->%s\t%s%c", oldmode, mode,
- old_sha1_hex, sha1_to_hex(sha1),
- old->name, line_termination);
- }
+ diff_change(oldmode, mode,
+ old->sha1, sha1, old->name, NULL);
return 0;
}
@@ -127,10 +117,7 @@ static int diff_cache(struct cache_entry **ac, int entries)
break;
/* fallthru */
case 3:
- if (generate_patch)
- diff_unmerge(ce->name);
- else
- printf("U %s%c", ce->name, line_termination);
+ diff_unmerge(ce->name);
break;
default:
@@ -166,7 +153,7 @@ static void mark_merge_entries(void)
}
static char *diff_cache_usage =
-"git-diff-cache [-p] [-r] [-z] [-m] [-M] [--cached] <tree-ish>";
+"git-diff-cache [-p] [-r] [-z] [-m] [-M] [-R] [--cached] <tree-ish>";
int main(int argc, char **argv)
{
@@ -188,14 +175,19 @@ int main(int argc, char **argv)
generate_patch = 1;
continue;
}
- if (!strcmp(arg, "-M")) {
+ if (!strncmp(arg, "-M", 2)) {
generate_patch = detect_rename = 1;
+ diff_score_opt = diff_scoreopt_parse(arg);
continue;
}
if (!strcmp(arg, "-z")) {
line_termination = '\0';
continue;
}
+ if (!strcmp(arg, "-R")) {
+ reverse_diff = 1;
+ continue;
+ }
if (!strcmp(arg, "-m")) {
match_nonexisting = 1;
continue;
@@ -210,8 +202,9 @@ int main(int argc, char **argv)
if (argc != 2 || get_sha1(argv[1], tree_sha1))
usage(diff_cache_usage);
- if (generate_patch)
- diff_setup(detect_rename, 0, 0, 0, 0);
+ diff_setup(detect_rename, diff_score_opt, reverse_diff,
+ (generate_patch ? -1 : line_termination),
+ 0, 0);
mark_merge_entries();
@@ -222,7 +215,6 @@ int main(int argc, char **argv)
die("unable to read tree object %s", argv[1]);
ret = diff_cache(active_cache, active_nr);
- if (generate_patch)
- diff_flush();
+ diff_flush();
return ret;
}