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

Re: [PATCH v4 2/8] reset: preserve skip-worktree bit in mixed reset

From
Victoria Dye <vdye@github.com>
Date
Oct 25, 2021, 15:59 UTC
Message-ID
<16fbc2dc-6fdd-ed0d-ebc6-3b0566142879@github.com>
In-Reply-To
<YXI75uFLdk2mnP7g@google.com>
Emily Shaffer wrote:
Show 39 quoted lines
> On Mon, Oct 11, 2021 at 08:30:16PM +0000, Victoria Dye via GitGitGadget wrote:
>> diff --git a/builtin/reset.c b/builtin/reset.c
>> index d3695ce43c4..e441b6601b9 100644
>> --- a/builtin/reset.c
>> +++ b/builtin/reset.c
>> @@ -25,6 +25,7 @@
>>  #include "cache-tree.h"
>>  #include "submodule.h"
>>  #include "submodule-config.h"
>> +#include "dir.h"
>>  
>>  #define REFRESH_INDEX_DELAY_WARNING_IN_MS (2 * 1000)
>>  
>> @@ -141,6 +143,18 @@ static void update_index_from_diff(struct diff_queue_struct *q,
>>  
>>  		ce = make_cache_entry(&the_index, one->mode, &one->oid, one->path,
>>  				      0, 0);
>> +
>> +		/*
>> +		 * If the file 1) corresponds to an existing index entry with
>> +		 * skip-worktree set, or 2) does not exist in the index but is
>> +		 * outside the sparse checkout definition, add a skip-worktree bit
>> +		 * to the new index entry.
>> +		 */
>> +		pos = cache_name_pos(one->path, strlen(one->path));
>> +		if ((pos >= 0 && ce_skip_worktree(active_cache[pos])) ||
>> +		    (pos < 0 && !path_in_sparse_checkout(one->path, &the_index)))
>> +			ce->ce_flags |= CE_SKIP_WORKTREE;
> 
> To put it another way and check my understanding (because I'm not
> familiar with the sparse-index yet): if the file exists in the index but
> we didn't care about the worktree anyway, then skip it; if the file
> doesn't exist in the index but it also isn't in the sparse-checkout
> cone, then also skip it, because we don't care about the file anyway.
> 
> I was going to ask if we could check ce_skip_worktree() without checking
> pos first, but I suppose a negative pos would make the array deref
> pretty unhappy. Ok.
> 

Exactly! Generally the current skip-worktree flag is the "source of truth" on whether to add the flag to the new entry, but if the file isn't in the index pre-reset, the sparse checkout patterns are used to determine if it should have skip-worktree applied.

Show 38 quoted lines
>> diff --git a/t/t1092-sparse-checkout-compatibility.sh b/t/t1092-sparse-checkout-compatibility.sh
>> index 886e78715fe..889079f55b8 100755
>> --- a/t/t1092-sparse-checkout-compatibility.sh
>> +++ b/t/t1092-sparse-checkout-compatibility.sh
>> @@ -459,26 +459,17 @@ test_expect_failure 'blame with pathspec outside sparse definition' '
>>  	test_all_match git blame deep/deeper2/deepest/a
>>  '
>>  
>> -# NEEDSWORK: a sparse-checkout behaves differently from a full checkout
>> -# in this scenario, but it shouldn't.
>> -test_expect_failure 'checkout and reset (mixed)' '
>> +test_expect_success 'checkout and reset (mixed)' '
> 
> Ooh ooh, we can start using these tests :) Always exciting.
> 
>>  	init_repos &&
>>  
>>  	test_all_match git checkout -b reset-test update-deep &&
>>  	test_all_match git reset deepest &&
>> -	test_all_match git reset update-folder1 &&
>> -	test_all_match git reset update-folder2
>> -'
>> -
>> -# NEEDSWORK: a sparse-checkout behaves differently from a full checkout
>> -# in this scenario, but it shouldn't.
>> -test_expect_success 'checkout and reset (mixed) [sparse]' '
>> -	init_repos &&
>>  
>> -	test_sparse_match git checkout -b reset-test update-deep &&
>> -	test_sparse_match git reset deepest &&
>> +	# Because skip-worktree is preserved, resetting to update-folder1
>> +	# will show worktree changes for full-checkout that are not present
>> +	# in sparse-checkout or sparse-index.
> 
> This doesn't really have anything to do with your patch. But I'm having
> a very hard time understanding what each branch you're switching between
> and basing on is for; this entire test suite is a little miserly with
> comments. 
The branches used in this test are:
* `base` is the initial branch; all branches in the list here contain one
  commit on top of `base`
