summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--pathspec.c18
-rwxr-xr-xt/t3703-add-magic-pathspec.sh8
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