Thread (138 messages) flat view 138 messages, 9 authors, 2022-03-10

Re: [PATCH v4 5/6] core.fsyncobjectfiles: tests for batch mode

From: Neeraj Singh <hidden>
Date: 2021-09-22 17:56:07

On Tue, Sep 21, 2021 at 7:02 PM Ævar Arnfjörð Bjarmason
[off-list ref] wrote:

On Tue, Sep 21 2021, Neeraj Singh wrote:
quoted
On Tue, Sep 21, 2021 at 4:58 PM Ævar Arnfjörð Bjarmason
[off-list ref] wrote:
quoted

On Mon, Sep 20 2021, Neeraj Singh via GitGitGadget wrote:
quoted
From: Neeraj Singh <redacted>

Add test cases to exercise batch mode for 'git add'
and 'git stash'. These tests ensure that the added
data winds up in the object database.

I verified the tests by introducing an incorrect rename
in do_sync_and_rename.

Signed-off-by: Neeraj Singh <redacted>
---
 t/lib-unique-files.sh | 34 ++++++++++++++++++++++++++++++++++
 t/t3700-add.sh        | 11 +++++++++++
 t/t3903-stash.sh      | 14 ++++++++++++++
 3 files changed, 59 insertions(+)
 create mode 100644 t/lib-unique-files.sh
diff --git a/t/lib-unique-files.sh b/t/lib-unique-files.sh
new file mode 100644
index 00000000000..a8a25eba61d
--- /dev/null
+++ b/t/lib-unique-files.sh
@@ -0,0 +1,34 @@
+# Helper to create files with unique contents
+
+test_create_unique_files_base__=$(date -u)
+test_create_unique_files_counter__=0
+
+# Create multiple files with unique contents. Takes the number of
+# directories, the number of files in each directory, and the base
+# directory.
+#
+# test_create_unique_files 2 3 . -- Creates 2 directories with 3 files
+#                                each in the specified directory, all
+#                                with unique contents.
+
+test_create_unique_files() {
+     test "$#" -ne 3 && BUG "3 param"
+
+     local dirs=$1
+     local files=$2
+     local basedir=$3
+
+     rm -rf $basedir >/dev/null
Why the >/dev/null? It's not a "-rfv", and any errors would go to
stderr.
Will fix. Clearly I don't know UNIX very well.
quoted
quoted
+             mkdir -p "$dir" > /dev/null
Ditto.
Will fix.
quoted
quoted
+             for j in $(test_seq $files)
+             do
+                     test_create_unique_files_counter__=$((test_create_unique_files_counter__ + 1))
+                     echo "$test_create_unique_files_base__.$test_create_unique_files_counter__"  >"$dir/file$j.txt"
Would be much more readable if we these variables were shorter.

But actually, why are we trying to create files as a function of "date
-u" at all? This is all in the trash directory, which is rm -rf'd beween
runs, why aren't names created with test_seq or whatever OK? I.e. just
1.txt, 2.txt....
The uniqueness is in the contents of the file.  I wanted to make sure that
we are really creating new objects and not reusing old ones.  Is the scope
of the "trash repo" small enough that I can be guaranteed that a new one
is created before my test since the last time I tried adding something to
the ODB?
quoted
quoted
+test_expect_success 'stash with core.fsyncobjectfiles=batch' "
+     test_create_unique_files 2 4 fsync-files &&
+     git -c core.fsyncobjectfiles=batch stash push -u -- ./fsync-files/ &&
+     rm -f fsynced_files &&
+
+     # The files were untracked, so use the third parent,
+     # which contains the untracked files
+     git ls-tree -r stash^3 -- ./fsync-files/ > fsynced_files &&
+     test_line_count = 8 fsynced_files &&
+     cat fsynced_files | awk '{print \$3}' | xargs -n1 git cat-file -e
+"
+
+
 test_expect_success 'stash -c stash.useBuiltin=false warning ' '
      expected="stash.useBuiltin support has been removed" &&
We really prefer our tests to create the same data each time if
possible, but as noted with the "date -u" comment above you're
explicitly bypassing that, but I still can't see why...
I'm trying to make sure we get new object contents. Is there a better
way to achieve what I want without the risk of finding that the contents
are already in the database from a previous test run?
You can just do something like:

test_expect_success 'setup data' '
        test_commit A &&
        test_commit B
'

Which will create files A.t, B.t etc, or create them via:

    obj=$(echo foo | git hash-object -w --stdin)

etc.

I.e. the uniqueness you're doing here seems to assume that tests are
re-using the same object store across runs, but we create a new trash
directory for each one, if you run the test with "-d" you can see it
being left behind for inspection. This is already ensured for the test.

The only potential caveat I can imagine is that some filesystem like say
btrfs-like that does some COW or object de-duplication would behave
differently, but other than that...
It looks like the same repo is reused for each test_expect_success
line in the top-level t*.sh script.
So for test_create_unique_files to be maximally useful, it should have
some state that is different for
each invocation.  How about I use the test_tick mechanism to produce
this uniqueness?  It wouldn't
be globally unique like the date method, but it should be good enough
if the repo is recycled every time
test-lib is reinitialized.

I'm changing lib-unique-files to use test_tick and to be a little more
readable as you suggested. Please
let me know if you have any other suggestions.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help