git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 2/3] split-index: accept that a base index can be empty

From
Junio C Hamano <gitster@pobox.com>
Date
Jun 29, 2023, 19:02 UTC
Message-ID
<xmqqcz1e9jny.fsf@gitster.g>
In-Reply-To
<81118ce106222993ef17586fb0f249d8319f3b90.1688044991.git.gitgitgadget@gmail.com>

"Johannes Schindelin via GitGitGadget" <gitgitgadget@gmail.com> writes:

Show 10 quoted lines
> 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.
Show 30 quoted lines
> 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);
Previous: Johannes Schindelin via GitGitGadgetNext: Johannes Schindelin via GitGitGadget
Message 4 of 6 in “commit -a -m: allow the top-level tree to become empty again”
  1. 0/3 commit -a -m: allow the top-level tree to become empty againJohannes Schindelin via GitGitGadget, Jun 29, 2023
  2. 1/3 do_read_index(): always mark index as initialized unless erroring outJohannes Schindelin via GitGitGadget, Jun 29, 2023
  3. 2/3 split-index: accept that a base index can be emptyJohannes Schindelin via GitGitGadget, Jun 29, 2023
  4. Junio C HamanoJun 29, 2023
  5. 3/3 commit -a -m: allow the top-level tree to become empty againJohannes Schindelin via GitGitGadget, Jun 29, 2023
  6. Junio C HamanoJun 29, 2023

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.