This allows us to replace the submodule path trailing slash removal in builtin/rm.c with the PATHSPEC_STRIP_SUBMODULE_SLASH_CHEAP flag to parse_pathspec() without changing the behaviour with respect to multiple trailing slashes. Signed-off-by: John Keeping <john@xxxxxxxxxxxxx> --- pathspec.c | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/pathspec.c b/pathspec.c index 7c6963b..11b031a 100644 --- a/pathspec.c +++ b/pathspec.c @@ -251,12 +251,16 @@ static unsigned prefix_pathspec(struct pathspec_item *item, item->len = strlen(item->match); item->prefix = prefixlen; - if ((flags & PATHSPEC_STRIP_SUBMODULE_SLASH_CHEAP) && - (item->len >= 1 && is_dir_sep(item->match[item->len - 1])) && - (i = cache_name_pos(item->match, item->len - 1)) >= 0 && - S_ISGITLINK(active_cache[i]->ce_mode)) { - item->len--; - match[item->len] = '\0'; + if (flags & PATHSPEC_STRIP_SUBMODULE_SLASH_CHEAP) { + size_t pathlen = item->len; + while (pathlen > 0 && is_dir_sep(item->match[pathlen - 1])) + pathlen--; + + if ((i = cache_name_pos(item->match, pathlen)) >= 0 && + S_ISGITLINK(active_cache[i]->ce_mode)) { + item->len = pathlen; + match[item->len] = '\0'; + } } if (flags & PATHSPEC_STRIP_SUBMODULE_SLASH_EXPENSIVE) @@ -271,11 +275,14 @@ static unsigned prefix_pathspec(struct pathspec_item *item, !is_dir_sep(match[ce_len]) || memcmp(ce->name, match, ce_len)) continue; - if (item->len == ce_len + 1) { - /* strip trailing slash */ + + while (item->len > 0 && is_dir_sep(match[item->len - 1])) item->len--; - match[item->len] = '\0'; - } else + + /* strip trailing slash */ + match[item->len] = '\0'; + + if (item->len != ce_len) die (_("Pathspec '%s' is in submodule '%.*s'"), elt, ce_len, ce->name); } -- 1.8.4.277.gfbd6843.dirty -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html