Skip to content

Commit

Permalink
[PATCH] diff overhaul
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Junio C Hamano authored and Linus Torvalds committed May 20, 2005
1 parent dc26bd8 commit 57fe64a
Show file tree
Hide file tree
Showing 11 changed files with 192 additions and 125 deletions.
5 changes: 4 additions & 1 deletion Documentation/git-diff-cache.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ git-diff-cache - Compares content and mode of blobs between the cache and reposi

SYNOPSIS
--------
'git-diff-cache' [-p] [-r] [-z] [-m] [-M] [--cached] <tree-ish>
'git-diff-cache' [-p] [-r] [-z] [-m] [-M] [-R] [--cached] <tree-ish>

DESCRIPTION
-----------
Expand All @@ -36,6 +36,9 @@ OPTIONS
-M::
Detect renames; implies -p.

-R::
Output diff in reverse.

--cached::
do not consider the on-disk file at all

Expand Down
5 changes: 4 additions & 1 deletion Documentation/git-diff-files.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ git-diff-files - Compares files in the working tree and the cache

SYNOPSIS
--------
'git-diff-files' [-p] [-q] [-r] [-z] [-M] [<pattern>...]
'git-diff-files' [-p] [-q] [-r] [-z] [-M] [-R] [<pattern>...]

DESCRIPTION
-----------
Expand All @@ -26,6 +26,9 @@ OPTIONS
-q::
Remain silent even on nonexisting files

-R::
Output diff in reverse.

-M::
Detect renames; implies -p.

Expand Down
42 changes: 17 additions & 25 deletions diff-cache.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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)
Expand All @@ -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;
}

Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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)
{
Expand All @@ -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;
Expand All @@ -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();

Expand All @@ -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;
}
44 changes: 16 additions & 28 deletions diff-files.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,13 @@
#include "diff.h"

static const char *diff_files_usage =
"git-diff-files [-p] [-q] [-r] [-z] [-M] [paths...]";
"git-diff-files [-p] [-q] [-r] [-z] [-M] [-R] [paths...]";

static int generate_patch = 0;
static int line_termination = '\n';
static int detect_rename = 0;
static int reverse_diff = 0;
static int diff_score_opt = 0;
static int silent = 0;

static int matches_pathspec(struct cache_entry *ce, char **spec, int cnt)
Expand All @@ -31,36 +33,19 @@ static int matches_pathspec(struct cache_entry *ce, char **spec, int cnt)

static void show_unmerge(const char *path)
{
if (generate_patch)
diff_unmerge(path);
else
printf("U %s%c", path, line_termination);
diff_unmerge(path);
}

static void show_file(int pfx, struct cache_entry *ce)
{
if (generate_patch)
diff_addremove(pfx, ntohl(ce->ce_mode), ce->sha1,
ce->name, NULL);
else
printf("%c%06o\t%s\t%s\t%s%c",
pfx, ntohl(ce->ce_mode), "blob",
sha1_to_hex(ce->sha1), ce->name, line_termination);
diff_addremove(pfx, ntohl(ce->ce_mode), ce->sha1, ce->name, NULL);
}

static void show_modified(int oldmode, int mode,
const unsigned char *old_sha1, const unsigned char *sha1,
char *path)
{
char old_sha1_hex[41];
strcpy(old_sha1_hex, sha1_to_hex(old_sha1));

if (generate_patch)
diff_change(oldmode, mode, old_sha1, sha1, path, NULL);
else
printf("*%06o->%06o\tblob\t%s->%s\t%s%c",
oldmode, mode, old_sha1_hex, sha1_to_hex(sha1), path,
line_termination);
diff_change(oldmode, mode, old_sha1, sha1, path, NULL);
}

int main(int argc, char **argv)
Expand All @@ -80,7 +65,10 @@ int main(int argc, char **argv)
; /* no-op */
else if (!strcmp(argv[1], "-z"))
line_termination = 0;
else if (!strcmp(argv[1], "-M")) {
else if (!strcmp(argv[1], "-R"))
reverse_diff = 1;
else if (!strncmp(argv[1], "-M", 2)) {
diff_score_opt = diff_scoreopt_parse(argv[1]);
detect_rename = generate_patch = 1;
}
else
Expand All @@ -96,8 +84,9 @@ int main(int argc, char **argv)
exit(1);
}

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);

for (i = 0; i < entries; i++) {
struct stat st;
Expand All @@ -117,12 +106,12 @@ int main(int argc, char **argv)
i--; /* compensate for loop control increments */
continue;
}

if (lstat(ce->name, &st) < 0) {
if (errno != ENOENT) {
perror(ce->name);
continue;
}
}
if (silent)
continue;
show_file('-', ce);
Expand All @@ -139,7 +128,6 @@ int main(int argc, char **argv)
show_modified(oldmode, mode, ce->sha1, null_sha1,
ce->name);
}
if (generate_patch)
diff_flush();
diff_flush();
return 0;
}
19 changes: 11 additions & 8 deletions diff-helper.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include "diff.h"

static int detect_rename = 0;
static int diff_score_opt = 0;

static int parse_oneside_change(const char *cp, int *mode,
unsigned char *sha1, char *path)
Expand All @@ -19,15 +20,15 @@ static int parse_oneside_change(const char *cp, int *mode,
cp++;
}
*mode = m;
if (strncmp(cp, "\tblob\t", 6))
if (strncmp(cp, "\tblob\t", 6) && strncmp(cp, " blob ", 6))
return -1;
cp += 6;
if (get_sha1_hex(cp, sha1))
return -1;
cp += 40;
if (*cp++ != '\t')
if ((*cp != '\t') && *cp != ' ')
return -1;
strcpy(path, cp);
strcpy(path, ++cp);
return 0;
}

Expand Down Expand Up @@ -63,7 +64,7 @@ static int parse_diff_raw_output(const char *buf)
new_mode = (new_mode << 3) | (ch - '0');
cp++;
}
if (strncmp(cp, "\tblob\t", 6))
if (strncmp(cp, "\tblob\t", 6) && strncmp(cp, " blob ", 6))
return -1;
cp += 6;
if (get_sha1_hex(cp, old_sha1))
Expand All @@ -75,9 +76,9 @@ static int parse_diff_raw_output(const char *buf)
if (get_sha1_hex(cp, new_sha1))
return -1;
cp += 40;
if (*cp++ != '\t')
if ((*cp != '\t') && *cp != ' ')
return -1;
strcpy(path, cp);
strcpy(path, ++cp);
diff_change(old_mode, new_mode, old_sha1, new_sha1, path, 0);
break;
default:
Expand All @@ -101,15 +102,17 @@ int main(int ac, const char **av) {
reverse = 1;
else if (av[1][1] == 'z')
line_termination = 0;
else if (av[1][1] == 'M')
else if (av[1][1] == 'M') {
detect_rename = 1;
diff_score_opt = diff_scoreopt_parse(av[1]);
}
else
usage(diff_helper_usage);
ac--; av++;
}
/* the remaining parameters are paths patterns */

diff_setup(detect_rename, 0, reverse, av+1, ac-1);
diff_setup(detect_rename, diff_score_opt, reverse, -1, av+1, ac-1);

while (1) {
int status;
Expand Down
Loading

0 comments on commit 57fe64a

Please sign in to comment.