From: Junio C Hamano <gitster@pobox.com>
To: "Johannes Schindelin via GitGitGadget" <gitgitgadget@gmail.com>
Cc: git@vger.kernel.org, Johannes Schindelin <johannes.schindelin@gmx.de>
Subject: Re: [PATCH 2/3] split-index: accept that a base index can be empty
Date: Thu, 29 Jun 2023 12:02:09 -0700 [thread overview]
Message-ID: <xmqqcz1e9jny.fsf@gitster.g> (raw)
In-Reply-To: <81118ce106222993ef17586fb0f249d8319f3b90.1688044991.git.gitgitgadget@gmail.com> (Johannes Schindelin via GitGitGadget's message of "Thu, 29 Jun 2023 13:23:09 +0000")
"Johannes Schindelin via GitGitGadget" <gitgitgadget@gmail.com>
writes:
> From: Johannes Schindelin <johannes.schindelin@gmx.de>
>
> We are about to fix an ancient bug where `do_read_index()` pretended
> that the index was not initialized when there are no index entries.
>
> Before the `index_state` structure gained the `initialized` flag in
> 913e0e99b6a (unpack_trees(): protect the handcrafted in-core index from
> read_cache(), 2008-08-23), that was the best we could do (even if it was
> incorrect: it is totally possible to read a Git index file that contains
> no index entries).
Yeah, I very much remember how that single bit made our live much
easier.
> This pattern was repeated also in 998330ac2e7 (read-cache: look for
> shared index files next to the index, too, 2021-08-26), which we fix
> here by _not_ mistaking an empty base index for a missing
> `sharedindex.*` file.
Ahh, this is in the codepath to deal with a separate worktree. We
allow sharing of the "sharedindex.*" file across worktrees and
entries read from the "index" files from individual worktrees to
overlay it. But we also do allow worktrees to have their own
"sharedindex.*" file, which is what the commit in question wanted to
do, and the way it (wanted to) implement was
- check the "gitdir" version first, as before
- if that did not exist, then look at the one next to "index"
but "if that did not exist" was implemented incorrectly and did not
account for the case where that "gitdir" version was an empty index.
So, instead, updated code checks and reads the "gitdir" version *if*
the file exists, regardless of how many entries there are in it.
Makes sense.
> Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
> ---
> read-cache.c | 14 ++++++++------
> 1 file changed, 8 insertions(+), 6 deletions(-)
>
> diff --git a/read-cache.c b/read-cache.c
> index b10caa9831c..e15a472f54f 100644
> --- a/read-cache.c
> +++ b/read-cache.c
> @@ -2455,12 +2455,14 @@ int read_index_from(struct index_state *istate, const char *path,
>
> base_oid_hex = oid_to_hex(&split_index->base_oid);
> base_path = xstrfmt("%s/sharedindex.%s", gitdir, base_oid_hex);
> - trace2_region_enter_printf("index", "shared/do_read_index",
> - the_repository, "%s", base_path);
> - ret = do_read_index(split_index->base, base_path, 0);
> - trace2_region_leave_printf("index", "shared/do_read_index",
> - the_repository, "%s", base_path);
> - if (!ret) {
> + if (file_exists(base_path)) {
> + trace2_region_enter_printf("index", "shared/do_read_index",
> + the_repository, "%s", base_path);
> +
> + ret = do_read_index(split_index->base, base_path, 0);
> + trace2_region_leave_printf("index", "shared/do_read_index",
> + the_repository, "%s", base_path);
> + } else {
> char *path_copy = xstrdup(path);
> char *base_path2 = xstrfmt("%s/sharedindex.%s",
> dirname(path_copy), base_oid_hex);
next prev parent reply other threads:[~2023-06-29 19:06 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-06-29 13:23 [PATCH 0/3] commit -a -m: allow the top-level tree to become empty again Johannes Schindelin via GitGitGadget
2023-06-29 13:23 ` [PATCH 1/3] do_read_index(): always mark index as initialized unless erroring out Johannes Schindelin via GitGitGadget
2023-06-29 13:23 ` [PATCH 2/3] split-index: accept that a base index can be empty Johannes Schindelin via GitGitGadget
2023-06-29 19:02 ` Junio C Hamano [this message]
2023-06-29 13:23 ` [PATCH 3/3] commit -a -m: allow the top-level tree to become empty again Johannes Schindelin via GitGitGadget
2023-06-29 19:17 ` 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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqqcz1e9jny.fsf@gitster.g \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=gitgitgadget@gmail.com \
--cc=johannes.schindelin@gmx.de \
/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).