lstat_cache(): print a warning if doing ping-pong between cache types
[gitweb.git] / builtin-diff-files.c
index ac13db70ff741240f1f27f98dfe09614da4ea87c..5b64011de8222f06b5c772a6461278dea152919e 100644 (file)
 #include "builtin.h"
 
 static const char diff_files_usage[] =
-"git-diff-files [-q] [-0/-1/2/3 |-c|--cc] [<common diff options>] [<path>...]"
+"git diff-files [-q] [-0/-1/2/3 |-c|--cc] [<common diff options>] [<path>...]"
 COMMON_DIFF_OPTIONS_HELP;
 
 int cmd_diff_files(int argc, const char **argv, const char *prefix)
 {
        struct rev_info rev;
-       int silent = 0;
+       int result;
+       unsigned options = 0;
 
        init_revisions(&rev, prefix);
-       git_config(git_default_config); /* no "diff" UI options */
+       git_config(git_diff_basic_config, NULL); /* no "diff" UI options */
        rev.abbrev = 0;
 
        argc = setup_revisions(argc, argv, &rev, NULL);
@@ -31,7 +32,7 @@ int cmd_diff_files(int argc, const char **argv, const char *prefix)
                else if (!strcmp(argv[1], "--theirs"))
                        rev.max_count = 3;
                else if (!strcmp(argv[1], "-q"))
-                       silent = 1;
+                       options |= DIFF_SILENT_ON_REMOVED;
                else
                        usage(diff_files_usage);
                argv++; argc--;
@@ -41,18 +42,27 @@ int cmd_diff_files(int argc, const char **argv, const char *prefix)
 
        /*
         * Make sure there are NO revision (i.e. pending object) parameter,
-        * rev.max_count is reasonable (0 <= n <= 3),
+        * rev.max_count is reasonable (0 <= n <= 3), and
         * there is no other revision filtering parameters.
         */
        if (rev.pending.nr ||
-           rev.min_age != -1 || rev.max_age != -1)
+           rev.min_age != -1 || rev.max_age != -1 ||
+           3 < rev.max_count)
                usage(diff_files_usage);
+
        /*
-        * Backward compatibility wart - "diff-files -s" used to
-        * defeat the common diff option "-s" which asked for
-        * DIFF_FORMAT_NO_OUTPUT.
+        * "diff-files --base -p" should not combine merges because it
+        * was not asked to.  "diff-files -c -p" should not densify
+        * (the user should ask with "diff-files --cc" explicitly).
         */
-       if (rev.diffopt.output_format == DIFF_FORMAT_NO_OUTPUT)
-               rev.diffopt.output_format = DIFF_FORMAT_RAW;
-       return run_diff_files(&rev, silent);
+       if (rev.max_count == -1 && !rev.combine_merges &&
+           (rev.diffopt.output_format & DIFF_FORMAT_PATCH))
+               rev.combine_merges = rev.dense_combined_merges = 1;
+
+       if (read_cache_preload(rev.diffopt.paths) < 0) {
+               perror("read_cache_preload");
+               return -1;
+       }
+       result = run_diff_files(&rev, options);
+       return diff_result_code(&rev.diffopt, result);
 }