* `update-deep` modifies a file inside the sparse checkout cone (`deep/a`) 
* `deepest` modifies a file deep inside the sparse checkout cone
  (`deep/deeper1/deepest/a`)
* `update-folder1` and `update-folder2` each modify a file outside the
  sparse checkout cone (`folder1/a` and `folder2/a`, respectively)

There are other branches used throughout the file, but they deal with more complicated conflict scenarios not used in this particular test case.

Show 6 quoted lines
> I *think* your comment is saying that you're not bothering to
> check test_all_match because you know that the full-checkout tree won't
> match? But I also don't see that being asserted; test_sparse_match looks
> to compare sparse-checkout and sparse-index trees but doesn't say
> anything at all about the full-checkout tree, right?
> 

Your understanding is correct (it's attempting to explain why we're not using `test_all_match`, unlike earlier assertions in the test). That said, it probably _should_ assert on the differences from `full-checkout`, namely that "M folder1/a" would appear in `full-checkout` but not in `sparse-checkout`/`sparse-index`. I can add that in my next version.

Show 37 quoted lines
>>  	test_sparse_match git reset update-folder1 &&
>> -	test_sparse_match git reset update-folder2
>> +	run_on_sparse test_path_is_missing folder1
>>  '
>>  
>>  test_expect_success 'merge, cherry-pick, and rebase' '
>> diff --git a/t/t7102-reset.sh b/t/t7102-reset.sh
>> index 601b2bf97f0..d05426062ec 100755
>> --- a/t/t7102-reset.sh
>> +++ b/t/t7102-reset.sh
>> @@ -472,6 +472,23 @@ test_expect_success '--mixed refreshes the index' '
>>  	test_cmp expect output
>>  '
>>  
>> +test_expect_success '--mixed preserves skip-worktree' '
>> +	echo 123 >>file2 &&
> 
> file2 is just in the worktree...
> 
>> +	git add file2 &&
> 
> ...and now it's in the index...
> 
>> +	git update-index --skip-worktree file2 &&
> 
> ...and now we're asking Git to ignore worktree changes to file2...
> 
>> +	git reset --mixed HEAD >output &&
> 
> But now I'm a little confused, maybe because of 'git reset' syntax. I'd
> expect this to say "ah yes, the index is different from HEAD, it's got
> this file2 thingie" and still reset the index; I'm surprised that
> --skip-worktree, which sounds like it's saying only "don't consider
> what's going on in the worktree". So I would expect this to still delete
> file2 from the index. But instead I guess it is keeping file2 in the
> index with the "who cares what happened in the wt" marker?
> 

Yes - `git update-index --skip-worktree` sets the skip-worktree flag on the index entry of the specified file(s) (in this case, `file2`). So, because `file2` is in the index but ignored in the worktree, the file isn't identified as "modified" after `git reset --mixed HEAD`. Once the skip-worktree flag is removed (with `git update-index --no-skip-worktree`), the reset results in it showing up as "modified".

