From 34a5e1a2d900b5dd9b9c446a3db9fdb3b29e0575 Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Sun, 25 Feb 2007 23:34:54 +0100 Subject: [PATCH] diff --no-index: also imitate the exit status of diff(1) 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 Signed-off-by: Junio C Hamano --- diff-lib.c | 11 ++++++++--- diff.c | 6 ++++++ diff.h | 3 +++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/diff-lib.c b/diff-lib.c index ae8364b42a..2e91619906 100644 --- a/diff-lib.c +++ b/diff-lib.c @@ -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) { diff --git a/diff.c b/diff.c index 6bd456ed42..5651152a93 100644 --- a/diff.c +++ b/diff.c @@ -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) @@ -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; @@ -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; } } @@ -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.. */ @@ -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; diff --git a/diff.h b/diff.h index b608828261..4043cec04e 100644 --- a/diff.h +++ b/diff.h @@ -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; -- 2.11.4.GIT