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

Re: [PATCH v3 2/6] stash: remove the second index in stash_working_tree()

From
Junio C Hamano <gitster@pobox.com>
Date
Jul 31, 2020, 18:26 UTC
Message-ID
<xmqqy2mz35i6.fsf@gitster.c.googlers.com>
In-Reply-To
<20200731165140.29197-3-alban.gruin@gmail.com>
Alban Gruin <alban.gruin@gmail.com> writes:
> This removes the second index used in stash_working_tree() to simplify
> the code.

Continuing what I said for [0/6], say "the second index file" to clarify the distinction between the in-core index and on-disk index files to avoid confusion.

Show 9 quoted lines
>  	init_revisions(&rev, NULL);
>  	copy_pathspec(&rev.prune_data, ps);
>  
> -	set_alternate_index_output(stash_index_path.buf);
>  	if (reset_tree(&info->i_tree, 0, 0)) {
>  		ret = -1;
>  		goto done;
>  	}
> -	set_alternate_index_output(NULL);

Hmph. So at this point i_tree is what is in the index, we reset the working tree to it with reset_tree(), and instead of writing to $TMPindex, we let reset_tree() clobber the main on-disk index but we do not care because the result is supposed to be the same as what was originally in the index anyway?

Show 9 quoted lines
> @@ -1091,8 +1088,6 @@ static int stash_working_tree(struct stash_info *info, const struct pathspec *ps
>  	argv_array_pushl(&cp_upd_index.args, "update-index",
>  			 "--ignore-skip-worktree-entries",
>  			 "-z", "--add", "--remove", "--stdin", NULL);
> -	argv_array_pushf(&cp_upd_index.env_array, "GIT_INDEX_FILE=%s",
> -			 stash_index_path.buf);
>  
>  	if (pipe_command(&cp_upd_index, diff_output.buf, diff_output.len,
>  			 NULL, 0, NULL, 0)) {

And then the new code now lets "update-index" work directly on the main index (which does make an observable difference to the outside world, but we are not letting any hook to look at this intermediate state, so it might be OK---I cannot tell at this point in the code).

Show 9 quoted lines
> @@ -1100,19 +1095,16 @@ static int stash_working_tree(struct stash_info *info, const struct pathspec *ps
>  		goto done;
>  	}
>  
> -	if (write_index_as_tree(&info->w_tree, &istate, stash_index_path.buf, 0,
> -				NULL)) {
> +	discard_cache();
> +	if (write_cache_as_tree(&info->w_tree, 0, NULL) ||
> +	    reset_tree(&info->i_tree, 0, 1))

We used to read from $TMPindex, which has been updated with the contents of files modified in the working tree, and write its content out as a tree object, grabbing its object name into w_tree.

The new code instead writes out the same tree from the main index, which has been clobbered with the working tree changes that the user hasn't added to the index. Because of that, we need to discard these changes and re-read the in-core index out of i_tree with reset_tree().

So, this change makes one new call to reset_tree() that scans and updates working tree files that are modified? How expensive is that?

It's not like this change trades cost to write out a temporary index file with the cost of having to call reset_tree() one more time---as far as I can see, the new code writes to on-disk index file the same time as the original code.

How is the use of second on-disk index hurting us? I must be missing something obvious, but at this point, it is not clear what we are gaining---I only see downsides.

Previous: Alban GruinNext: Junio C Hamano
Message 38 of 44 in “stash: drop usage of a second index”
  1. 0/6 stash: drop usage of a second indexAlban Gruin, May 5, 2020
  2. 2/6 stash: remove the second index in stash_working_tree()Alban Gruin, May 5, 2020
  3. Christian CouderJun 13, 2020
  4. Alban GruinJun 13, 2020
  5. Christian CouderJun 15, 2020
  6. 1/6 stash: mark `i_tree' in reset_tree() constAlban Gruin, May 5, 2020
  7. Christian CouderJun 13, 2020
  8. 4/6 stash: remove the second index in save_untracked_files()Alban Gruin, May 5, 2020
  9. Christian CouderJun 13, 2020
  10. 5/6 stash: remove the second index in restore_untracked()Alban Gruin, May 5, 2020
  11. Christian CouderJun 13, 2020
  12. 3/6 stash: remove the second index in stash_patch()Alban Gruin, May 5, 2020
  13. Christian CouderJun 13, 2020
  14. Christian CouderJun 13, 2020
  15. 6/6 stash: remove `stash_index_path'Alban Gruin, May 5, 2020
  16. Alban GruinJun 4, 2020
  17. Christian CouderJun 13, 2020
  18. Alban GruinJun 25, 2020
  19. SZEDER GáborJun 15, 2020
  20. SZEDER GáborJun 15, 2020
  21. SZEDER GáborJun 16, 2020
  22. Junio C HamanoJun 17, 2020
  23. Alban GruinJun 17, 2020
  24. 0/6 stash: drop usage of a second indexAlban Gruin, Jun 30, 2020
  25. 1/6 stash: mark `i_tree' in reset_tree() constAlban Gruin, Jun 30, 2020
  26. 2/6 stash: remove the second index in stash_working_tree()Alban Gruin, Jun 30, 2020
  27. 4/6 stash: remove the second index in save_untracked_files()Alban Gruin, Jun 30, 2020
  28. 3/6 stash: remove the second index in stash_patch()Alban Gruin, Jun 30, 2020
  29. 5/6 stash: remove the second index in restore_untracked()Alban Gruin, Jun 30, 2020
  30. Christian CouderJul 31, 2020
  31. Alban GruinJul 31, 2020
  32. 6/6 stash: remove `stash_index_path'Alban Gruin, Jun 30, 2020
  33. Christian CouderJul 31, 2020
  34. 0/6 stash: drop usage of a second indexAlban Gruin, Jul 31, 2020
  35. 1/6 stash: mark `i_tree' in reset_tree() constAlban Gruin, Jul 31, 2020
  36. Junio C HamanoJul 31, 2020
  37. 2/6 stash: remove the second index in stash_working_tree()Alban Gruin, Jul 31, 2020
  38. Junio C HamanoJul 31, 2020
  39. Junio C HamanoAug 2, 2020
  40. 4/6 stash: remove the second index in save_untracked_files()Alban Gruin, Jul 31, 2020
  41. 5/6 stash: remove the second index in restore_untracked()Alban Gruin, Jul 31, 2020
  42. 3/6 stash: remove the second index in stash_patch()Alban Gruin, Jul 31, 2020
  43. 6/6 stash: remove `stash_index_path'Alban Gruin, Jul 31, 2020
  44. Junio C HamanoJul 31, 2020

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.