Show 18 quoted lines
>> +	test_must_be_empty output &&
>> +
>> +	cat >expect <<-\EOF &&
>> +	Unstaged changes after reset:
>> +	M	file2
>> +	EOF
>> +	git update-index --no-skip-worktree file2 &&
>> +	git add file2 &&
>> +	git reset --mixed HEAD >output &&
>> +	test_cmp expect output
>> +'
>> +
>>  test_expect_success 'resetting specific path that is unmerged' '
>>  	git rm --cached file2 &&
>>  	F1=$(git rev-parse HEAD:file1) &&
>> -- 
>> gitgitgadget
>>
Previous: Emily ShafferNext: Victoria Dye via GitGitGadget
Message 83 of 114 in “Sparse Index: integrate with reset”
  1. 0/7 Sparse Index: integrate with resetVictoria Dye via GitGitGadget, Sep 30, 2021
  2. 1/7 reset: behave correctly with sparse-checkoutKevin Willford via GitGitGadget, Sep 30, 2021
  3. Junio C HamanoSep 30, 2021
  4. Victoria DyeOct 1, 2021
  5. 2/7 sparse-index: update command for expand/collapse testVictoria Dye via GitGitGadget, Sep 30, 2021
  6. Taylor BlauSep 30, 2021
  7. Victoria DyeSep 30, 2021
  8. Junio C HamanoSep 30, 2021
  9. Victoria DyeSep 30, 2021
  10. Junio C HamanoOct 1, 2021
  11. Victoria DyeOct 4, 2021
  12. Bagas SanjayaOct 1, 2021
  13. 3/7 reset: expand test coverage for sparse checkoutsVictoria Dye via GitGitGadget, Sep 30, 2021
  14. 4/7 reset: integrate with sparse indexVictoria Dye via GitGitGadget, Sep 30, 2021
  15. 5/7 reset: make sparse-aware (except --mixed)Victoria Dye via GitGitGadget, Sep 30, 2021
  16. 6/7 reset: make --mixed sparse-awareVictoria Dye via GitGitGadget, Sep 30, 2021
  17. Victoria DyeOct 1, 2021
  18. 7/7 unpack-trees: improve performance of next_cache_entryVictoria Dye via GitGitGadget, Sep 30, 2021
  19. 0/7 Sparse Index: integrate with resetVictoria Dye via GitGitGadget, Oct 5, 2021
  20. 1/7 reset: behave correctly with sparse-checkoutKevin Willford via GitGitGadget, Oct 5, 2021
  21. Junio C HamanoOct 5, 2021
  22. Victoria DyeOct 5, 2021
  23. Junio C HamanoOct 6, 2021
  24. Elijah NewrenOct 6, 2021
  25. Victoria DyeOct 6, 2021
  26. Bagas SanjayaOct 6, 2021
  27. 3/7 reset: expand test coverage for sparse checkoutsVictoria Dye via GitGitGadget, Oct 5, 2021
  28. Elijah NewrenOct 6, 2021
  29. 4/7 reset: integrate with sparse indexVictoria Dye via GitGitGadget, Oct 5, 2021
  30. Elijah NewrenOct 6, 2021
  31. Junio C HamanoOct 6, 2021
  32. 2/7 update-index: add --force-full-index option for expand/collapse testVictoria Dye via GitGitGadget, Oct 5, 2021
  33. Elijah NewrenOct 6, 2021
  34. Victoria DyeOct 6, 2021
  35. Elijah NewrenOct 8, 2021
  36. Junio C HamanoOct 8, 2021
  37. Bagas SanjayaOct 6, 2021
  38. 5/7 reset: make sparse-aware (except --mixed)Victoria Dye via GitGitGadget, Oct 5, 2021
  39. Elijah NewrenOct 6, 2021
  40. Victoria DyeOct 6, 2021
  41. Bagas SanjayaOct 6, 2021
  42. 6/7 reset: make --mixed sparse-awareVictoria Dye via GitGitGadget, Oct 5, 2021
  43. Elijah NewrenOct 6, 2021
  44. Victoria DyeOct 7, 2021
  45. 7/7 unpack-trees: improve performance of next_cache_entryVictoria Dye via GitGitGadget, Oct 5, 2021
  46. Bagas SanjayaOct 6, 2021
  47. Ævar Arnfjörð BjarmasonOct 5, 2021
  48. Victoria DyeOct 5, 2021
  49. Elijah NewrenOct 6, 2021
  50. 0/8 Sparse Index: integrate with resetVictoria Dye via GitGitGadget, Oct 7, 2021
  51. 1/8 reset: rename is_missing to !is_in_reset_treeVictoria Dye via GitGitGadget, Oct 7, 2021
  52. 2/8 reset: preserve skip-worktree bit in mixed resetKevin Willford via GitGitGadget, Oct 7, 2021
  53. Junio C HamanoOct 8, 2021
  54. 3/8 update-index: add --force-full-index option for expand/collapse testVictoria Dye via GitGitGadget, Oct 7, 2021
  55. Bagas SanjayaOct 8, 2021
  56. Junio C HamanoOct 8, 2021
  57. Victoria DyeOct 8, 2021
  58. Junio C HamanoOct 8, 2021
  59. Derrick StoleeOct 11, 2021
  60. Victoria DyeOct 11, 2021
  61. Junio C HamanoOct 11, 2021
  62. 4/8 reset: expand test coverage for sparse checkoutsVictoria Dye via GitGitGadget, Oct 7, 2021
  63. 5/8 reset: integrate with sparse indexVictoria Dye via GitGitGadget, Oct 7, 2021
  64. 6/8 reset: make sparse-aware (except --mixed)Victoria Dye via GitGitGadget, Oct 7, 2021
  65. Phillip WoodOct 8, 2021
  66. Victoria DyeOct 8, 2021
  67. Junio C HamanoOct 8, 2021
  68. Phillip WoodOct 9, 2021
  69. Junio C HamanoOct 10, 2021
  70. Victoria DyeOct 11, 2021
  71. Junio C HamanoOct 11, 2021
  72. Phillip WoodOct 12, 2021
  73. Junio C HamanoOct 12, 2021
  74. Phillip WoodOct 12, 2021
  75. 7/8 reset: make --mixed sparse-awareVictoria Dye via GitGitGadget, Oct 7, 2021
  76. Elijah NewrenNov 20, 2021
  77. Victoria DyeNov 22, 2021
  78. 8/8 unpack-trees: improve performance of next_cache_entryVictoria Dye via GitGitGadget, Oct 7, 2021
  79. 0/8 Sparse Index: integrate with resetVictoria Dye via GitGitGadget, Oct 11, 2021
  80. 1/8 reset: rename is_missing to !is_in_reset_treeVictoria Dye via GitGitGadget, Oct 11, 2021
  81. 2/8 reset: preserve skip-worktree bit in mixed resetVictoria Dye via GitGitGadget, Oct 11, 2021
  82. Emily ShafferOct 22, 2021
  83. Victoria DyeOct 25, 2021
  84. 3/8 sparse-index: update command for expand/collapse testVictoria Dye via GitGitGadget, Oct 11, 2021
  85. 4/8 reset: expand test coverage for sparse checkoutsVictoria Dye via GitGitGadget, Oct 11, 2021
  86. 5/8 reset: integrate with sparse indexVictoria Dye via GitGitGadget, Oct 11, 2021
  87. 7/8 reset: make --mixed sparse-awareVictoria Dye via GitGitGadget, Oct 11, 2021
  88. 6/8 reset: make sparse-aware (except --mixed)Victoria Dye via GitGitGadget, Oct 11, 2021
  89. 8/8 unpack-trees: improve performance of next_cache_entryVictoria Dye via GitGitGadget, Oct 11, 2021
  90. 0/8 Sparse Index: integrate with resetVictoria Dye via GitGitGadget, Oct 27, 2021
  91. 1/8 reset: rename is_missing to !is_in_reset_treeVictoria Dye via GitGitGadget, Oct 27, 2021
  92. 2/8 reset: preserve skip-worktree bit in mixed resetVictoria Dye via GitGitGadget, Oct 27, 2021
  93. 3/8 sparse-index: update command for expand/collapse testVictoria Dye via GitGitGadget, Oct 27, 2021
  94. 4/8 reset: expand test coverage for sparse checkoutsVictoria Dye via GitGitGadget, Oct 27, 2021
  95. 5/8 reset: integrate with sparse indexVictoria Dye via GitGitGadget, Oct 27, 2021
  96. 6/8 reset: make sparse-aware (except --mixed)Victoria Dye via GitGitGadget, Oct 27, 2021
  97. 7/8 reset: make --mixed sparse-awareVictoria Dye via GitGitGadget, Oct 27, 2021
  98. Elijah NewrenNov 20, 2021
  99. Victoria DyeNov 22, 2021
  100. 8/8 unpack-trees: improve performance of next_cache_entryVictoria Dye via GitGitGadget, Oct 27, 2021
  101. Elijah NewrenNov 20, 2021
  102. 0/8 Sparse Index: integrate with resetVictoria Dye via GitGitGadget, Nov 29, 2021
  103. 1/8 reset: rename is_missing to !is_in_reset_treeVictoria Dye via GitGitGadget, Nov 29, 2021
  104. 2/8 reset: preserve skip-worktree bit in mixed resetVictoria Dye via GitGitGadget, Nov 29, 2021
  105. 3/8 sparse-index: update command for expand/collapse testVictoria Dye via GitGitGadget, Nov 29, 2021
  106. 4/8 reset: expand test coverage for sparse checkoutsVictoria Dye via GitGitGadget, Nov 29, 2021
  107. 5/8 reset: integrate with sparse indexVictoria Dye via GitGitGadget, Nov 29, 2021
  108. 6/8 reset: make sparse-aware (except --mixed)Victoria Dye via GitGitGadget, Nov 29, 2021
  109. 7/8 reset: make --mixed sparse-awareVictoria Dye via GitGitGadget, Nov 29, 2021
  110. 8/8 unpack-trees: improve performance of next_cache_entryVictoria Dye via GitGitGadget, Nov 29, 2021
  111. Elijah NewrenNov 29, 2021
  112. Victoria DyeNov 29, 2021
  113. Elijah NewrenNov 30, 2021
  114. Ævar Arnfjörð BjarmasonDec 1, 2021

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.