git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Jeff King <peff@peff.net>
To: Junio C Hamano <gitster@pobox.com>
Cc: "Paolo Pettinato (ppettina)" <ppettina@cisco.com>,
	"git@vger.kernel.org" <git@vger.kernel.org>
Subject: Re: Git fetch bug in git 2.21+ "Could not access submodule '%s'"
Date: Wed, 14 Aug 2019 15:31:10 -0400	[thread overview]
Message-ID: <20190814193110.GA31218@sigill.intra.peff.net> (raw)
In-Reply-To: <xmqqpnl766pj.fsf@gitster-ct.c.googlers.com>

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

  parent reply	other threads:[~2019-08-14 19:31 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-08-14  9:57 Git fetch bug in git 2.21+ "Could not access submodule '%s'" Paolo Pettinato (ppettina)
2019-08-14 15:36 ` Jeff King
2019-08-14 16:40   ` Junio C Hamano
2019-08-14 17:03     ` Paolo Pettinato (ppettina)
2019-08-14 17:56       ` Junio C Hamano
2019-08-14 19:31     ` Jeff King [this message]
2019-08-14 15:59 ` [PATCH] get_next_submodule(): format error string as an error Jeff King
2019-08-14 16:15   ` Junio C Hamano

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

  List information: http://vger.kernel.org/majordomo-info.html

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

  git send-email \
    --in-reply-to=20190814193110.GA31218@sigill.intra.peff.net \
    --to=peff@peff.net \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=ppettina@cisco.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.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

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 read-only IMAP folder(s) and NNTP newsgroup(s).