--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-split-legacy-inline-changelog.t Wed Jun 12 02:15:20 2024 +0200
@@ -0,0 +1,307 @@
+======================================================
+Test operation on repository with an inlined changelog
+======================================================
+
+Inlined revlog has been a bag of complexity for a long time and the combination
+with special transaction logic on the changelog was a long source of bugs
+poorly covered by the test suites.
+
+We stopped doing any usage of inlined-revlog for changelog in a93e52f0b6ff,
+upgrading legacy inlined version as soon as possible when we see them. However
+this Mercurial does not produce such inlined-changelog that case is very poorly
+covered in the test suites. This test file aims at covering these cases.
+
+Double checking test data
+=========================
+
+We should have a repository around
+
+ $ mkdir sanity-check
+ $ cd sanity-check
+ $ tar xf $TESTDIR/bundles/inlined-changelog.tar
+ $ cd inlined-changelog
+ $ hg root
+ $TESTTMP/sanity-check/inlined-changelog
+
+The repository should not be corrupted initially
+
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ checking dirstate
+ checked 1 changesets with 1 changes to 1 files
+
+The changelog of that repository MUST be inlined
+
+ $ hg debugrevlog -c | grep -E '^flags\b'
+ flags : inline
+
+Touching that repository MUST split that inlined changelog
+
+ $ hg branch foo --quiet
+ $ hg commit -m foo --quiet
+ $ hg debugrevlog -c | grep -E '^flags\b'
+ flags : (none)
+
+ $ cd ../..
+
+Test doing a simple commit
+==========================
+
+Simple commit
+-------------
+
+ $ mkdir simple-commit
+ $ cd simple-commit
+ $ tar xf $TESTDIR/bundles/inlined-changelog.tar
+ $ cd inlined-changelog
+ $ hg up --quiet
+ $ hg log -GT '[{rev}] {desc}\n'
+ @ [0] first commit
+
+ $ echo b > b
+ $ hg add b
+ $ hg commit -m "second changeset"
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ checking dirstate
+ checked 2 changesets with 2 changes to 2 files
+ $ hg log -GT '[{rev}] {desc}\n'
+ @ [1] second changeset
+ |
+ o [0] first commit
+
+ $ cd ../..
+
+Simple commit with a pretxn hook configured
+-------------------------------------------
+
+Before 6.7.3 this used to delete the changelog index
+
+ $ mkdir pretxnclose-commit
+ $ cd pretxnclose-commit
+ $ tar xf $TESTDIR/bundles/inlined-changelog.tar
+ $ cat >> inlined-changelog/.hg/hgrc <<EOF
+ > [hooks]
+ > pretxnclose=hg log -r tip -T "pre-txn tip rev: {rev}\n"
+ > EOF
+ $ cd inlined-changelog
+ $ hg up --quiet
+ $ hg log -GT '[{rev}] {desc}\n'
+ @ [0] first commit
+
+ $ echo b > b
+ $ hg add b
+ $ hg commit -m "second changeset"
+ pre-txn tip rev: 1 (missing-correct-output !)
+ warning: ignoring unknown working parent 11b63e930bf2! (known-bad-output !)
+ pre-txn tip rev: 0 (known-bad-output !)
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ checking dirstate
+ checked 2 changesets with 2 changes to 2 files
+ $ hg log -GT '[{rev}] {desc}\n'
+ @ [1] second changeset
+ |
+ o [0] first commit
+
+ $ cd ../..
+
+Test pushing to a repository with a repository revlog
+=====================================================
+
+Simple local push
+-----------------
+
+ $ mkdir simple-local-push
+ $ cd simple-local-push
+ $ tar xf $TESTDIR/bundles/inlined-changelog.tar
+ $ hg log -R inlined-changelog -T '[{rev}] {desc}\n'
+ [0] first commit
+
+ $ hg clone --pull inlined-changelog client
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ new changesets 827f11bfd362
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd client
+ $ echo b > b
+ $ hg add b
+ $ hg commit -m "second changeset"
+ $ hg push
+ pushing to $TESTTMP/*/inlined-changelog (glob)
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ $ cd ..
+
+ $ hg verify -R inlined-changelog
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ checking dirstate
+ checked 2 changesets with 2 changes to 2 files
+ $ hg log -R inlined-changelog -T '[{rev}] {desc}\n'
+ [1] second changeset
+ [0] first commit
+ $ cd ..
+
+Simple local push with a pretxnchangegroup hook
+-----------------------------------------------
+
+Before 6.7.3 this used to delete the server changelog
+
+ $ mkdir pretxnchangegroup-local-push
+ $ cd pretxnchangegroup-local-push
+ $ tar xf $TESTDIR/bundles/inlined-changelog.tar
+ $ cat >> inlined-changelog/.hg/hgrc <<EOF
+ > [hooks]
+ > pretxnchangegroup=hg log -r tip -T "pre-txn tip rev: {rev}\n"
+ > EOF
+ $ hg log -R inlined-changelog -T '[{rev}] {desc}\n'
+ [0] first commit
+
+ $ hg clone --pull inlined-changelog client
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ new changesets 827f11bfd362
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd client
+ $ echo b > b
+ $ hg add b
+ $ hg commit -m "second changeset"
+ $ hg push
+ pushing to $TESTTMP/*/inlined-changelog (glob)
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ pre-txn tip rev: 1 (missing-correct-output !)
+ pre-txn tip rev: 0 (known-bad-output !)
+ added 1 changesets with 1 changes to 1 files
+ $ cd ..
+
+ $ hg verify -R inlined-changelog
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ checking dirstate
+ checked 2 changesets with 2 changes to 2 files
+ $ hg log -R inlined-changelog -T '[{rev}] {desc}\n'
+ [1] second changeset
+ [0] first commit
+ $ cd ..
+
+Simple ssh push
+-----------------
+
+ $ mkdir simple-ssh-push
+ $ cd simple-ssh-push
+ $ tar xf $TESTDIR/bundles/inlined-changelog.tar
+ $ hg log -R inlined-changelog -T '[{rev}] {desc}\n'
+ [0] first commit
+
+ $ hg clone ssh://user@dummy/"`pwd`"/inlined-changelog client
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ new changesets 827f11bfd362
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd client
+ $ echo b > b
+ $ hg add b
+ $ hg commit -m "second changeset"
+ $ hg push
+ pushing to ssh://user@dummy/$TESTTMP/simple-ssh-push/inlined-changelog
+ searching for changes
+ remote: adding changesets
+ remote: adding manifests
+ remote: adding file changes
+ remote: added 1 changesets with 1 changes to 1 files
+ $ cd ..
+
+ $ hg verify -R inlined-changelog
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ checking dirstate
+ checked 2 changesets with 2 changes to 2 files
+ $ hg log -R inlined-changelog -T '[{rev}] {desc}\n'
+ [1] second changeset
+ [0] first commit
+ $ cd ..
+
+Simple ssh push with a pretxnchangegroup hook
+-----------------------------------------------
+
+Before 6.7.3 this used to delete the server changelog
+
+ $ mkdir pretxnchangegroup-ssh-push
+ $ cd pretxnchangegroup-ssh-push
+ $ tar xf $TESTDIR/bundles/inlined-changelog.tar
+ $ cat >> inlined-changelog/.hg/hgrc <<EOF
+ > [hooks]
+ > pretxnchangegroup=hg log -r tip -T "pre-txn tip rev: {rev}\n"
+ > EOF
+ $ hg log -R inlined-changelog -T '[{rev}] {desc}\n'
+ [0] first commit
+
+ $ hg clone ssh://user@dummy/"`pwd`"/inlined-changelog client
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ new changesets 827f11bfd362
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd client
+ $ echo b > b
+ $ hg add b
+ $ hg commit -m "second changeset"
+ $ hg push
+ pushing to ssh://user@dummy/$TESTTMP/pretxnchangegroup-ssh-push/inlined-changelog
+ searching for changes
+ remote: adding changesets
+ remote: adding manifests
+ remote: adding file changes
+ remote: pre-txn tip rev: 1 (missing-correct-output !)
+ remote: pre-txn tip rev: 0 (known-bad-output !)
+ remote: added 1 changesets with 1 changes to 1 files
+ $ cd ..
+
+ $ hg verify -R inlined-changelog
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ checking dirstate
+ checked 2 changesets with 2 changes to 2 files
+ $ hg log -R inlined-changelog -T '[{rev}] {desc}\n'
+ [1] second changeset
+ [0] first commit
+ $ cd ..