Merge refs/heads/master from .
[gitweb.git] / diff-helper.c
index 5ad2273bf063fb431f095de2d58ebdfb78814d3b..3fa50ee75b510c5396fe004160f80ddbe4955ca1 100644 (file)
@@ -7,11 +7,21 @@
 
 static const char *pickaxe = NULL;
 static int pickaxe_opts = 0;
+static const char *orderfile = NULL;
+static const char *diff_filter = NULL;
 static int line_termination = '\n';
 static int inter_name_termination = '\t';
 
-static const char *diff_helper_usage =
-       "git-diff-helper [-z] [-S<string>] paths...";
+static void flush_them(int ac, const char **av)
+{
+       diffcore_std_no_resolve(av + 1,
+                               pickaxe, pickaxe_opts,
+                               orderfile, diff_filter);
+       diff_flush(DIFF_FORMAT_PATCH, '\n');
+}
+
+static const char diff_helper_usage[] =
+"git-diff-helper [-z] [-O<orderfile>] [-S<string>] [--pickaxe-all] [<path>...]";
 
 int main(int ac, const char **av) {
        struct strbuf sb;
@@ -27,6 +37,10 @@ int main(int ac, const char **av) {
                }
                else if (!strcmp(av[1], "--pickaxe-all"))
                        pickaxe_opts = DIFF_PICKAXE_ALL;
+               else if (!strncmp(av[1], "--diff-filter=", 14))
+                       diff_filter = av[1] + 14;
+               else if (!strncmp(av[1], "-O", 2))
+                       orderfile = av[1] + 2;
                else
                        usage(diff_helper_usage);
                ac--; av++;
@@ -80,17 +94,17 @@ int main(int ac, const char **av) {
                        if (!strchr("MCRNDU", status))
                                break;
                        two_paths = score = 0;
-                       if (status == 'R' || status == 'C') {
+                       if (status == DIFF_STATUS_RENAMED ||
+                           status == DIFF_STATUS_COPIED)
                                two_paths = 1;
-                               sscanf(cp, "%d", &score);
-                               if (line_termination) {
-                                       cp = strchr(cp,
-                                                   inter_name_termination);
-                                       if (!cp)
-                                               break;
-                               }
-                       }
 
+                       /* pick up score if exists */
+                       if (sscanf(cp, "%d", &score) != 1)
+                               score = 0;
+                       cp = strchr(cp,
+                                   inter_name_termination);
+                       if (!cp)
+                               break;
                        if (*cp++ != inter_name_termination)
                                break;
 
@@ -132,17 +146,9 @@ int main(int ac, const char **av) {
                                          new_path);
                        continue;
                }
-               if (1 < ac)
-                       diffcore_pathspec(av + 1);
-               if (pickaxe)
-                       diffcore_pickaxe(pickaxe, pickaxe_opts);
-               diff_flush(DIFF_FORMAT_PATCH, 0);
+               flush_them(ac, av);
                printf(garbage_flush_format, sb.buf);
        }
-       if (1 < ac)
-               diffcore_pathspec(av + 1);
-       if (pickaxe)
-               diffcore_pickaxe(pickaxe, pickaxe_opts);
-       diff_flush(DIFF_FORMAT_PATCH, 0);
+       flush_them(ac, av);
        return 0;
 }