Teach diff machinery to display other prefixes than "a/" and "b/"
authorJohannes Schindelin <Johannes.Schindelin@gmx.de>
Tue, 18 Dec 2007 19:32:14 +0000 (19:32 +0000)
committerJunio C Hamano <gitster@pobox.com>
Thu, 20 Dec 2007 09:10:39 +0000 (01:10 -0800)
With the new options "--src-prefix=<prefix>", "--dst-prefix=<prefix>"
and "--no-prefix", you can now control the path prefixes of the diff
machinery.  These used to by hardwired to "a/" for the source prefix
and "b/" for the destination prefix.

Initial patch by Pascal Obry.  Sane option names suggested by Linus.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/diff-options.txt
diff.c
diff.h

index 9ecc1d7bc460dd723ae08618b0deab88e407114f..1a78635fbae314e5b6bc02571b573c4bfdba5e29 100644 (file)
@@ -211,5 +211,14 @@ endif::git-format-patch[]
 --no-ext-diff::
        Disallow external diff drivers.
 
+--src-prefix=<prefix>::
+       Show the given source prefix instead of "a/".
+
+--dst-prefix=<prefix>::
+       Show the given destination prefix instead of "b/".
+
+--no-prefix::
+       Do not show any source or destination prefix.
+
 For more detailed explanation on these common options, see also
 link:diffcore.html[diffcore documentation].
diff --git a/diff.c b/diff.c
index e26584cdfc2476ba84ccf5ffb43736a8f280df9b..61fd49236ad505abb6a62b8b014efd6a9ddbff6b 100644 (file)
--- a/diff.c
+++ b/diff.c
@@ -290,9 +290,10 @@ static void emit_rewrite_diff(const char *name_a,
                              const char *name_b,
                              struct diff_filespec *one,
                              struct diff_filespec *two,
-                             int color_diff)
+                             struct diff_options *o)
 {
        int lc_a, lc_b;
+       int color_diff = DIFF_OPT_TST(o, COLOR_DIFF);
        const char *name_a_tab, *name_b_tab;
        const char *metainfo = diff_get_color(color_diff, DIFF_METAINFO);
        const char *fraginfo = diff_get_color(color_diff, DIFF_FRAGINFO);
@@ -309,9 +310,9 @@ static void emit_rewrite_diff(const char *name_a,
        diff_populate_filespec(two, 0);
        lc_a = count_lines(one->data, one->size);
        lc_b = count_lines(two->data, two->size);
-       printf("%s--- a/%s%s%s\n%s+++ b/%s%s%s\n%s@@ -",
-              metainfo, name_a, name_a_tab, reset,
-              metainfo, name_b, name_b_tab, reset, fraginfo);
+       printf("%s--- %s%s%s%s\n%s+++ %s%s%s%s\n%s@@ -",
+              metainfo, o->a_prefix, name_a, name_a_tab, reset,
+              metainfo, o->b_prefix, name_b, name_b_tab, reset, fraginfo);
        print_line_count(lc_a);
        printf(" +");
        print_line_count(lc_b);
@@ -1212,8 +1213,8 @@ static void builtin_diff(const char *name_a,
        const char *set = diff_get_color_opt(o, DIFF_METAINFO);
        const char *reset = diff_get_color_opt(o, DIFF_RESET);
 
-       a_one = quote_two("a/", name_a + (*name_a == '/'));
-       b_two = quote_two("b/", name_b + (*name_b == '/'));
+       a_one = quote_two(o->a_prefix, name_a + (*name_a == '/'));
+       b_two = quote_two(o->b_prefix, name_b + (*name_b == '/'));
        lbl[0] = DIFF_FILE_VALID(one) ? a_one : "/dev/null";
        lbl[1] = DIFF_FILE_VALID(two) ? b_two : "/dev/null";
        printf("%sdiff --git %s %s%s\n", set, a_one, b_two, reset);
@@ -1242,8 +1243,7 @@ static void builtin_diff(const char *name_a,
                if ((one->mode ^ two->mode) & S_IFMT)
                        goto free_ab_and_return;
                if (complete_rewrite) {
-                       emit_rewrite_diff(name_a, name_b, one, two,
-                                       DIFF_OPT_TST(o, COLOR_DIFF));
+                       emit_rewrite_diff(name_a, name_b, one, two, o);
                        o->found_changes = 1;
                        goto free_ab_and_return;
                }
@@ -2020,6 +2020,9 @@ void diff_setup(struct diff_options *options)
        else
                DIFF_OPT_CLR(options, COLOR_DIFF);
        options->detect_rename = diff_detect_rename_default;
+
+       options->a_prefix = "a/";
+       options->b_prefix = "b/";
 }
 
 int diff_setup_done(struct diff_options *options)
@@ -2291,6 +2294,12 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac)
                else if (40 < options->abbrev)
                        options->abbrev = 40;
        }
+       else if (!prefixcmp(arg, "--src-prefix="))
+               options->a_prefix = arg + 13;
+       else if (!prefixcmp(arg, "--dst-prefix="))
+               options->b_prefix = arg + 13;
+       else if (!strcmp(arg, "--no-prefix"))
+               options->a_prefix = options->b_prefix = "";
        else
                return 0;
        return 1;
diff --git a/diff.h b/diff.h
index 7e8000a5d7ed7b36669abaca38111c43038092aa..beccf85962b3f4cca9fa6b668fa904b59efbed52 100644 (file)
--- a/diff.h
+++ b/diff.h
@@ -69,6 +69,7 @@ struct diff_options {
        const char *orderfile;
        const char *pickaxe;
        const char *single_follow;
+       const char *a_prefix, *b_prefix;
        unsigned flags;
        int context;
        int break_opt;