Stefan Beller <sbeller@xxxxxxxxxx> writes: > Every once in a while someone complains to the mailing list to have > run into this weird assertion[1]. > > The usual response from the mailing list is link to old discussions[2], > and acknowledging the problem stating it is known. > > For now just improve the user visible error message. Thans. judging from the date: header I take this is meant as v3 that supersedes v2 done on Wednesday. It is not clear in the above that what this thing is. Given that we are de-asserting it, is the early part of the new code diagnosing an end-user error (i.e. you gave me a pathspec but that extends into a submodule which is a no-no)? The "was a submodule issue" comment added is "this is an end-user mistake, there is nothing to fix in the code"? I take that the new "BUG" thing tells the Git developers that no sane codepath should throw an pathspec_item that satisfies the condition of the if() statement for non-submodules? > diff --git a/pathspec.c b/pathspec.c > index 22ca74a126..b446d79615 100644 > --- a/pathspec.c > +++ b/pathspec.c > @@ -313,8 +313,23 @@ 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) { > + /* Historically this always was a submodule issue */ > + for (i = 0; i < active_nr; i++) { > + struct cache_entry *ce = active_cache[i]; > + int ce_len = ce_namelen(ce); > + int len = ce_len < item->len ? ce_len : item->len; > + if (!S_ISGITLINK(ce->ce_mode)) > + continue; Computation of ce_len and len are better done after this check, no? > + if (!memcmp(ce->name, item->match, len)) > + die (_("Pathspec '%s' is in submodule '%.*s'"), > + item->original, ce_len, ce->name); > + } > + /* The error is a new unknown bug */ > + die ("BUG: item->nowildcard_len > item->len || item->prefix > item->len)"); > + } > + > return magic; > } > > diff --git a/t/t6134-pathspec-in-submodule.sh b/t/t6134-pathspec-in-submodule.sh > new file mode 100755 > index 0000000000..e62dbb7327 > --- /dev/null > +++ b/t/t6134-pathspec-in-submodule.sh > @@ -0,0 +1,33 @@ > +#!/bin/sh > + > +test_description='test case exclude pathspec' > + > +. ./test-lib.sh > + > +test_expect_success 'setup a submodule' ' > + test_commit 1 && > + git submodule add ./ sub && Is this adding our own project as its submodule? It MIGHT be a handy hack when writing a test, but let's stop doing that insanity. No sane project does that in real life, doesn't it? Create a subdirectory, make it a repository, have a commit there and bind that as our own submodule. That would be a more normal way to start your own superproject and its submodule pair if they originate together at the same place. Better yet create a separate repository, have a commit there, and then pull it in with "git submodule add && git submodule init" into our repository. That would be the normal way to borrow somebody else's project as a part of your own superproject. > + git commit -a -m "add submodule" && > + git submodule deinit --all > +' > + > +cat <<EOF >expect > +fatal: Pathspec 'sub/a' is in submodule 'sub' > +EOF > + > +test_expect_success 'error message for path inside submodule' ' > + echo a >sub/a && > + test_must_fail git add sub/a 2>actual && > + test_cmp expect actual > +' > + > +cat <<EOF >expect > +fatal: Pathspec '.' is in submodule 'sub' > +EOF > + > +test_expect_success 'error message for path inside submodule from within submodule' ' > + test_must_fail git -C sub add . 2>actual && > + test_cmp expect actual > +' > + > +test_done