clone-bundles: add an option to generate bundles in the background
This is what the "on-change" version have been doing from the start, it seems
useful to also offer this option in the command.
#require no-reposimplestore no-chg
initial setup
$ hg init server
$ cat >> server/.hg/hgrc << EOF
> [extensions]
> clonebundles =
>
> [clone-bundles]
> auto-generate.on-change = yes
> auto-generate.formats = v2
> upload-command = cp "\$HGCB_BUNDLE_PATH" "$TESTTMP"/final-upload/
> delete-command = rm -f "$TESTTMP/final-upload/\$HGCB_BASENAME"
> url-template = file://$TESTTMP/final-upload/{basename}
>
> [devel]
> debug.clonebundles=yes
> EOF
$ mkdir final-upload
$ hg clone server client
updating to branch default
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ cd client
Test bundles are generated on push
==================================
$ touch foo
$ hg -q commit -A -m 'add foo'
$ touch bar
$ hg -q commit -A -m 'add bar'
$ hg push
pushing to $TESTTMP/server
searching for changes
adding changesets
adding manifests
adding file changes
2 changesets found
added 2 changesets with 2 changes to 2 files
clone-bundles: starting bundle generation: v2
$ cat ../server/.hg/clonebundles.manifest
file:/*/$TESTTMP/final-upload/full-v2-2_revs-aaff8d2ffbbf_tip-*_txn.hg BUNDLESPEC=v2 REQUIRESNI=true (glob)
$ ls -1 ../final-upload
full-v2-2_revs-aaff8d2ffbbf_tip-*_txn.hg (glob)
$ ls -1 ../server/.hg/tmp-bundles
Newer bundles are generated with more pushes
--------------------------------------------
$ touch baz
$ hg -q commit -A -m 'add baz'
$ touch buz
$ hg -q commit -A -m 'add buz'
$ hg push
pushing to $TESTTMP/server
searching for changes
adding changesets
adding manifests
adding file changes
4 changesets found
added 2 changesets with 2 changes to 2 files
clone-bundles: starting bundle generation: v2
$ cat ../server/.hg/clonebundles.manifest
file:/*/$TESTTMP/final-upload/full-v2-4_revs-6427147b985a_tip-*_txn.hg BUNDLESPEC=v2 REQUIRESNI=true (glob)
$ ls -1 ../final-upload
full-v2-2_revs-aaff8d2ffbbf_tip-*_txn.hg (glob)
full-v2-4_revs-6427147b985a_tip-*_txn.hg (glob)
$ ls -1 ../server/.hg/tmp-bundles
Older bundles are cleaned up with more pushes
---------------------------------------------
$ touch faz
$ hg -q commit -A -m 'add faz'
$ touch fuz
$ hg -q commit -A -m 'add fuz'
$ hg push
pushing to $TESTTMP/server
searching for changes
adding changesets
adding manifests
adding file changes
clone-bundles: deleting bundle full-v2-2_revs-aaff8d2ffbbf_tip-*_txn.hg (glob)
6 changesets found
added 2 changesets with 2 changes to 2 files
clone-bundles: starting bundle generation: v2
$ cat ../server/.hg/clonebundles.manifest
file:/*/$TESTTMP/final-upload/full-v2-6_revs-b1010e95ea00_tip-*_txn.hg BUNDLESPEC=v2 REQUIRESNI=true (glob)
$ ls -1 ../final-upload
full-v2-4_revs-6427147b985a_tip-*_txn.hg (glob)
full-v2-6_revs-b1010e95ea00_tip-*_txn.hg (glob)
$ ls -1 ../server/.hg/tmp-bundles
Test conditions to get them generated
=====================================
Check ratio
$ cat >> ../server/.hg/hgrc << EOF
> [clone-bundles]
> trigger.below-bundled-ratio = 0.5
> EOF
$ touch far
$ hg -q commit -A -m 'add far'
$ hg push
pushing to $TESTTMP/server
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
$ cat ../server/.hg/clonebundles.manifest
file:/*/$TESTTMP/final-upload/full-v2-6_revs-b1010e95ea00_tip-*_txn.hg BUNDLESPEC=v2 REQUIRESNI=true (glob)
$ ls -1 ../final-upload
full-v2-4_revs-6427147b985a_tip-*_txn.hg (glob)
full-v2-6_revs-b1010e95ea00_tip-*_txn.hg (glob)
$ ls -1 ../server/.hg/tmp-bundles
Check absolute number of revisions
$ cat >> ../server/.hg/hgrc << EOF
> [clone-bundles]
> trigger.revs = 2
> EOF
$ touch bur
$ hg -q commit -A -m 'add bur'
$ hg push
pushing to $TESTTMP/server
searching for changes
adding changesets
adding manifests
adding file changes
clone-bundles: deleting bundle full-v2-4_revs-6427147b985a_tip-*_txn.hg (glob)
8 changesets found
added 1 changesets with 1 changes to 1 files
clone-bundles: starting bundle generation: v2
$ cat ../server/.hg/clonebundles.manifest
file:/*/$TESTTMP/final-upload/full-v2-8_revs-8353e8af1306_tip-*_txn.hg BUNDLESPEC=v2 REQUIRESNI=true (glob)
$ ls -1 ../final-upload
full-v2-6_revs-b1010e95ea00_tip-*_txn.hg (glob)
full-v2-8_revs-8353e8af1306_tip-*_txn.hg (glob)
$ ls -1 ../server/.hg/tmp-bundles
(that one would not generate new bundles)
$ touch tur
$ hg -q commit -A -m 'add tur'
$ hg push
pushing to $TESTTMP/server
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
$ cat ../server/.hg/clonebundles.manifest
file:/*/$TESTTMP/final-upload/full-v2-8_revs-8353e8af1306_tip-*_txn.hg BUNDLESPEC=v2 REQUIRESNI=true (glob)
$ ls -1 ../final-upload
full-v2-6_revs-b1010e95ea00_tip-*_txn.hg (glob)
full-v2-8_revs-8353e8af1306_tip-*_txn.hg (glob)
$ ls -1 ../server/.hg/tmp-bundles
Test generation through the dedicated command
=============================================
$ cat >> ../server/.hg/hgrc << EOF
> [clone-bundles]
> auto-generate.on-change = no
> EOF
Check the command can generate content when needed
--------------------------------------------------
Do a push that makes the condition fulfilled,
Yet it should not automatically generate a bundle with
"auto-generate.on-change" not set.
$ touch quoi
$ hg -q commit -A -m 'add quoi'
$ pre_push_manifest=`cat ../server/.hg/clonebundles.manifest|f --sha256 | sed 's/.*=//' | cat`
$ pre_push_upload=`ls -1 ../final-upload|f --sha256 | sed 's/.*=//' | cat`
$ ls -1 ../server/.hg/tmp-bundles
$ hg push
pushing to $TESTTMP/server
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
$ post_push_manifest=`cat ../server/.hg/clonebundles.manifest|f --sha256 | sed 's/.*=//' | cat`
$ post_push_upload=`ls -1 ../final-upload|f --sha256 | sed 's/.*=//' | cat`
$ ls -1 ../server/.hg/tmp-bundles
$ test "$pre_push_manifest" = "$post_push_manifest"
$ test "$pre_push_upload" = "$post_push_upload"
Running the command should detect the stale bundles, and do the full automatic
generation logic.
$ hg -R ../server/ admin::clone-bundles-refresh
clone-bundles: deleting bundle full-v2-6_revs-b1010e95ea00_tip-*_txn.hg (glob)
clone-bundles: starting bundle generation: v2
10 changesets found
$ cat ../server/.hg/clonebundles.manifest
file:/*/$TESTTMP/final-upload/full-v2-10_revs-3b6f57f17d70_tip-*_acbr.hg BUNDLESPEC=v2 REQUIRESNI=true (glob)
$ ls -1 ../final-upload
full-v2-10_revs-3b6f57f17d70_tip-*_acbr.hg (glob)
full-v2-8_revs-8353e8af1306_tip-*_txn.hg (glob)
$ ls -1 ../server/.hg/tmp-bundles
Check the command cleans up older bundles when possible
-------------------------------------------------------
$ hg -R ../server/ admin::clone-bundles-refresh
clone-bundles: deleting bundle full-v2-8_revs-8353e8af1306_tip-*_txn.hg (glob)
$ cat ../server/.hg/clonebundles.manifest
file:/*/$TESTTMP/final-upload/full-v2-10_revs-3b6f57f17d70_tip-*_acbr.hg BUNDLESPEC=v2 REQUIRESNI=true (glob)
$ ls -1 ../final-upload
full-v2-10_revs-3b6f57f17d70_tip-*_acbr.hg (glob)
$ ls -1 ../server/.hg/tmp-bundles
Nothing is generated when the bundles are sufficiently up to date
-----------------------------------------------------------------
$ touch feur
$ hg -q commit -A -m 'add feur'
$ pre_push_manifest=`cat ../server/.hg/clonebundles.manifest|f --sha256 | sed 's/.*=//' | cat`
$ pre_push_upload=`ls -1 ../final-upload|f --sha256 | sed 's/.*=//' | cat`
$ ls -1 ../server/.hg/tmp-bundles
$ hg push
pushing to $TESTTMP/server
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
$ post_push_manifest=`cat ../server/.hg/clonebundles.manifest|f --sha256 | sed 's/.*=//' | cat`
$ post_push_upload=`ls -1 ../final-upload|f --sha256 | sed 's/.*=//' | cat`
$ ls -1 ../server/.hg/tmp-bundles
$ test "$pre_push_manifest" = "$post_push_manifest"
$ test "$pre_push_upload" = "$post_push_upload"
$ hg -R ../server/ admin::clone-bundles-refresh
$ post_refresh_manifest=`cat ../server/.hg/clonebundles.manifest|f --sha256 | sed 's/.*=//' | cat`
$ post_refresh_upload=`ls -1 ../final-upload|f --sha256 | sed 's/.*=//' | cat`
$ ls -1 ../server/.hg/tmp-bundles
$ test "$pre_push_manifest" = "$post_refresh_manifest"
$ test "$pre_push_upload" = "$post_refresh_upload"
Test modification of configuration
==================================
Testing that later runs adapt to configuration changes even if the repository is
unchanged.
adding more formats
-------------------
bundle for added formats should be generated
change configuration
$ cat >> ../server/.hg/hgrc << EOF
> [clone-bundles]
> auto-generate.formats = v1, v2
> EOF
refresh the bundles
$ hg -R ../server/ admin::clone-bundles-refresh
clone-bundles: starting bundle generation: v1
11 changesets found
the bundle for the "new" format should have been added
$ cat ../server/.hg/clonebundles.manifest
file:/*/$TESTTMP/final-upload/full-v1-11_revs-4226b1cd5fda_tip-*_acbr.hg BUNDLESPEC=v1 REQUIRESNI=true (glob)
file:/*/$TESTTMP/final-upload/full-v2-10_revs-3b6f57f17d70_tip-*_acbr.hg BUNDLESPEC=v2 REQUIRESNI=true (glob)
$ ls -1 ../final-upload
full-v1-11_revs-4226b1cd5fda_tip-*_acbr.hg (glob)
full-v2-10_revs-3b6f57f17d70_tip-*_acbr.hg (glob)
$ ls -1 ../server/.hg/tmp-bundles
Changing the ratio
------------------
Changing the ratio to something that would have triggered a bundle during the last push.
$ cat >> ../server/.hg/hgrc << EOF
> [clone-bundles]
> trigger.below-bundled-ratio = 0.95
> EOF
refresh the bundles
$ hg -R ../server/ admin::clone-bundles-refresh
clone-bundles: starting bundle generation: v2
11 changesets found
the "outdated' bundle should be refreshed
$ cat ../server/.hg/clonebundles.manifest
file:/*/$TESTTMP/final-upload/full-v1-11_revs-4226b1cd5fda_tip-*_acbr.hg BUNDLESPEC=v1 REQUIRESNI=true (glob)
file:/*/$TESTTMP/final-upload/full-v2-11_revs-4226b1cd5fda_tip-*_acbr.hg BUNDLESPEC=v2 REQUIRESNI=true (glob)
$ ls -1 ../final-upload
full-v1-11_revs-4226b1cd5fda_tip-*_acbr.hg (glob)
full-v2-10_revs-3b6f57f17d70_tip-*_acbr.hg (glob)
full-v2-11_revs-4226b1cd5fda_tip-*_acbr.hg (glob)
$ ls -1 ../server/.hg/tmp-bundles
Test more command options
=========================
bundle clearing
---------------
$ hg -R ../server/ admin::clone-bundles-clear
clone-bundles: deleting bundle full-v1-11_revs-4226b1cd5fda_tip-*_acbr.hg (glob)
clone-bundles: deleting bundle full-v2-10_revs-3b6f57f17d70_tip-*_acbr.hg (glob)
clone-bundles: deleting bundle full-v2-11_revs-4226b1cd5fda_tip-*_acbr.hg (glob)
Nothing should remain
$ cat ../server/.hg/clonebundles.manifest
$ ls -1 ../final-upload
$ ls -1 ../server/.hg/tmp-bundles
background generation
---------------------
generate bundle using background subprocess
(since we are in devel mode, the command will still wait for the background
process to end)
$ hg -R ../server/ admin::clone-bundles-refresh --background
11 changesets found
11 changesets found
clone-bundles: starting bundle generation: v1
clone-bundles: starting bundle generation: v2
bundles should have been generated
$ cat ../server/.hg/clonebundles.manifest
file:/*/$TESTTMP/final-upload/full-v1-11_revs-4226b1cd5fda_tip-*_acbr.hg BUNDLESPEC=v1 REQUIRESNI=true (glob)
file:/*/$TESTTMP/final-upload/full-v2-11_revs-4226b1cd5fda_tip-*_acbr.hg BUNDLESPEC=v2 REQUIRESNI=true (glob)
$ ls -1 ../final-upload
full-v1-11_revs-4226b1cd5fda_tip-*_acbr.hg (glob)
full-v2-11_revs-4226b1cd5fda_tip-*_acbr.hg (glob)
$ ls -1 ../server/.hg/tmp-bundles