pathspec: simpler logic to prefix original pathspec elements
[gitweb.git] / 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 {