pathspec: simpler logic to prefix original pathspec elements
authorBrandon Williams <bmwill@google.com>
Wed, 4 Jan 2017 18:04:04 +0000 (10:04 -0800)
committerJunio C Hamano <gitster@pobox.com>
Mon, 9 Jan 2017 02:04:17 +0000 (18:04 -0800)
The logic used to prefix an original pathspec element with 'prefix'
magic is more general purpose and can be used for more than just short
magic. Remove the extra code paths and rename 'prefix_short_magic' to
'prefix_magic' to better indicate that it can be used in more general
situations.

Also, slightly change the logic which decides when to prefix the
original element in order to prevent a pathspec of "." from getting
converted to "" (empty string).

Signed-off-by: Brandon Williams <bmwill@google.com>
Reviewed-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
pathspec.c
index 5df364bc69010c0039bfdf7706dd094e3f5f9b8a..af7f2d01d55333fa4e7ea89203f638ccbebb1e52 100644 (file)
@@ -74,13 +74,12 @@ static struct pathspec_magic {
        { PATHSPEC_EXCLUDE, '!', "exclude" },
 };
 
-static void prefix_short_magic(struct strbuf *sb, int prefixlen,
-                              unsigned short_magic)
+static void prefix_magic(struct strbuf *sb, int prefixlen, unsigned magic)
 {
        int i;
        strbuf_addstr(sb, ":(");
        for (i = 0; i < ARRAY_SIZE(pathspec_magic); i++)
-               if (short_magic & pathspec_magic[i].bit) {
+               if (magic & pathspec_magic[i].bit) {
                        if (sb->buf[sb->len - 1] != '(')
                                strbuf_addch(sb, ',');
                        strbuf_addstr(sb, pathspec_magic[i].name);
@@ -109,8 +108,8 @@ static unsigned prefix_pathspec(struct pathspec_item *item, unsigned flags,
        static int glob_global = -1;
        static int noglob_global = -1;
        static int icase_global = -1;
-       unsigned magic = 0, short_magic = 0, global_magic = 0;
-       const char *copyfrom = elt, *long_magic_end = NULL;
+       unsigned magic = 0, element_magic = 0, global_magic = 0;
+       const char *copyfrom = elt;
        char *match;
        int i, pathspec_prefix = -1;
 
@@ -164,7 +163,7 @@ static unsigned prefix_pathspec(struct pathspec_item *item, unsigned flags,
                        for (i = 0; i < ARRAY_SIZE(pathspec_magic); i++) {
                                if (strlen(pathspec_magic[i].name) == len &&
                                    !strncmp(pathspec_magic[i].name, copyfrom, len)) {
-                                       magic |= pathspec_magic[i].bit;
+                                       element_magic |= pathspec_magic[i].bit;
                                        break;
                                }
                                if (starts_with(copyfrom, "prefix:")) {
@@ -183,7 +182,6 @@ static unsigned prefix_pathspec(struct pathspec_item *item, unsigned flags,
                }
                if (*copyfrom != ')')
                        die(_("Missing ')' at the end of pathspec magic in '%s'"), elt);
-               long_magic_end = copyfrom;
                copyfrom++;
        } else {
                /* shorthand */
@@ -196,7 +194,7 @@ static unsigned prefix_pathspec(struct pathspec_item *item, unsigned flags,
                                break;
                        for (i = 0; i < ARRAY_SIZE(pathspec_magic); i++)
                                if (pathspec_magic[i].mnemonic == ch) {
-                                       short_magic |= pathspec_magic[i].bit;
+                                       element_magic |= pathspec_magic[i].bit;
                                        break;
                                }
                        if (ARRAY_SIZE(pathspec_magic) <= i)
@@ -207,7 +205,7 @@ static unsigned prefix_pathspec(struct pathspec_item *item, unsigned flags,
                        copyfrom++;
        }
 
-       magic |= short_magic;
+       magic |= element_magic;
 
        /* --noglob-pathspec adds :(literal) _unless_ :(glob) is specified */
        if (noglob_global && !(magic & PATHSPEC_GLOB))
@@ -242,18 +240,13 @@ static unsigned prefix_pathspec(struct pathspec_item *item, unsigned flags,
         * Prefix the pathspec (keep all magic) and assign to
         * original. Useful for passing to another command.
         */
-       if (flags & PATHSPEC_PREFIX_ORIGIN) {
+       if ((flags & PATHSPEC_PREFIX_ORIGIN) &&
+           prefixlen && !literal_global) {
                struct strbuf sb = STRBUF_INIT;
-               if (prefixlen && !literal_global) {
-                       /* Preserve the actual prefix length of each pattern */
-                       if (short_magic)
-                               prefix_short_magic(&sb, prefixlen, short_magic);
-                       else if (long_magic_end) {
-                               strbuf_add(&sb, elt, long_magic_end - elt);
-                               strbuf_addf(&sb, ",prefix:%d)", prefixlen);
-                       } else
-                               strbuf_addf(&sb, ":(prefix:%d)", prefixlen);
-               }
+
+               /* Preserve the actual prefix length of each pattern */
+               prefix_magic(&sb, prefixlen, element_magic);
+
                strbuf_addstr(&sb, match);
                item->original = strbuf_detach(&sb, NULL);
        } else {