##// END OF EJS Templates
httppeer: implement command executor for version 2 peer...
httppeer: implement command executor for version 2 peer Now that we have a new API for issuing commands which is compatible with wire protocol version 2, we can start using it with wire protocol version 2. This commit replaces our hacky implementation of _call() with something a bit more robust based on the new command executor interface. We now have proper support for issuing multiple commands per HTTP request. Each HTTP request maintains its own client reactor. The implementation is similar to the one in the legacy wire protocol. We use a ThreadPoolExecutor for spinning up a thread to read the HTTP response in the background. This allows responses to resolve in any order. While not implemented on the server yet, a client could use concurrent.futures.as_completed() with a collection of futures and handle responses as they arrive from the server. The return value from issued commands is still a simple list of raw or decoded CBOR data. This is still super hacky. We will want a rich data type for representing command responses. But at least this commit gets us one step closer to a proper peer implementation. Differential Revision: https://phab.mercurial-scm.org/D3297

File last commit:

r37362:e1942c19 default
r37669:950294e2 default
Show More
test-push.t
350 lines | 9.0 KiB | text/troff | Tads3Lexer
Pierre-Yves David
test: rename 'test-push-r.t' to 'test-push.t'...
r30279 ==================================
Basic testing for the push command
==================================
Testing of the '--rev' flag
===========================
$ hg init test-revflag
$ hg -R test-revflag unbundle "$TESTDIR/bundles/remote.hg"
adding changesets
adding manifests
adding file changes
added 9 changesets with 7 changes to 4 files (+1 heads)
Denis Laxalde
transaction-summary: show the range of new revisions upon pull/unbundle (BC)...
r34662 new changesets bfaf4b5cbf01:916f1afdef90
Pierre-Yves David
test: rename 'test-push-r.t' to 'test-push.t'...
r30279 (run 'hg heads' to see heads, 'hg merge' to merge)
$ for i in 0 1 2 3 4 5 6 7 8; do
> echo
> hg init test-revflag-"$i"
> hg -R test-revflag push -r "$i" test-revflag-"$i"
> hg -R test-revflag-"$i" verify
> done
pushing to test-revflag-0
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
checking changesets
checking manifests
crosschecking files in changesets and manifests
checking files
1 files, 1 changesets, 1 total revisions
pushing to test-revflag-1
searching for changes
adding changesets
adding manifests
adding file changes
added 2 changesets with 2 changes to 1 files
checking changesets
checking manifests
crosschecking files in changesets and manifests
checking files
1 files, 2 changesets, 2 total revisions
pushing to test-revflag-2
searching for changes
adding changesets
adding manifests
adding file changes
added 3 changesets with 3 changes to 1 files
checking changesets
checking manifests
crosschecking files in changesets and manifests
checking files
1 files, 3 changesets, 3 total revisions
pushing to test-revflag-3
searching for changes
adding changesets
adding manifests
adding file changes
added 4 changesets with 4 changes to 1 files
checking changesets
checking manifests
crosschecking files in changesets and manifests
checking files
1 files, 4 changesets, 4 total revisions
pushing to test-revflag-4
searching for changes
adding changesets
adding manifests
adding file changes
added 2 changesets with 2 changes to 1 files
checking changesets
checking manifests
crosschecking files in changesets and manifests
checking files
1 files, 2 changesets, 2 total revisions
pushing to test-revflag-5
searching for changes
adding changesets
adding manifests
adding file changes
added 3 changesets with 3 changes to 1 files
checking changesets
checking manifests
crosschecking files in changesets and manifests
checking files
1 files, 3 changesets, 3 total revisions
pushing to test-revflag-6
searching for changes
adding changesets
adding manifests
adding file changes
added 4 changesets with 5 changes to 2 files
checking changesets
checking manifests
crosschecking files in changesets and manifests
checking files
2 files, 4 changesets, 5 total revisions
pushing to test-revflag-7
searching for changes
adding changesets
adding manifests
adding file changes
added 5 changesets with 6 changes to 3 files
checking changesets
checking manifests
crosschecking files in changesets and manifests
checking files
3 files, 5 changesets, 6 total revisions
pushing to test-revflag-8
searching for changes
adding changesets
adding manifests
adding file changes
added 5 changesets with 5 changes to 2 files
checking changesets
checking manifests
crosschecking files in changesets and manifests
checking files
2 files, 5 changesets, 5 total revisions
$ cd test-revflag-8
$ hg pull ../test-revflag-7
pulling from ../test-revflag-7
searching for changes
adding changesets
adding manifests
adding file changes
added 4 changesets with 2 changes to 3 files (+1 heads)
Denis Laxalde
transaction-summary: show the range of new revisions upon pull/unbundle (BC)...
r34662 new changesets c70afb1ee985:faa2e4234c7a
Pierre-Yves David
test: rename 'test-push-r.t' to 'test-push.t'...
r30279 (run 'hg heads' to see heads, 'hg merge' to merge)
$ hg verify
checking changesets
checking manifests
crosschecking files in changesets and manifests
checking files
4 files, 9 changesets, 7 total revisions
$ cd ..
Pierre-Yves David
tests: merge 'test-push-validation.t' into 'test-push.t'...
r30280
Test server side validation during push
=======================================
$ hg init test-validation
$ cd test-validation
$ cat > .hg/hgrc <<EOF
> [server]
> validate=1
> EOF
$ echo alpha > alpha
$ echo beta > beta
$ hg addr
adding alpha
adding beta
$ hg ci -m 1
$ cd ..
$ hg clone test-validation test-validation-clone
updating to branch default
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
Gregory Szorc
tests: skip filelog damage tests when not using revlogs...
r37362 #if reporevlogstore
Pierre-Yves David
tests: merge 'test-push-validation.t' into 'test-push.t'...
r30280 Test spurious filelog entries:
$ cd test-validation-clone
$ echo blah >> beta
$ cp .hg/store/data/beta.i tmp1
$ hg ci -m 2
$ cp .hg/store/data/beta.i tmp2
$ hg -q rollback
$ mv tmp2 .hg/store/data/beta.i
$ echo blah >> beta
$ hg ci -m '2 (corrupt)'
Expected to fail:
$ hg verify
checking changesets
checking manifests
crosschecking files in changesets and manifests
checking files
beta@1: dddc47b3ba30 not in manifests
2 files, 2 changesets, 4 total revisions
1 integrity errors encountered!
(first damaged changeset appears to be 1)
[1]
$ hg push
Matt Harbison
tests: remove (glob) annotations that were only for '\' matches...
r35394 pushing to $TESTTMP/test-validation
Pierre-Yves David
tests: merge 'test-push-validation.t' into 'test-push.t'...
r30280 searching for changes
adding changesets
adding manifests
adding file changes
transaction abort!
rollback completed
abort: received spurious file revlog entry
[255]
$ hg -q rollback
$ mv tmp1 .hg/store/data/beta.i
$ echo beta > beta
Test missing filelog entries:
$ cp .hg/store/data/beta.i tmp
$ echo blah >> beta
$ hg ci -m '2 (corrupt)'
$ mv tmp .hg/store/data/beta.i
Expected to fail:
$ hg verify
checking changesets
checking manifests
crosschecking files in changesets and manifests
checking files
beta@1: manifest refers to unknown revision dddc47b3ba30
2 files, 2 changesets, 2 total revisions
1 integrity errors encountered!
(first damaged changeset appears to be 1)
[1]
$ hg push
Matt Harbison
tests: remove (glob) annotations that were only for '\' matches...
r35394 pushing to $TESTTMP/test-validation
Pierre-Yves David
tests: merge 'test-push-validation.t' into 'test-push.t'...
r30280 searching for changes
adding changesets
adding manifests
adding file changes
transaction abort!
rollback completed
abort: missing file data for beta:dddc47b3ba30e54484720ce0f4f768a0f4b6efb9 - run hg verify
[255]
$ cd ..
Pierre-Yves David
tests: merge 'test-push-hook-lock.t' into 'test-push.t'...
r30281
Gregory Szorc
tests: skip filelog damage tests when not using revlogs...
r37362 #endif
Pierre-Yves David
tests: merge 'test-push-hook-lock.t' into 'test-push.t'...
r30281 Test push hook locking
=====================
$ hg init 1
$ echo '[ui]' >> 1/.hg/hgrc
$ echo 'timeout = 10' >> 1/.hg/hgrc
$ echo foo > 1/foo
$ hg --cwd 1 ci -A -m foo
adding foo
$ hg clone 1 2
updating to branch default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg clone 2 3
updating to branch default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ cat <<EOF > $TESTTMP/debuglocks-pretxn-hook.sh
> hg debuglocks
> true
> EOF
$ echo '[hooks]' >> 2/.hg/hgrc
$ echo "pretxnchangegroup.a = sh $TESTTMP/debuglocks-pretxn-hook.sh" >> 2/.hg/hgrc
$ echo 'changegroup.push = hg push -qf ../1' >> 2/.hg/hgrc
$ echo bar >> 3/foo
$ hg --cwd 3 ci -m bar
$ hg --cwd 3 push ../2 --config devel.legacy.exchange=bundle1
pushing to ../2
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
lock: user *, process * (*s) (glob)
wlock: free
$ hg --cwd 1 --config extensions.strip= strip tip -q
$ hg --cwd 2 --config extensions.strip= strip tip -q
$ hg --cwd 3 push ../2 # bundle2+
pushing to ../2
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
lock: user *, process * (*s) (glob)
wlock: user *, process * (*s) (glob)
pushrace: avoid crash on bare push when using concurrent push mode...
r33133 Test bare push with multiple race checking options
--------------------------------------------------
$ hg init test-bare-push-no-concurrency
$ hg init test-bare-push-unrelated-concurrency
$ hg -R test-revflag push -r 0 test-bare-push-no-concurrency --config server.concurrent-push-mode=strict
pushing to test-bare-push-no-concurrency
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
$ hg -R test-revflag push -r 0 test-bare-push-unrelated-concurrency --config server.concurrent-push-mode=check-related
pushing to test-bare-push-unrelated-concurrency
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
Sean Farley
push: add tests for unsafe ssh url (SEC)
r33728
SEC: check for unsafe ssh url
Yuya Nishihara
ssh: unban the use of pipe character in user@host:port string...
r33733 $ cat >> $HGRCPATH << EOF
> [ui]
> ssh = sh -c "read l; read l; read l"
> EOF
Sean Farley
push: add tests for unsafe ssh url (SEC)
r33728 $ hg -R test-revflag push 'ssh://-oProxyCommand=touch${IFS}owned/path'
pushing to ssh://-oProxyCommand%3Dtouch%24%7BIFS%7Downed/path
abort: potentially unsafe url: 'ssh://-oProxyCommand=touch${IFS}owned/path'
[255]
$ hg -R test-revflag push 'ssh://%2DoProxyCommand=touch${IFS}owned/path'
pushing to ssh://-oProxyCommand%3Dtouch%24%7BIFS%7Downed/path
abort: potentially unsafe url: 'ssh://-oProxyCommand=touch${IFS}owned/path'
[255]
Yuya Nishihara
ssh: unban the use of pipe character in user@host:port string...
r33733 $ hg -R test-revflag push 'ssh://fakehost|touch${IFS}owned/path'
pushing to ssh://fakehost%7Ctouch%24%7BIFS%7Downed/path
abort: no suitable response from remote hg!
Sean Farley
push: add tests for unsafe ssh url (SEC)
r33728 [255]
Yuya Nishihara
ssh: unban the use of pipe character in user@host:port string...
r33733 $ hg -R test-revflag push 'ssh://fakehost%7Ctouch%20owned/path'
pushing to ssh://fakehost%7Ctouch%20owned/path
abort: no suitable response from remote hg!
Sean Farley
push: add tests for unsafe ssh url (SEC)
r33728 [255]
Yuya Nishihara
ssh: unban the use of pipe character in user@host:port string...
r33733
$ [ ! -f owned ] || echo 'you got owned'