cvsimport: perform string comparison on "HEAD"
[git.git] / diff-files.c
index 5c895cc..4d60017 100644 (file)
@@ -7,16 +7,18 @@
 #include "diff.h"
 
 static const char *diff_files_usage =
-"git-diff-files [-p] [-q] [-r] [-z] [-M] [-C] [-R] [-S<string>] [-O<orderfile>] [paths...]";
+"git-diff-files [-p] [-q] [-r] [-z] [-R] [-B] [-M] [-C] [--find-copies-harder] [-O<orderfile>] [-S<string>] [--pickaxe-all] [<path>...]";
 
 static int diff_output_format = DIFF_FORMAT_HUMAN;
 static int detect_rename = 0;
+static int find_copies_harder = 0;
 static int diff_setup_opt = 0;
 static int diff_score_opt = 0;
 static const char *pickaxe = NULL;
 static int pickaxe_opts = 0;
 static int diff_break_opt = -1;
 static const char *orderfile = NULL;
+static const char *diff_filter = NULL;
 static int silent = 0;
 
 static void show_unmerge(const char *path)
@@ -59,6 +61,8 @@ int main(int argc, const char **argv)
                        pickaxe = argv[1] + 2;
                else if (!strncmp(argv[1], "-O", 2))
                        orderfile = argv[1] + 2;
+               else if (!strncmp(argv[1], "--diff-filter=", 14))
+                       diff_filter = argv[1] + 14;
                else if (!strcmp(argv[1], "--pickaxe-all"))
                        pickaxe_opts = DIFF_PICKAXE_ALL;
                else if (!strncmp(argv[1], "-B", 2)) {
@@ -78,11 +82,16 @@ int main(int argc, const char **argv)
                                usage(diff_files_usage);
                        detect_rename = DIFF_DETECT_COPY;
                }
+               else if (!strcmp(argv[1], "--find-copies-harder"))
+                       find_copies_harder = 1;
                else
                        usage(diff_files_usage);
                argv++; argc--;
        }
 
+       if (find_copies_harder && detect_rename != DIFF_DETECT_COPY)
+               usage(diff_files_usage);
+
        /* At this point, if argc == 1, then we are doing everything.
         * Otherwise argv[1] .. argv[argc-1] have the explicit paths.
         */
@@ -119,19 +128,18 @@ int main(int argc, const char **argv)
                        continue;
                }
                changed = ce_match_stat(ce, &st);
-               if (!changed && detect_rename < DIFF_DETECT_COPY)
+               if (!changed && !find_copies_harder)
                        continue;
-
                oldmode = ntohl(ce->ce_mode);
                show_modified(oldmode, DIFF_FILE_CANON_MODE(st.st_mode),
-                             ce->sha1, null_sha1,
+                             ce->sha1, (changed ? null_sha1 : ce->sha1),
                              ce->name);
        }
        diffcore_std((1 < argc) ? argv + 1 : NULL,
                     detect_rename, diff_score_opt,
                     pickaxe, pickaxe_opts,
                     diff_break_opt,
-                    orderfile);
-       diff_flush(diff_output_format, 1);
+                    orderfile, diff_filter);
+       diff_flush(diff_output_format);
        return 0;
 }