On Tue, Nov 09, 2021 at 12:36:50PM -0800, Emily Shaffer wrote:
On Tue, Nov 09, 2021 at 01:42:03AM +0100, Ævar Arnfjörð Bjarmason wrote:
quoted
On Mon, Nov 08 2021, Emily Shaffer wrote:
quoted
On Fri, Nov 05, 2021 at 09:43:56AM +0100, Ævar Arnfjörð Bjarmason wrote:
quoted
On Thu, Nov 04 2021, Junio C Hamano wrote:
quoted
Emily Shaffer [off-list ref] writes:
quoted
A recorded hint path to the superproject's gitdir might be added during
'git submodule add', but in some cases - like submodules which were
created before 'git submodule add' learned to record that info - it might
be useful to update the hint. Let's do it during 'git submodule
update', when we already have a handle to the superproject while calling
operations on the submodules.
We are hearing repeated mention of "cache" and "hint". Do we ever
invalidate it, or if we have such a record, do we blindly trust it
and use it without verifying if it is still fresh?
Also, this step and the previous step both say we record gitdir on
their title, but we instead record common dir. Whichever is the
right choice to record, let's be consistent.
I had similar (AFAICT still unaddressed) feedback on the v2[1]. I'd lost
track of this series, and see one reason is that the In-Reply-Chain was
broken between v3..v4.
I.e. it seems to me that this whole thing started as a way to avoid
shellscript overhead by calling git-rev-parse from git-submodule.sh, but
now that the relevant bits are moved to C we could just call some
slightly adjusted code in setup.c.
No, that is not the case. It is the case that `git -C .. rev-parse
--git-dir` is *very* expensive in the case where `../` is not, in fact,
a gitdir; when I attempted another series which relied on finding the
parent superproject's gitdir in this way, our testsuite took something
like 5x longer to run than before. In other words, the expensive part is
not the shelling out overhead - the expensive part is searching up the
entire filesystem directory structure in the worst-case ("we are not a
submodule") scenario. This is still needed, even with 'git-submodule.sh'
moving to C.
Do you have that test code somewhere?
I messed around with it a little more, rebasing the no-caches-involved
older implementation and using an in-process lookup with
setup_git_directory_gently_1.
https://github.com/nasamuffin/git/tree/config-inheritance-no-cache
The recent experiments are in the tip commit, and the original series is
in the two commits prior if you're interested.
The upshot, though, is that I think there is still not a way around a
second subprocess. Before, we determined the superproject's gitdir like
so:
# Does a git project at .. think I belong to it?
git -C .. ls-files <args> -- path/to/submodule
# Where does that git project's gitdir live?
git -C .. rev-parse --absolute-git-dir
Even if we can do the second call in-process, we still will be
performing this ls-files call to ensure that the parent repo is actually
our superproject. (One good example of a time when the parent repo is
*not*: the entire Git test suite, where '/path/to/git/t/trash directory.t1234-abcd'
is not a submodule of '/path/to/git/.git'.)
We could reverse the checks, which will make this much less painful in
the real world, but will still slow down our test suites (and hopefully
you'll forgive me for combining C and bash so brazenly, but it's for
illustration purposes only):
# Is there a git project above us?
setup_git_directory_gently_1("..", out, 0);
# Does it think we're its submodule?
git -C $out rev-parse --absolute-git-dir
That will still result in an extra out-of-process call for every line in
the Git test suite, though, because of the trash directory layout.
I looked briefly at `git ls-files` // `cmd_ls_files()` and it's fairly
close to being callable on an arbitrary 'struct repository', but not
quite there. But I am pretty afraid of the rabbit hole ;)
Jonathan Nieder and Glen Choo pointed out that I can read in the index
to an arbitrary struct index_state from a path, and then call
'index_dir_exists()', so this part of it is not as scary as I thought.
I'll mess around today and see if I can come up with an in-process
version of 'get_superproject_working_tree()' and
'get_superproject_gitdir()'.
Thanks for the lead - a fine example of how useful it is to receive
high-level input from someone removed from the problem ;)
- Emily