Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> writes: > @@ -546,10 +546,16 @@ void parse_pathspec(struct pathspec *pathspec, > pathspec->magic |= item[i].magic; > } > > - if (nr_exclude == n) > - die(_("There is nothing to exclude from by :(exclude) patterns.\n" > - "Perhaps you forgot to add either ':/' or '.' ?")); > - > + /* > + * If everything is an exclude pattern, add one positive pattern > + * that matches everyting. We allocated an extra one for this. > + */ > + if (nr_exclude == n) { > + if (!(flags & PATHSPEC_PREFER_CWD)) > + prefixlen = 0; > + init_pathspec_item(item + n, 0, prefix, prefixlen, ""); > + pathspec->nr++; > + } > > if (pathspec->magic & PATHSPEC_MAXDEPTH) { > if (flags & PATHSPEC_KEEP_ORDER) Thanks. Even though the current code does not refer to the original prefixlen after the added hunk, I'd prefer not to destroy it to avoid future troubles, so I'll queue with a bit of tweak there, perhaps like the attached. Also this has an obvious fallout to the tests, whose (minimum) fix is rather trivial. Thanks. pathspec.c | 7 +++---- t/t6132-pathspec-exclude.sh | 6 ++++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/pathspec.c b/pathspec.c index d8f78088c8..b961f00c8c 100644 --- a/pathspec.c +++ b/pathspec.c @@ -522,7 +522,7 @@ void parse_pathspec(struct pathspec *pathspec, } pathspec->nr = n; - ALLOC_ARRAY(pathspec->items, n+1); + ALLOC_ARRAY(pathspec->items, n + 1); item = pathspec->items; prefixlen = prefix ? strlen(prefix) : 0; @@ -551,9 +551,8 @@ void parse_pathspec(struct pathspec *pathspec, * that matches everyting. We allocated an extra one for this. */ if (nr_exclude == n) { - if (!(flags & PATHSPEC_PREFER_CWD)) - prefixlen = 0; - init_pathspec_item(item + n, 0, prefix, prefixlen, ""); + int plen = (!(flags & PATHSPEC_PREFER_CWD)) ? 0 : prefixlen; + init_pathspec_item(item + n, 0, prefix, plen, ""); pathspec->nr++; } diff --git a/t/t6132-pathspec-exclude.sh b/t/t6132-pathspec-exclude.sh index d51595cf6b..9dd5cde5fc 100755 --- a/t/t6132-pathspec-exclude.sh +++ b/t/t6132-pathspec-exclude.sh @@ -25,8 +25,10 @@ EOF test_cmp expect actual ' -test_expect_success 'exclude only should error out' ' - test_must_fail git log --oneline --format=%s -- ":(exclude)sub" +test_expect_success 'exclude only no longer errors out' ' + git log --oneline --format=%s -- . ":(exclude)sub" >expect && + git log --oneline --format=%s -- ":(exclude)sub" >actual && + test_cmp expect actual ' test_expect_success 't_e_i() exclude sub' '