Skip to content

Commit

Permalink
diff --no-index: also imitate the exit status of diff(1)
Browse files Browse the repository at this point in the history
diff sets the exit status to 0 when no changes were found, to 1
when changes were found, and 2 means error.

We imitate this to be able to use "git diff" in the test scripts.
(Actually, keeping in line with the rest of git, -1 is returned
on error, which corresponds to an exit status 255).

To find out if the diff is not empty, a member called
"found_changes" was introduced in struct diff_options, which is
set in builtin_diff() and fn_out_consume().

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Johannes Schindelin authored and Junio C Hamano committed Feb 26, 2007
1 parent 048f48a commit 34a5e1a
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 3 deletions.
11 changes: 8 additions & 3 deletions diff-lib.c
Original file line number Diff line number Diff line change
Expand Up @@ -210,11 +210,16 @@ int run_diff_files_cmd(struct rev_info *revs, int argc, const char **argv)
if (revs->max_count == -2) {
if (revs->diffopt.nr_paths != 2)
return error("need two files/directories with --no-index");
queue_diff(&revs->diffopt, revs->diffopt.paths[0],
revs->diffopt.paths[1]);
if (queue_diff(&revs->diffopt, revs->diffopt.paths[0],
revs->diffopt.paths[1]))
return -1;
diffcore_std(&revs->diffopt);
diff_flush(&revs->diffopt);
return 0;
/*
* The return code for --no-index imitates diff(1):
* 0 = no changes, 1 = changes, else error
*/
return revs->diffopt.found_changes;
}

if (read_cache() < 0) {
Expand Down
6 changes: 6 additions & 0 deletions diff.c
Original file line number Diff line number Diff line change
Expand Up @@ -382,6 +382,7 @@ struct emit_callback {
int nparents, color_diff;
const char **label_path;
struct diff_words_data *diff_words;
int *found_changesp;
};

static void free_diff_words_data(struct emit_callback *ecbdata)
Expand Down Expand Up @@ -501,6 +502,8 @@ static void fn_out_consume(void *priv, char *line, unsigned long len)
const char *set = diff_get_color(ecbdata->color_diff, DIFF_METAINFO);
const char *reset = diff_get_color(ecbdata->color_diff, DIFF_RESET);

*(ecbdata->found_changesp) = 1;

if (ecbdata->label_path[0]) {
const char *name_a_tab, *name_b_tab;

Expand Down Expand Up @@ -1098,6 +1101,7 @@ static void builtin_diff(const char *name_a,
if (complete_rewrite) {
emit_rewrite_diff(name_a, name_b, one, two,
o->color_diff);
o->found_changes = 1;
goto free_ab_and_return;
}
}
Expand All @@ -1115,6 +1119,7 @@ static void builtin_diff(const char *name_a,
else
printf("Binary files %s and %s differ\n",
lbl[0], lbl[1]);
o->found_changes = 1;
}
else {
/* Crazy xdl interfaces.. */
Expand All @@ -1127,6 +1132,7 @@ static void builtin_diff(const char *name_a,
memset(&ecbdata, 0, sizeof(ecbdata));
ecbdata.label_path = lbl;
ecbdata.color_diff = o->color_diff;
ecbdata.found_changesp = &o->found_changes;
xpp.flags = XDF_NEED_MINIMAL | o->xdl_opts;
xecfg.ctxlen = o->context;
xecfg.flags = XDL_EMIT_FUNCNAMES;
Expand Down
3 changes: 3 additions & 0 deletions diff.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,9 @@ struct diff_options {
int stat_width;
int stat_name_width;

/* this is set by diffcore for DIFF_FORMAT_PATCH */
int found_changes;

int nr_paths;
const char **paths;
int *pathlens;
Expand Down

0 comments on commit 34a5e1a

Please sign in to comment.