diff --no-index: also imitate the exit status of diff(1)
authorJohannes Schindelin <Johannes.Schindelin@gmx.de>
Sun, 25 Feb 2007 22:34:54 +0000 (23:34 +0100)
committerJunio C Hamano <junkio@cox.net>
Mon, 26 Feb 2007 09:20:55 +0000 (01:20 -0800)
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>
diff-lib.c
diff.c
diff.h

index ae8364b42a0c67e2461fc20e731417b3203c472f..2e916199066db068d80ff5168b3feee6cfba7056 100644 (file)
@@ -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 6bd456ed42e76a41c62908e5bb0d7df2b329b032..5651152a93a9a18dc95313178a6c695c0bd2c919 100644 (file)
--- 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 b608828261c9a7bb4b60c030109d078841acb114..4043cec04e0ae1da13a6049c9f30c4184f6b1da4 100644 (file)
--- 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;