git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Stefan Beller <sbeller@google.com>
To: Junio C Hamano <gitster@pobox.com>
Cc: Chris Packham <judge.packham@gmail.com>, GIT <git@vger.kernel.org>
Subject: Re: [bug] assertion in 2.8.4 triggering on old-ish worktree
Date: Thu, 16 Jun 2016 12:48:11 -0700	[thread overview]
Message-ID: <CAGZ79kZaZCwZ-cesB_voq0s0Qt+ipcgb6TkdzLE+EWSF_qRj7A@mail.gmail.com> (raw)
In-Reply-To: <xmqqbn31581d.fsf@gitster.mtv.corp.google.com>

On Thu, Jun 16, 2016 at 10:59 AM, Junio C Hamano <gitster@pobox.com> wrote:
> Chris Packham <judge.packham@gmail.com> writes:
>
>> On Thu, Jun 16, 2016 at 4:59 PM, Chris Packham <judge.packham@gmail.com> wrote:
>>> Hi All,
>>>
>>> I have the git-sh-prompt configured in my .bashrc today I visited an
>>> old worktree that I haven't really touched in a few years (sorry can't
>>> remember the git version I was using back then). I received the
>>> following output when changing to the directory
>>>
>>> git: pathspec.c:317: prefix_pathspec: Assertion `item->nowildcard_len
>>> <= item->len && item->prefix <= item->len' failed.
>>>
>>> I assume it's one of the git invocations in git-sh-prompt that's
>>> hitting the assertion. Any thoughts on what might be triggering it?
>>> Any debug I can gather?
>>
>> A bit more info. The directory in question is a uninitialised
>> submodule. It doesn't trigger in the root of the parent project.
>
>
> Sounds like
> http://article.gmane.org/gmane.comp.version-control.git/283549
>

I looked into this. In pathspec.c#prefix_pathspec (the function
that has this assertion at the end), the assertion can only
trigger if PATHSPEC_STRIP_SUBMODULE_SLASH_EXPENSIVE
or PATHSPEC_STRIP_SUBMODULE_SLASH_CHEAP was given
as these are the only places that reduce item->len.

I converted the example test case to follow our test syntax
(module tab/whitespace issues):

test_expect_success 'remove submodule and add its files' '
    mkdir test &&
    (
        cd test &&
        git init sub &&
        (
            cd sub &&
            touch foo &&
            git add foo &&
            git commit -m "foo"
        ) &&
        git init &&
        git add sub &&
        rm -rf sub/.git &&
        (
            cd sub &&
            git add .
        )
    )
'

And the issue here is that the submodule $GIT_DIR
was removed, so that the "git add ." was called with
the parents $GIT_DIR, and a prefix of sub/
(the slash will be removed in PATHSPEC_STRIP_SUBMODULE_SLASH...)
such that the length will be 3 ("sub") and the other
(prefix, nowildcard_len) are still 4.

One fix would be to adjust prefix and nowildcard_len
as well (in case they were as long as len, and now are
overlength, if they were shorter, no need to cut off one)

However I think that is missleading.

So let's step back a bit and think about what should happen
in the test case above. I think the users intent may be

    "remove the submodule and add the files
    directly to the regular tree".

However this would not happen in case we do the quickfix
of cutting one off prefix and nowildcard_len, because
we have similar thing as a D/F (directory/file) conflict,
just that it is a TREE/SUBMODULE conflict.

In the parent project there is still a submodule recorded for
sub/ but the user wants it to be a tree, so we would have
to rewrite that.

Using "rm -rf sub/.git" is a bad UI for saying " I want this to be
a native tree/blobs instead of a submodule", so I would expect
that we need to have another command there eventually
(git submodule convert-to-subtree ?)

Regarding the assert:
We are sure it's a submodule related thing, so we can
have a quite narrow warning there, roughly:

diff --git a/pathspec.c b/pathspec.c
index c9e9b6c..d0ea87a 100644
--- a/pathspec.c
+++ b/pathspec.c
@@ -313,8 +313,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 (_("Path leads inside submodule '%s', but the submodule "
+                      "was not recognized, i.e. not initialized or deleted"),
+                      ce->name);
        return magic;
 }

  reply	other threads:[~2016-06-16 19:48 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-06-16  4:59 [bug] assertion in 2.8.4 triggering on old-ish worktree Chris Packham
2016-06-16  5:02 ` Chris Packham
2016-06-16 16:31   ` Stefan Beller
2016-06-16 16:55   ` Dennis Kaarsemaker
2016-06-16 16:59     ` Stefan Beller
2016-06-16 17:59   ` Junio C Hamano
2016-06-16 19:48     ` Stefan Beller [this message]
2016-06-17  2:41       ` Chris Packham

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAGZ79kZaZCwZ-cesB_voq0s0Qt+ipcgb6TkdzLE+EWSF_qRj7A@mail.gmail.com \
    --to=sbeller@google.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=judge.packham@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).