Mercurial > hg
view tests/test-convert-svn-source.t @ 42743:8c9a6adec67a
rust-discovery: using the children cache in add_missing
The DAG range computation often needs to get back to very old
revisions, and turns out to be disproportionately long, given
that the end goal is to remove the descendents of the given
missing revisons from the undecided set.
The fast iteration capabilities available in the Rust case make
it possible to avoid the DAG range entirely, at the cost of
precomputing the children cache, and to simply iterate on
children of the given missing revisions.
This is a case where staying on the same side of the interface
between the two languages has clear benefits.
On discoveries with initial undecided sets
small enough to bypass sampling entirely, the total cost of
computing the children cache and the subsequent iteration
becomes better than the Python + C counterpart, which relies on
reachableroots2.
For example, on a repo with more than one million revisions with
an initial undecided set of 11 elements, we get these figures:
Rust version with simple iteration
addcommons: 57.287us
first undecided computation: 184.278334ms
first children cache computation: 131.056us
addmissings iteration: 42.766us
first addinfo total: 185.24 ms
Python + C version
first addcommons: 0.29 ms
addcommons 0.21 ms
first undecided computation 191.35 ms
addmissings 45.75 ms
first addinfo total: 237.77 ms
On discoveries with large undecided sets, the initial price paid
makes the first addinfo slower than the Python + C version,
but that's more than compensated by the gain in sampling and
subsequent iterations.
Here's an extreme example with an undecided set of a million revisions:
Rust version:
first undecided computation: 293.842629ms
first children cache computation: 407.911297ms
addmissings iteration: 34.312869ms
first addinfo total: 776.02 ms
taking initial sample
query 2: sampling time: 1318.38 ms
query 2; still undecided: 1005013, sample size is: 200
addmissings: 143.062us
Python + C version:
first undecided computation 298.13 ms
addmissings 80.13 ms
first addinfo total: 399.62 ms
taking initial sample
query 2: sampling time: 3957.23 ms
query 2; still undecided: 1005013, sample size is: 200
addmissings 52.88 ms
Differential Revision: https://phab.mercurial-scm.org/D6428
author | Georges Racinet <georges.racinet@octobus.net> |
---|---|
date | Tue, 16 Apr 2019 01:16:39 +0200 |
parents | e095a9688a31 |
children | 7e5be4a7cda7 |
line wrap: on
line source
#require svn svn-bindings $ filter_svn_output () { > egrep -v 'Committing|Updating|(^$)' | sed -e 's/done$//' || true > } $ cat >> $HGRCPATH <<EOF > [extensions] > convert = > [convert] > svn.trunk = mytrunk > EOF $ svnadmin create svn-repo $ SVNREPOPATH=`pwd`/svn-repo $ SVNREPOURL="`"$PYTHON" $TESTDIR/svnurlof.py \"$SVNREPOPATH\"`" $ INVALIDREVISIONID=svn:x2147622-4a9f-4db4-a8d3-13562ff547b2/proj%20B/mytrunk@1 $ VALIDREVISIONID=svn:a2147622-4a9f-4db4-a8d3-13562ff547b2/proj%20B/mytrunk/mytrunk@1 Now test that it works with trunk/tags layout, but no branches yet. Initial svn import $ mkdir projB $ cd projB $ mkdir mytrunk $ mkdir tags $ cd .. $ svn import -m "init projB" projB "$SVNREPOURL/proj%20B" | filter_svn_output | sort Adding projB/mytrunk Adding projB/tags Committed revision 1. Update svn repository $ svn co "$SVNREPOURL/proj%20B/mytrunk" B | filter_svn_output Checked out revision 1. $ cd B $ echo hello > 'letter .txt' $ svn add 'letter .txt' | filter_svn_output A letter .txt $ svn ci -m hello | filter_svn_output Adding letter .txt Transmitting file data . Committed revision 2. $ svn-safe-append.py world 'letter .txt' $ svn ci -m world | filter_svn_output Sending letter .txt Transmitting file data . Committed revision 3. $ svn copy -m "tag v0.1" "$SVNREPOURL/proj%20B/mytrunk" "$SVNREPOURL/proj%20B/tags/v0.1" | filter_svn_output Committed revision 4. $ svn-safe-append.py 'nice day today!' 'letter .txt' $ svn ci -m "nice day" | filter_svn_output Sending letter .txt Transmitting file data . Committed revision 5. $ cd .. Convert to hg once and also test localtimezone option NOTE: This doesn't check all time zones -- it merely determines that the configuration option is taking effect. An arbitrary (U.S.) time zone is used here. TZ=US/Hawaii is selected since it does not use DST (unlike other U.S. time zones) and is always a fixed difference from UTC. $ TZ=US/Hawaii hg convert --config convert.localtimezone=True "$SVNREPOURL/proj%20B" B-hg initializing destination B-hg repository scanning source... sorting... converting... 3 init projB 2 hello 1 world 0 nice day updating tags Update svn repository again $ cd B $ svn-safe-append.py "see second letter" 'letter .txt' $ echo "nice to meet you" > letter2.txt $ svn add letter2.txt | filter_svn_output A letter2.txt $ svn ci -m "second letter" | filter_svn_output Sending letter .txt Adding letter2.txt Transmitting file data .. Committed revision 6. $ svn copy -m "tag v0.2" "$SVNREPOURL/proj%20B/mytrunk" "$SVNREPOURL/proj%20B/tags/v0.2" | filter_svn_output Committed revision 7. $ svn-safe-append.py "blah-blah-blah" letter2.txt $ svn ci -m "work in progress" | filter_svn_output Sending letter2.txt Transmitting file data . Committed revision 8. $ cd .. $ hg convert -s svn "$SVNREPOURL/proj%20B/non-existent-path" dest initializing destination dest repository abort: no revision found in module /proj B/non-existent-path [255] ######################################## Test incremental conversion $ TZ=US/Hawaii hg convert --config convert.localtimezone=True "$SVNREPOURL/proj%20B" B-hg scanning source... sorting... converting... 1 second letter 0 work in progress updating tags $ cd B-hg $ hg log -G --template '{rev} {desc|firstline} date: {date|date} files: {files}\n' o 7 update tags date: * +0000 files: .hgtags (glob) | o 6 work in progress date: * -1000 files: letter2.txt (glob) | o 5 second letter date: * -1000 files: letter .txt letter2.txt (glob) | o 4 update tags date: * +0000 files: .hgtags (glob) | o 3 nice day date: * -1000 files: letter .txt (glob) | o 2 world date: * -1000 files: letter .txt (glob) | o 1 hello date: * -1000 files: letter .txt (glob) | o 0 init projB date: * -1000 files: (glob) $ hg tags -q tip v0.2 v0.1 $ cd .. Test filemap $ echo 'include letter2.txt' > filemap $ hg convert --filemap filemap "$SVNREPOURL/proj%20B/mytrunk" fmap initializing destination fmap repository scanning source... sorting... converting... 5 init projB 4 hello 3 world 2 nice day 1 second letter 0 work in progress $ hg -R fmap branch -q default $ hg log -G -R fmap --template '{rev} {desc|firstline} files: {files}\n' o 1 work in progress files: letter2.txt | o 0 second letter files: letter2.txt Convert with --full adds and removes files that didn't change $ cd B $ echo >> "letter .txt" $ svn ci -m 'nothing' | filter_svn_output Sending letter .txt Transmitting file data . Committed revision 9. $ cd .. $ echo 'rename letter2.txt letter3.txt' > filemap $ hg convert --filemap filemap --full "$SVNREPOURL/proj%20B/mytrunk" fmap scanning source... sorting... converting... 0 nothing $ hg -R fmap st --change tip A letter .txt A letter3.txt R letter2.txt test invalid splicemap1 $ cat > splicemap <<EOF > $INVALIDREVISIONID $VALIDREVISIONID > EOF $ hg convert --splicemap splicemap "$SVNREPOURL/proj%20B/mytrunk" smap initializing destination smap repository abort: splicemap entry svn:x2147622-4a9f-4db4-a8d3-13562ff547b2/proj%20B/mytrunk@1 is not a valid revision identifier [255] Test stop revision $ hg convert --rev 1 "$SVNREPOURL/proj%20B/mytrunk" stoprev initializing destination stoprev repository scanning source... sorting... converting... 0 init projB $ hg -R stoprev branch -q default Check convert_revision extra-records. This is also the only place testing more than one extra field in a revision. $ cd stoprev $ hg tip --debug | grep extra extra: branch=default extra: convert_revision=svn:........-....-....-....-............/proj B/mytrunk@1 (re) $ cd .. Test converting empty heads (issue3347). Also tests getting logs directly without debugsvnlog. $ svnadmin create svn-empty $ svnadmin load -q svn-empty < "$TESTDIR/svn/empty.svndump" $ hg --config convert.svn.trunk= --config convert.svn.debugsvnlog=0 convert svn-empty assuming destination svn-empty-hg initializing destination svn-empty-hg repository scanning source... sorting... converting... 1 init projA 0 adddir $ hg --config convert.svn.trunk= convert "$SVNREPOURL/../svn-empty/trunk" assuming destination trunk-hg initializing destination trunk-hg repository scanning source... sorting... converting... 1 init projA 0 adddir Test that a too-new repository format is properly rejected: $ mv svn-empty/format format $ echo 999 > svn-empty/format It's important that this command explicitly specify svn, otherwise it can have surprising side effects (like falling back to a perforce depot that can be seen from the test environment and slurping from that.) $ hg convert --source-type svn svn-empty this-will-fail initializing destination this-will-fail repository file:/*/$TESTTMP/svn-empty does not look like a Subversion repository to libsvn version 1.*.* (glob) abort: svn-empty: missing or unsupported repository [255] $ mv format svn-empty/format enable svn subrepos $ cat >> $HGRCPATH <<EOF > [subrepos] > svn:allowed = true > EOF try converting when we have an svn subrepo and a merge in hg superrepo (issue5657) $ cd "$TESTTMP" $ hg init withmerge $ cd withmerge $ echo "subrepo = [svn]$SVNREPOURL" >.hgsub $ hg add .hgsub $ svn checkout "$SVNREPOURL" subrepo | sort A subrepo/proj B A subrepo/proj B/mytrunk A subrepo/proj B/mytrunk/letter .txt A subrepo/proj B/mytrunk/letter2.txt A subrepo/proj B/tags A subrepo/proj B/tags/v0.1 A subrepo/proj B/tags/v0.1/letter .txt A subrepo/proj B/tags/v0.2 A subrepo/proj B/tags/v0.2/letter .txt A subrepo/proj B/tags/v0.2/letter2.txt Checked out revision 9. $ hg ci -m "Adding svn subrepo" $ touch file1.txt $ hg add file1.txt $ hg ci -m "Adding file1" $ hg up 0 0 files updated, 0 files merged, 1 files removed, 0 files unresolved $ touch file2.txt $ hg add file2.txt $ hg ci -m "Adding file2" created new head $ hg merge 1 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) $ hg ci -m "merged" $ cd .. $ hg --config extensions.convert= convert withmerge withmerge-converted initializing destination withmerge-converted repository scanning source... sorting... converting... 3 Adding svn subrepo 2 Adding file1 1 Adding file2 0 merged $ cd withmerge-converted $ hg up | sort 4 files updated, 0 files merged, 0 files removed, 0 files unresolved A subrepo/proj B A subrepo/proj B/mytrunk A subrepo/proj B/mytrunk/letter .txt A subrepo/proj B/mytrunk/letter2.txt A subrepo/proj B/tags A subrepo/proj B/tags/v0.1 A subrepo/proj B/tags/v0.1/letter .txt A subrepo/proj B/tags/v0.2 A subrepo/proj B/tags/v0.2/letter .txt A subrepo/proj B/tags/v0.2/letter2.txt Checked out revision 9. $ ls file1.txt file2.txt subrepo