Thread (204 messages) flat view 204 messages, 5 authors, 2021-07-14

Re: [PATCH 01/10] t1092: add tests for status/add and sparse files

From: Elijah Newren <hidden>
Date: 2021-04-20 21:52:19

On Tue, Apr 13, 2021 at 7:01 AM Derrick Stolee via GitGitGadget
[off-list ref] wrote:
From: Derrick Stolee <redacted>

Before moving to update 'git status' and 'git add' to work with sparse
indexes, add an explicit test that ensures the sparse-index works the
same as a normal sparse-checkout when the worktree contains directories
and files outside of the sparse cone.

Specifically, 'folder1/a' is a file in our test repo, but 'folder1' is
not in the sparse cone. When 'folder1/a' is modified, the file
'folder1/a' is shown as modified, but adding it fails. This is new
behavior as of a20f704 (add: warn when asked to update SKIP_WORKTREE
entries, 2021-04-08). Before that change, these adds would be silently
ignored.

Untracked files are fine: adding new files both with 'git add .' and
'git add folder1/' works just as in a full checkout. This may not be
entirely desirable, but we are not intending to change behavior at the
moment, only document it.
Personally, I'd say not desirable and we should throw an error just
like we do with skip-worktree entries that the user happens to try to
git add.  I've had reports from users that got confused by what
happens after this.  I've been meaning to create some patches to fix
it up, but wanted to avoid getting in the way of the sparse-index work
and have been a bit tied up on other projects to boot.

I'll note in particular that it's easy for users after running "git
add" to run other things such as "git sparse-checkout reapply" or "git
switch $otherbranch" and suddenly the file disappears from the working
tree.  From the sparse-checkout machinery that makes sense; this path
doesn't match the .git/info/sparse-checkout list of paths, so it
should be removed from the working tree.  But it's very disorienting
to users.  Especially if some of those commands are side-effects of
other commands (e.g. our build system invokes "git sparse-checkout
reapply" in various cases, most common of which is that even a simple
"git pull" can bring down code with dependency changes and thus a need
for new sparsity rules and whatnot), but it definitely can just happen
in ways users don't expect with their own commands (e.g. the git
switch/checkout example).

The patch looks good, but it'd be nice if while documenting it we also
add a comment that we believe we want to change the behavior (for
sparse-checkout both with and without sparse-index).  It's one of
those many paper-cuts we still have.
quoted hunk ↗ jump to hunk
Signed-off-by: Derrick Stolee <redacted>
---
 t/t1092-sparse-checkout-compatibility.sh | 36 ++++++++++++++++++++++++
 1 file changed, 36 insertions(+)
diff --git a/t/t1092-sparse-checkout-compatibility.sh b/t/t1092-sparse-checkout-compatibility.sh
index 12e6c453024f..6598c12a2069 100755
--- a/t/t1092-sparse-checkout-compatibility.sh
+++ b/t/t1092-sparse-checkout-compatibility.sh
@@ -232,6 +232,42 @@ test_expect_success 'add, commit, checkout' '
        test_all_match git checkout -
 '

+test_expect_success 'status/add: outside sparse cone' '
+       init_repos &&
+
+       # folder1 is at HEAD, but outside the sparse cone
+       run_on_sparse mkdir folder1 &&
+       cp initial-repo/folder1/a sparse-checkout/folder1/a &&
+       cp initial-repo/folder1/a sparse-index/folder1/a &&
+
+       test_sparse_match git status &&
+
+       write_script edit-contents <<-\EOF &&
+       echo text >>$1
+       EOF
+       run_on_all ../edit-contents folder1/a &&
+       run_on_all ../edit-contents folder1/new &&
+
+       test_sparse_match git status --porcelain=v2 &&
+
+       # This "git add folder1/a" is completely ignored
+       # by the sparse-checkout repos. It causes the
+       # full repo to have a different staged environment.
+       test_must_fail git -C sparse-checkout add folder1/a &&
+       test_must_fail git -C sparse-index add folder1/a &&
+       git -C full-checkout checkout HEAD -- folder1/a &&
+       test_sparse_match git status --porcelain=v2 &&
+
+       test_all_match git add . &&
+       test_all_match git status --porcelain=v2 &&
+       test_all_match git commit -m folder1/new &&
+
+       run_on_all ../edit-contents folder1/newer &&
+       test_all_match git add folder1/ &&
+       test_all_match git status --porcelain=v2 &&
+       test_all_match git commit -m folder1/newer
+'
+
 test_expect_success 'checkout and reset --hard' '
        init_repos &&

--
gitgitgadget
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help