test: use a more direct approach to test racy mutation
The previous test was relying on implementation details and harder to maintain.
The new version is closer to the initial intend : "What happens the file get overwritten from under the current process"
This change is motivated by further changes around the transaction and dirstate
logic that would break the fragile equilibrium that existed before this patch.
Making this change early make it easier to review on its own and remove noise
in future larger changes.
--- a/tests/test-racy-mutations.t Mon Feb 13 23:56:13 2023 +0100
+++ b/tests/test-racy-mutations.t Tue Feb 07 13:14:59 2023 +0100
@@ -6,8 +6,12 @@
- something (that doesn't respect the lock file) writing to the .hg directory
while we're running
- $ hg init a
- $ cd a
+
+Initial setup
+-------------
+
+ $ hg init base-repo
+ $ cd base-repo
$ cat > "$TESTTMP_FORWARD_SLASH/waitlock_editor.sh" <<EOF
> [ -n "\${WAITLOCK_ANNOUNCE:-}" ] && touch "\${WAITLOCK_ANNOUNCE}"
@@ -26,46 +30,63 @@
$ echo r0 > r0
$ hg commit -qAm 'r0'
+ $ cd ..
+ $ cp -R base-repo main-client
+ $ cp -R base-repo racing-client
+
+ $ mkdir sync
+ $ EDITOR_STARTED="$TESTTMP_FORWARD_SLASH/sync/.editor_started"
+ $ MISCHIEF_MANAGED="$TESTTMP_FORWARD_SLASH/sync/.mischief_managed"
+ $ JOBS_FINISHED="$TESTTMP_FORWARD_SLASH/sync/.jobs_finished"
+
+Actual test
+-----------
+
Start an hg commit that will take a while
- $ EDITOR_STARTED="$TESTTMP_FORWARD_SLASH/a/.editor_started"
- $ MISCHIEF_MANAGED="$TESTTMP_FORWARD_SLASH/a/.mischief_managed"
- $ JOBS_FINISHED="$TESTTMP_FORWARD_SLASH/a/.jobs_finished"
+
+ $ cd main-client
#if fail-if-detected
- $ cat >> .hg/hgrc << EOF
+ $ cat >> $HGRCPATH << EOF
> [debug]
> revlog.verifyposition.changelog = fail
> EOF
#endif
- $ cat >> .hg/hgrc << EOF
- > [ui]
- > editor=sh $TESTTMP_FORWARD_SLASH/waitlock_editor.sh
- > EOF
-
$ echo foo > foo
- $ (unset HGEDITOR;
- > WAITLOCK_ANNOUNCE="${EDITOR_STARTED}" \
- > WAITLOCK_FILE="${MISCHIEF_MANAGED}" \
- > hg commit -qAm 'r1 (foo)' --edit foo > .foo_commit_out 2>&1 ; touch "${JOBS_FINISHED}") &
+ $ (
+ > unset HGEDITOR;
+ > WAITLOCK_ANNOUNCE="${EDITOR_STARTED}" \
+ > WAITLOCK_FILE="${MISCHIEF_MANAGED}" \
+ > hg commit -qAm 'r1 (foo)' --edit foo \
+ > --config ui.editor="sh $TESTTMP_FORWARD_SLASH/waitlock_editor.sh" \
+ > > .foo_commit_out 2>&1 ;\
+ > touch "${JOBS_FINISHED}"
+ > ) &
Wait for the "editor" to actually start
$ sh "$RUNTESTDIR_FORWARD_SLASH/testlib/wait-on-file" 5 "${EDITOR_STARTED}"
- $ cat >> .hg/hgrc << EOF
- > [ui]
- > editor=
- > EOF
-Break the locks, and make another commit.
- $ hg debuglocks -LW
+Do a concurrent edition
+ $ cd ../racing-client
+ $ touch ../pre-race
+ $ sleep 1
$ echo bar > bar
- $ hg commit -qAm 'r2 (bar)' bar
- $ hg debugrevlogindex -c
+ $ hg --repository ../racing-client commit -qAm 'r2 (bar)' bar
+ $ hg --repository ../racing-client debugrevlogindex -c
rev linkrev nodeid p1 p2
0 0 222799e2f90b 000000000000 000000000000
1 1 6f124f6007a0 222799e2f90b 000000000000
+We simulate an network FS race by overwriting raced repo content with the new
+content of the files changed in the racing repository
+
+ $ for x in `find . -type f -newer ../pre-race`; do
+ > cp $x ../main-client/$x
+ > done
+ $ cd ../main-client
+
Awaken the editor from that first commit
$ touch "${MISCHIEF_MANAGED}"
And wait for it to finish