From: Victoria Dye <vdye@github.com>
To: Emily Shaffer <emilyshaffer@google.com>,
Victoria Dye via GitGitGadget <gitgitgadget@gmail.com>
Cc: git@vger.kernel.org, stolee@gmail.com, gitster@pobox.com,
newren@gmail.com, "Taylor Blau" <me@ttaylorr.com>,
"Bagas Sanjaya" <bagasdotme@gmail.com>,
"Ævar Arnfjörð Bjarmason" <avarab@gmail.com>,
"Phillip Wood" <phillip.wood123@gmail.com>
Subject: Re: [PATCH v4 2/8] reset: preserve skip-worktree bit in mixed reset
Date: Mon, 25 Oct 2021 11:59:19 -0400 [thread overview]
Message-ID: <16fbc2dc-6fdd-ed0d-ebc6-3b0566142879@github.com> (raw)
In-Reply-To: <YXI75uFLdk2mnP7g@google.com>
Emily Shaffer wrote:
> 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.
>> 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.
> 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.
>> 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".
>> + 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
>>
next prev parent reply other threads:[~2021-10-25 15:59 UTC|newest]
Thread overview: 114+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-30 14:50 [PATCH 0/7] Sparse Index: integrate with reset Victoria Dye via GitGitGadget
2021-09-30 14:50 ` [PATCH 1/7] reset: behave correctly with sparse-checkout Kevin Willford via GitGitGadget
2021-09-30 18:34 ` Junio C Hamano
2021-10-01 14:55 ` Victoria Dye
2021-09-30 14:50 ` [PATCH 2/7] sparse-index: update command for expand/collapse test Victoria Dye via GitGitGadget
2021-09-30 19:17 ` Taylor Blau
2021-09-30 20:11 ` Victoria Dye
2021-09-30 21:32 ` Junio C Hamano
2021-09-30 22:59 ` Victoria Dye
2021-10-01 0:04 ` Junio C Hamano
2021-10-04 13:47 ` Victoria Dye
2021-10-01 9:14 ` Bagas Sanjaya
2021-09-30 14:50 ` [PATCH 3/7] reset: expand test coverage for sparse checkouts Victoria Dye via GitGitGadget
2021-09-30 14:50 ` [PATCH 4/7] reset: integrate with sparse index Victoria Dye via GitGitGadget
2021-09-30 14:50 ` [PATCH 5/7] reset: make sparse-aware (except --mixed) Victoria Dye via GitGitGadget
2021-09-30 14:51 ` [PATCH 6/7] reset: make --mixed sparse-aware Victoria Dye via GitGitGadget
2021-10-01 15:03 ` Victoria Dye
2021-09-30 14:51 ` [PATCH 7/7] unpack-trees: improve performance of next_cache_entry Victoria Dye via GitGitGadget
2021-10-05 13:20 ` [PATCH v2 0/7] Sparse Index: integrate with reset Victoria Dye via GitGitGadget
2021-10-05 13:20 ` [PATCH v2 1/7] reset: behave correctly with sparse-checkout Kevin Willford via GitGitGadget
2021-10-05 19:30 ` Junio C Hamano
2021-10-05 21:59 ` Victoria Dye
2021-10-06 12:44 ` Junio C Hamano
2021-10-06 1:46 ` Elijah Newren
2021-10-06 20:09 ` Victoria Dye
2021-10-06 10:31 ` Bagas Sanjaya
2021-10-05 13:20 ` [PATCH v2 2/7] update-index: add --force-full-index option for expand/collapse test Victoria Dye via GitGitGadget
2021-10-06 2:00 ` Elijah Newren
2021-10-06 20:40 ` Victoria Dye
2021-10-08 3:42 ` Elijah Newren
2021-10-08 17:11 ` Junio C Hamano
2021-10-06 10:33 ` Bagas Sanjaya
2021-10-05 13:20 ` [PATCH v2 3/7] reset: expand test coverage for sparse checkouts Victoria Dye via GitGitGadget
2021-10-06 2:04 ` Elijah Newren
2021-10-05 13:20 ` [PATCH v2 4/7] reset: integrate with sparse index Victoria Dye via GitGitGadget
2021-10-06 2:15 ` Elijah Newren
2021-10-06 17:48 ` Junio C Hamano
2021-10-05 13:20 ` [PATCH v2 5/7] reset: make sparse-aware (except --mixed) Victoria Dye via GitGitGadget
2021-10-06 3:43 ` Elijah Newren
2021-10-06 20:56 ` Victoria Dye
2021-10-06 10:34 ` Bagas Sanjaya
2021-10-05 13:20 ` [PATCH v2 6/7] reset: make --mixed sparse-aware Victoria Dye via GitGitGadget
2021-10-06 4:43 ` Elijah Newren
2021-10-07 14:34 ` Victoria Dye
2021-10-05 13:20 ` [PATCH v2 7/7] unpack-trees: improve performance of next_cache_entry Victoria Dye via GitGitGadget
2021-10-06 10:37 ` Bagas Sanjaya
2021-10-05 15:34 ` [PATCH v2 0/7] Sparse Index: integrate with reset Ævar Arnfjörð Bjarmason
2021-10-05 20:44 ` Victoria Dye
2021-10-06 5:46 ` Elijah Newren
2021-10-07 21:15 ` [PATCH v3 0/8] " Victoria Dye via GitGitGadget
2021-10-07 21:15 ` [PATCH v3 1/8] reset: rename is_missing to !is_in_reset_tree Victoria Dye via GitGitGadget
2021-10-07 21:15 ` [PATCH v3 2/8] reset: preserve skip-worktree bit in mixed reset Kevin Willford via GitGitGadget
2021-10-08 9:04 ` Junio C Hamano
2021-10-07 21:15 ` [PATCH v3 3/8] update-index: add --force-full-index option for expand/collapse test Victoria Dye via GitGitGadget
2021-10-08 2:50 ` Bagas Sanjaya
2021-10-08 5:24 ` Junio C Hamano
2021-10-08 15:47 ` Victoria Dye
2021-10-08 17:19 ` Junio C Hamano
2021-10-11 14:12 ` Derrick Stolee
2021-10-11 15:05 ` Victoria Dye
2021-10-11 15:24 ` Junio C Hamano
2021-10-07 21:15 ` [PATCH v3 4/8] reset: expand test coverage for sparse checkouts Victoria Dye via GitGitGadget
2021-10-07 21:15 ` [PATCH v3 5/8] reset: integrate with sparse index Victoria Dye via GitGitGadget
2021-10-07 21:15 ` [PATCH v3 6/8] reset: make sparse-aware (except --mixed) Victoria Dye via GitGitGadget
2021-10-08 11:09 ` Phillip Wood
2021-10-08 17:14 ` Victoria Dye
2021-10-08 18:31 ` Junio C Hamano
2021-10-09 11:18 ` Phillip Wood
2021-10-10 22:03 ` Junio C Hamano
2021-10-11 15:55 ` Victoria Dye
2021-10-11 16:16 ` Junio C Hamano
2021-10-12 10:16 ` Phillip Wood
2021-10-12 19:15 ` Junio C Hamano
2021-10-12 10:17 ` Phillip Wood
2021-10-07 21:15 ` [PATCH v3 7/8] reset: make --mixed sparse-aware Victoria Dye via GitGitGadget
2021-11-20 22:02 ` Elijah Newren
2021-11-22 16:46 ` Victoria Dye
2021-10-07 21:15 ` [PATCH v3 8/8] unpack-trees: improve performance of next_cache_entry Victoria Dye via GitGitGadget
2021-10-11 20:30 ` [PATCH v4 0/8] Sparse Index: integrate with reset Victoria Dye via GitGitGadget
2021-10-11 20:30 ` [PATCH v4 1/8] reset: rename is_missing to !is_in_reset_tree Victoria Dye via GitGitGadget
2021-10-11 20:30 ` [PATCH v4 2/8] reset: preserve skip-worktree bit in mixed reset Victoria Dye via GitGitGadget
2021-10-22 4:19 ` Emily Shaffer
2021-10-25 15:59 ` Victoria Dye [this message]
2021-10-11 20:30 ` [PATCH v4 3/8] sparse-index: update command for expand/collapse test Victoria Dye via GitGitGadget
2021-10-11 20:30 ` [PATCH v4 4/8] reset: expand test coverage for sparse checkouts Victoria Dye via GitGitGadget
2021-10-11 20:30 ` [PATCH v4 5/8] reset: integrate with sparse index Victoria Dye via GitGitGadget
2021-10-11 20:30 ` [PATCH v4 6/8] reset: make sparse-aware (except --mixed) Victoria Dye via GitGitGadget
2021-10-11 20:30 ` [PATCH v4 7/8] reset: make --mixed sparse-aware Victoria Dye via GitGitGadget
2021-10-11 20:30 ` [PATCH v4 8/8] unpack-trees: improve performance of next_cache_entry Victoria Dye via GitGitGadget
2021-10-27 14:39 ` [PATCH v5 0/8] Sparse Index: integrate with reset Victoria Dye via GitGitGadget
2021-10-27 14:39 ` [PATCH v5 1/8] reset: rename is_missing to !is_in_reset_tree Victoria Dye via GitGitGadget
2021-10-27 14:39 ` [PATCH v5 2/8] reset: preserve skip-worktree bit in mixed reset Victoria Dye via GitGitGadget
2021-10-27 14:39 ` [PATCH v5 3/8] sparse-index: update command for expand/collapse test Victoria Dye via GitGitGadget
2021-10-27 14:39 ` [PATCH v5 4/8] reset: expand test coverage for sparse checkouts Victoria Dye via GitGitGadget
2021-10-27 14:39 ` [PATCH v5 5/8] reset: integrate with sparse index Victoria Dye via GitGitGadget
2021-10-27 14:39 ` [PATCH v5 6/8] reset: make sparse-aware (except --mixed) Victoria Dye via GitGitGadget
2021-10-27 14:39 ` [PATCH v5 7/8] reset: make --mixed sparse-aware Victoria Dye via GitGitGadget
2021-11-20 22:05 ` Elijah Newren
2021-11-22 16:54 ` Victoria Dye
2021-10-27 14:39 ` [PATCH v5 8/8] unpack-trees: improve performance of next_cache_entry Victoria Dye via GitGitGadget
2021-11-20 22:13 ` [PATCH v5 0/8] Sparse Index: integrate with reset Elijah Newren
2021-11-29 15:52 ` [PATCH v6 " Victoria Dye via GitGitGadget
2021-11-29 15:52 ` [PATCH v6 1/8] reset: rename is_missing to !is_in_reset_tree Victoria Dye via GitGitGadget
2021-11-29 15:52 ` [PATCH v6 2/8] reset: preserve skip-worktree bit in mixed reset Victoria Dye via GitGitGadget
2021-11-29 15:52 ` [PATCH v6 3/8] sparse-index: update command for expand/collapse test Victoria Dye via GitGitGadget
2021-11-29 15:52 ` [PATCH v6 4/8] reset: expand test coverage for sparse checkouts Victoria Dye via GitGitGadget
2021-11-29 15:52 ` [PATCH v6 5/8] reset: integrate with sparse index Victoria Dye via GitGitGadget
2021-11-29 15:52 ` [PATCH v6 6/8] reset: make sparse-aware (except --mixed) Victoria Dye via GitGitGadget
2021-11-29 15:52 ` [PATCH v6 7/8] reset: make --mixed sparse-aware Victoria Dye via GitGitGadget
2021-11-29 15:52 ` [PATCH v6 8/8] unpack-trees: improve performance of next_cache_entry Victoria Dye via GitGitGadget
2021-11-29 18:37 ` [PATCH v6 0/8] Sparse Index: integrate with reset Elijah Newren
2021-11-29 19:44 ` Victoria Dye
2021-11-30 3:59 ` Elijah Newren
2021-12-01 20:26 ` Ævar Arnfjörð Bjarmason
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=16fbc2dc-6fdd-ed0d-ebc6-3b0566142879@github.com \
--to=vdye@github.com \
--cc=avarab@gmail.com \
--cc=bagasdotme@gmail.com \
--cc=emilyshaffer@google.com \
--cc=git@vger.kernel.org \
--cc=gitgitgadget@gmail.com \
--cc=gitster@pobox.com \
--cc=me@ttaylorr.com \
--cc=newren@gmail.com \
--cc=phillip.wood123@gmail.com \
--cc=stolee@gmail.com \
/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).