Re: Git fetch bug in git 2.21+ "Could not access submodule '%s'"

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Aug 14, 2019 at 09:40:40AM -0700, Junio C Hamano wrote:

> > but it feels odd to me. Even if the submodule is not currently checked
> > out, we'd presumably still want to do the recursive fetch as long as we
> > have a repo under $GIT_DIR/modules?
> 
> ... which means that we are not interested in "is it populated?" but
> in "have we done 'git submodule init' to show interest in it?".  But
> since we are walking the in-core index and picking only the gitlink
> entries in it in the early part of this loop, we know ce cannot be
> anything but a submodule at this point, so we will not be in the "we
> are interesteed in the submodule, but the current HEAD and index is
> at a commit that does not have it, hence $GIT_DIR/modules/ is the
> only place that knows about it" situation.  If we are interested in
> it enough to have a repository stashed under $GIT_DIR/modules/, we
> should have a submodule there, shouldn't we?

Yeah, as I was writing the above I too was wondering whether this was a
case that could even happen. So it may be that the two ways of asking
the question end up the same in practice.

> What I do not quite get is that repo_submodule_init(), which is
> called by get_submodule_repo_for(), looks into $GIT_DIR/modules/,
> according to the in-code comment of that function.  So "we cannot
> get the repo for it, which is an error condition, but we will
> complain only for non-empty directory" logic feels iffy.

Right. This whole non-empty directory thing _feels_ like a hack that was
added to paper over the fact that get_submodule_repo_for() does not
distinguish between "nope, this module is not active" and "an error
occurred".

Given that any real errors there would come from
read_and_verify_repository_format(), which generates its own error
messages, I wonder if we should simply quietly ignore any entries for
which get_submodule_repo_for() returns NULL. I suppose that would impact
our exit code, though (i.e., a real broken submodule would not cause the
outer fetch to exit with a non-zero code).

Probably that could be dealt with by having get_submodule_repo_for()
return a tristate enum: a working struct, an error, or ENOENT. Actually,
I guess we could set errno. ;)

It's not clear to me, though, that the rest of the functions are
distinguishing between "broken repo at submodule path" and "no such
submodule". For instance, get_submodule_repo_for() itself will happily
hit a fallback path if repo_submodule_init() returns an error. That
would really only want to trigger on this ENOENT-equivalent case.

> Stepping back even a bit more, "an empty directory is normal" makes
> some sense.  If the user or the build system created a non-directory
> at a path where a populated submodule would sit, that would not be
> good.  If the user or the build system created a random file in the
> unpopulated empty directory, in which the working tree files of the
> submodule would be created once the submodule getspopulated, that
> would be equally bad, wouldn't it?  Why is the user mucking with
> that directory in the first place, and isn't the flagging of the
> situation as an error, done with 26f80ccf ("submodule: migrate
> get_next_submodule to use repository structs", 2018-11-28), a
> bugfix?  If not, why not?

I agree that the user putting things in that directory is kind of weird.
It just seems odd that fetch, which doesn't at all care about the
working tree, would be the thing to complain about it.

-Peff



[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux