diff mbox series

[v9,1/2] t1092: add tests for `git diff-files`

Message ID 20230502172335.478312-2-cheskaqiqi@gmail.com (mailing list archive)
State Superseded
Headers show
Series diff-files: integrate with sparse index | expand

Commit Message

Shuqi Liang May 2, 2023, 5:23 p.m. UTC
Before integrating the 'git diff-files' builtin with the sparse index
feature, add tests to t1092-sparse-checkout-compatibility.sh to ensure
it currently works with sparse-checkout and will still work with sparse
index after that integration.

When adding tests against a sparse-checkout definition, we test two
modes: all changes are within the sparse-checkout cone and some changes
are outside the sparse-checkout cone.

In order to have staged changes outside of the sparse-checkout cone,
make a directory called 'folder1' and copy `a` into 'folder1/a'.
'folder1/a' is identical to `a` in the base commit. These make
'folder1/a' in the index, while leaving it outside of the
sparse-checkout definition. Test 'folder1/a'being present on-disk
without modifications, then change content inside 'folder1/a' in order
to test 'folder1/a' being present on-disk with modifications.

Signed-off-by: Shuqi Liang <cheskaqiqi@gmail.com>
---
 t/t1092-sparse-checkout-compatibility.sh | 46 ++++++++++++++++++++++++
 1 file changed, 46 insertions(+)

Comments

Junio C Hamano May 2, 2023, 7:25 p.m. UTC | #1
Shuqi Liang <cheskaqiqi@gmail.com> writes:

> +test_expect_success 'diff-files with pathspec outside sparse definition' '
> +	init_repos &&
> +
> +	test_sparse_match test_must_fail git diff-files folder2/a &&

In "sparse" directories at this point of test, "folder2" is outside
the cone(s) of interest and is not instantiated.  The reason why
the command fails is because the command line parsing that is
generic to all users of the revision machinery requires you to have
a disambiguating double-dash before such a pathspec that tries to
match a path that does not exist in the working tree and is not
specific to "diff-files".

I wonder how interesting and useful this test is.  Without
accompanying test that uses disambiguating double-dash properly,
e.g. "git diff-files -- folder2", I doubt it is very much useful.

> +	write_script edit-contents <<-\EOF &&
> +	echo text >>"$1"
> +	EOF
> +
> +	# Add file to the index but outside of cone for sparse-checkout cases.
> +	# Add file to the index without sparse-checkout cases to ensure all have
> +	# same output.
> +	run_on_all mkdir -p folder1 &&
> +	run_on_all cp a folder1/a &&

Now, "folder1" also has not been instantiated in sparse ones while
the full one of course has it, so "-p" in "mkdir -p" makes sense.
After these commands, all three will share the same "folder1/a".

> +	# file present on-disk without modifications
> +	# use `--stat` to ignore file creation time differences in
> +	# unrefreshed index
> +	test_all_match git diff-files --stat &&
> +	test_all_match git diff-files --stat folder1/a &&
> +	test_all_match git diff-files --stat "folder*/a" &&

Because in all three repositories, "folder1/a" exists in the working
tree, the "you need to disambiguate" error like the first test
(whose utility I questioned) would not trigger.

What does this demonstrate, though?  That instantiating a file on
the working tree, even outside the cone(s) of interest in a sparsely
checked out working tree, makes it part of the interesting set
automatically?  As there is no difference between the indexed
contents and what is in the working tree, we cannot tell from this
test if that is the case (not a complaint, just an observation).

But ...

> +	# file present on-disk with modifications
> +	run_on_all ../edit-contents folder1/a &&
> +	test_all_match git diff-files &&
> +	test_all_match git diff-files folder1/a &&
> +	test_all_match git diff-files "folder*/a"

... it is shown by doing the same test with modified contents?

For consistency with the earlier "the same contents" test, we should
use "--stat" here, too.  Or even "--stat -p".

Alternatively, we could refresh the index before running diff-files
(here and also before the earlier "the same contents" test), I
guess.

> +'
> +
>  test_done

Thanks.
Victoria Dye May 3, 2023, 4:37 p.m. UTC | #2
Junio C Hamano wrote:
> Shuqi Liang <cheskaqiqi@gmail.com> writes:
> 
>> +test_expect_success 'diff-files with pathspec outside sparse definition' '
>> +	init_repos &&
>> +
>> +	test_sparse_match test_must_fail git diff-files folder2/a &&
> 
> In "sparse" directories at this point of test, "folder2" is outside
> the cone(s) of interest and is not instantiated.  The reason why
> the command fails is because the command line parsing that is
> generic to all users of the revision machinery requires you to have
> a disambiguating double-dash before such a pathspec that tries to
> match a path that does not exist in the working tree and is not
> specific to "diff-files".
> 
> I wonder how interesting and useful this test is.  Without
> accompanying test that uses disambiguating double-dash properly,
> e.g. "git diff-files -- folder2", I doubt it is very much useful.

I agree, this test isn't helpful as-is. With the '--', 'diff-files'
shouldn't fail, so in the interest of avoiding unexpected regressions in the
future (masked by 'test_must_fail'), I think this test should be updated as
you described. 

>> +	# file present on-disk without modifications
>> +	# use `--stat` to ignore file creation time differences in
>> +	# unrefreshed index
>> +	test_all_match git diff-files --stat &&
>> +	test_all_match git diff-files --stat folder1/a &&
>> +	test_all_match git diff-files --stat "folder*/a" &&
> 
> Because in all three repositories, "folder1/a" exists in the working
> tree, the "you need to disambiguate" error like the first test
> (whose utility I questioned) would not trigger.
> 
> What does this demonstrate, though?  That instantiating a file on
> the working tree, even outside the cone(s) of interest in a sparsely
> checked out working tree, makes it part of the interesting set
> automatically?  As there is no difference between the indexed
> contents and what is in the working tree, we cannot tell from this
> test if that is the case (not a complaint, just an observation).

This was meant [1] to check whether there are any issues expanding the index
(specifically, the 'folder1/' sparse directory) before comparing to the 
now-on-disk 'folder1/a'. 

However...

[1] https://lore.kernel.org/git/b537d855-edb7-4f67-de08-d651868247a5@github.com/

> 
> But ...
> 
>> +	# file present on-disk with modifications
>> +	run_on_all ../edit-contents folder1/a &&
>> +	test_all_match git diff-files &&
>> +	test_all_match git diff-files folder1/a &&
>> +	test_all_match git diff-files "folder*/a"
> 
> ... it is shown by doing the same test with modified contents?
> 
> For consistency with the earlier "the same contents" test, we should
> use "--stat" here, too.  Or even "--stat -p".
> 
> Alternatively, we could refresh the index before running diff-files
> (here and also before the earlier "the same contents" test), I
> guess.

...to your point, we probably don't need both the "unmodified folder1/a
diff-files" *and* "modified folder1/a diff-files" tests. In fact, the empty
output of "unmodified folder1/a" could be caused by either "this file is
unmodified" or "this file isn't in the index", so the test might pass even
if there's an issue with index expansion. That isn't a problem in the
"modified folder1/a" case, since we're expecting to see - and comparing the
contents of - a diff.

I think we can drop the 'diff-files --stat' tests and go straight to the
'run_on_all ../edit-contents folder1/a'. Adding '--' here to disambiguate
the pathspecs might be nice as well.

> 
>> +'
>> +
>>  test_done
> 
> Thanks.

Thanks for the detailed review, apologies for missing these issues earlier.
diff mbox series

Patch

diff --git a/t/t1092-sparse-checkout-compatibility.sh b/t/t1092-sparse-checkout-compatibility.sh
index 0c784813f1..053435bb0c 100755
--- a/t/t1092-sparse-checkout-compatibility.sh
+++ b/t/t1092-sparse-checkout-compatibility.sh
@@ -2108,4 +2108,50 @@  test_expect_success 'sparse-index is not expanded: write-tree' '
 	ensure_not_expanded write-tree
 '
 
+test_expect_success 'diff-files with pathspec inside sparse definition' '
+	init_repos &&
+
+	write_script edit-contents <<-\EOF &&
+	echo text >>"$1"
+	EOF
+
+	run_on_all ../edit-contents deep/a &&
+
+	test_all_match git diff-files &&
+
+	test_all_match git diff-files deep/a &&
+
+	# test wildcard
+	test_all_match git diff-files "deep/*"
+'
+
+test_expect_success 'diff-files with pathspec outside sparse definition' '
+	init_repos &&
+
+	test_sparse_match test_must_fail git diff-files folder2/a &&
+
+	write_script edit-contents <<-\EOF &&
+	echo text >>"$1"
+	EOF
+
+	# Add file to the index but outside of cone for sparse-checkout cases.
+	# Add file to the index without sparse-checkout cases to ensure all have
+	# same output.
+	run_on_all mkdir -p folder1 &&
+	run_on_all cp a folder1/a &&
+
+	# file present on-disk without modifications
+	# use `--stat` to ignore file creation time differences in
+	# unrefreshed index
+	test_all_match git diff-files --stat &&
+	test_all_match git diff-files --stat folder1/a &&
+	test_all_match git diff-files --stat "folder*/a" &&
+
+	# file present on-disk with modifications
+	run_on_all ../edit-contents folder1/a &&
+	test_all_match git diff-files &&
+	test_all_match git diff-files folder1/a &&
+	test_all_match git diff-files "folder*/a"
+'
+
 test_done