Code

diff: squelch empty diffs even more
authorRené Scharfe <rene.scharfe@lsrfire.ath.cx>
Tue, 14 Aug 2007 22:41:00 +0000 (00:41 +0200)
committerJunio C Hamano <gitster@pobox.com>
Wed, 15 Aug 2007 05:34:58 +0000 (22:34 -0700)
When we compare two non-tracked files, or explicitly
specify --no-index, the suggestion to run git-status
is not helpful.

The patch adds a new diff_options bitfield member, no_index, that
is used instead of the special value of -2 of the rev_info field
max_count to indicate that the index is not to be used.  This makes
it possible to pass that flag down to diffcore_skip_stat_unmatch(),
which only has one diff_options parameter.

This could even become a cleanup if we removed all assignments of
max_count to a value of -2 (viz. replacement of a magic value with
a self-documenting field name) but I didn't dare to do that so late
in the rc game..

The no_index bit, if set, then tells diffcore_skip_stat_unmatch()
to not account for any skipped stat-mismatches, which avoids the
suggestion to run git-status.

Signed-off-by: Rene Scharfe <rene.scharfe@lsfire.ath.cx>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
diff-lib.c
diff.c
diff.h

index 92c0e39ad6f21e0511ee84052e2b762d6e447f61..f5568c3b36338a203a42ce1e46109152ad4642bb 100644 (file)
@@ -189,6 +189,7 @@ static int handle_diff_files_args(struct rev_info *revs,
                                !strcmp(argv[1], "--no-index")) {
                        revs->max_count = -2;
                        revs->diffopt.exit_with_status = 1;
+                       revs->diffopt.no_index = 1;
                }
                else if (!strcmp(argv[1], "-q"))
                        *silent = 1;
@@ -204,8 +205,10 @@ static int handle_diff_files_args(struct rev_info *revs,
                 */
                read_cache();
                if (!is_in_index(revs->diffopt.paths[0]) ||
-                                       !is_in_index(revs->diffopt.paths[1]))
+                                       !is_in_index(revs->diffopt.paths[1])) {
                        revs->max_count = -2;
+                       revs->diffopt.no_index = 1;
+               }
        }
 
        /*
@@ -293,6 +296,7 @@ int setup_diff_no_index(struct rev_info *revs,
        else
                revs->diffopt.paths = argv + argc - 2;
        revs->diffopt.nr_paths = 2;
+       revs->diffopt.no_index = 1;
        revs->max_count = -2;
        return 0;
 }
@@ -304,7 +308,7 @@ int run_diff_files_cmd(struct rev_info *revs, int argc, const char **argv)
        if (handle_diff_files_args(revs, argc, argv, &silent_on_removed))
                return -1;
 
-       if (revs->max_count == -2) {
+       if (revs->diffopt.no_index) {
                if (revs->diffopt.nr_paths != 2)
                        return error("need two files/directories with --no-index");
                if (queue_diff(&revs->diffopt, revs->diffopt.paths[0],
diff --git a/diff.c b/diff.c
index f884de77ac2a0175e317628e25ec9ee3aaa902f7..97cc5bc085ba21693007328bb402860420949ec0 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -3185,7 +3185,8 @@ static void diffcore_skip_stat_unmatch(struct diff_options *diffopt)
                         * to determine how many paths were dirty only
                         * due to stat info mismatch.
                         */
-                       diffopt->skip_stat_unmatch++;
+                       if (!diffopt->no_index)
+                               diffopt->skip_stat_unmatch++;
                        diff_free_filepair(p);
                }
        }
diff --git a/diff.h b/diff.h
index de21f8ecd045a299907e6f6d873ad4c120ca30da..4546aad219742e4ad878937dbd05436c93d298b9 100644 (file)
--- a/diff.h
+++ b/diff.h
@@ -60,6 +60,7 @@ struct diff_options {
                 color_diff_words:1,
                 has_changes:1,
                 quiet:1,
+                no_index:1,
                 allow_external:1,
                 exit_with_status:1;
        int context;