diff options
-rw-r--r-- | pathspec.c | 18 | ||||
-rwxr-xr-x | t/t3703-add-magic-pathspec.sh | 8 |
2 files changed, 23 insertions, 3 deletions
diff --git a/pathspec.c b/pathspec.c index 0be5edbd13..5aea0fbf52 100644 --- a/pathspec.c +++ b/pathspec.c @@ -262,7 +262,6 @@ static unsigned prefix_pathspec(struct pathspec_item *item, } else item->original = elt; item->len = strlen(item->match); - item->prefix = prefixlen; if ((flags & PATHSPEC_STRIP_SUBMODULE_SLASH_CHEAP) && (item->len >= 1 && item->match[item->len - 1] == '/') && @@ -292,6 +291,15 @@ static unsigned prefix_pathspec(struct pathspec_item *item, elt, ce_len, ce->name); } + /* + * Adjust prefixlen if the above trailing slash stripping cuts + * into the prefix part + */ + if ((flags & (PATHSPEC_STRIP_SUBMODULE_SLASH_CHEAP | + PATHSPEC_STRIP_SUBMODULE_SLASH_EXPENSIVE)) && + prefixlen > item->len) + prefixlen = item->len; + if (magic & PATHSPEC_LITERAL) item->nowildcard_len = item->len; else { @@ -299,6 +307,7 @@ static unsigned prefix_pathspec(struct pathspec_item *item, if (item->nowildcard_len < prefixlen) item->nowildcard_len = prefixlen; } + item->prefix = prefixlen; item->flags = 0; if (magic & PATHSPEC_GLOB) { /* @@ -313,8 +322,11 @@ static unsigned prefix_pathspec(struct pathspec_item *item, } /* sanity checks, pathspec matchers assume these are sane */ - assert(item->nowildcard_len <= item->len && - item->prefix <= item->len); + if (!(item->nowildcard_len <= item->len && + item->prefix <= item->len)) + die("BUG: item->nowildcard_len (%d) or item->prefix (%d)" + " is longer than item->len (%d)", + item->nowildcard_len, item->prefix, item->len); return magic; } diff --git a/t/t3703-add-magic-pathspec.sh b/t/t3703-add-magic-pathspec.sh index 5115de7036..cced8c4a5e 100755 --- a/t/t3703-add-magic-pathspec.sh +++ b/t/t3703-add-magic-pathspec.sh @@ -55,4 +55,12 @@ test_expect_success COLON_DIR 'a file with the same (short) magic name exists' ' git add -n "./:/bar" ' +test_expect_success 'prefix is updated after trailing slash is stripped' ' + git init submodule && + ( cd submodule && test_commit test ) && + git add submodule && + mv submodule/.git submodule/dotgit && + ( cd submodule && git add . ) +' + test_done |