test-subrepo-svn.t
681 lines
| 17.4 KiB
| text/troff
|
Tads3Lexer
/ tests / test-subrepo-svn.t
|
r22046 | #require svn15 | ||
|
r11916 | |||
|
r17033 | $ SVNREPOPATH=`pwd`/svn-repo | ||
#if windows | ||||
|
r22947 | $ SVNREPOURL=file:///`$PYTHON -c "import urllib, sys; sys.stdout.write(urllib.quote(sys.argv[1]))" "$SVNREPOPATH"` | ||
|
r17033 | #else | ||
|
r22947 | $ SVNREPOURL=file://`$PYTHON -c "import urllib, sys; sys.stdout.write(urllib.quote(sys.argv[1]))" "$SVNREPOPATH"` | ||
|
r17033 | #endif | ||
|
r11916 | |||
|
r26374 | $ filter_svn_output () { | ||
|
r28533 | > egrep -v 'Committing|Transmitting|Updating|(^$)' || true | ||
|
r26374 | > } | ||
|
r11916 | create subversion repo | ||
$ WCROOT="`pwd`/svn-wc" | ||||
$ svnadmin create svn-repo | ||||
|
r17033 | $ svn co "$SVNREPOURL" svn-wc | ||
|
r11916 | Checked out revision 0. | ||
$ cd svn-wc | ||||
$ mkdir src | ||||
$ echo alpha > src/alpha | ||||
$ svn add src | ||||
A src | ||||
|
r17032 | A src/alpha (glob) | ||
|
r11916 | $ mkdir externals | ||
$ echo other > externals/other | ||||
$ svn add externals | ||||
A externals | ||||
|
r17032 | A externals/other (glob) | ||
|
r26374 | $ svn ci -qm 'Add alpha' | ||
|
r15607 | $ svn up -q | ||
|
r17033 | $ echo "externals -r1 $SVNREPOURL/externals" > extdef | ||
|
r11916 | $ svn propset -F extdef svn:externals src | ||
property 'svn:externals' set on 'src' | ||||
|
r26374 | $ svn ci -qm 'Setting externals' | ||
|
r11916 | $ cd .. | ||
create hg repo | ||||
$ mkdir sub | ||||
$ cd sub | ||||
$ hg init t | ||||
$ cd t | ||||
first revision, no sub | ||||
$ echo a > a | ||||
$ hg ci -Am0 | ||||
adding a | ||||
add first svn sub with leading whitespaces | ||||
|
r17033 | $ echo "s = [svn] $SVNREPOURL/src" >> .hgsub | ||
$ echo "subdir/s = [svn] $SVNREPOURL/src" >> .hgsub | ||||
$ svn co --quiet "$SVNREPOURL"/src s | ||||
|
r13015 | $ mkdir subdir | ||
|
r17033 | $ svn co --quiet "$SVNREPOURL"/src subdir/s | ||
|
r11916 | $ hg add .hgsub | ||
$ hg ci -m1 | ||||
|
r12798 | make sure we avoid empty commits (issue2445) | ||
$ hg sum | ||||
parent: 1:* tip (glob) | ||||
1 | ||||
branch: default | ||||
commit: (clean) | ||||
update: (current) | ||||
|
r25382 | phases: 2 draft | ||
|
r12798 | $ hg ci -moops | ||
nothing changed | ||||
[1] | ||||
|
r11916 | debugsub | ||
|
r12366 | $ hg debugsub | ||
|
r11916 | path s | ||
|
r12668 | source file://*/svn-repo/src (glob) | ||
|
r11916 | revision 2 | ||
|
r13015 | path subdir/s | ||
source file://*/svn-repo/src (glob) | ||||
revision 2 | ||||
|
r11916 | |||
change file in svn and hg, commit | ||||
$ echo a >> a | ||||
$ echo alpha >> s/alpha | ||||
|
r12798 | $ hg sum | ||
parent: 1:* tip (glob) | ||||
1 | ||||
branch: default | ||||
commit: 1 modified, 1 subrepos | ||||
update: (current) | ||||
|
r25382 | phases: 2 draft | ||
|
r26374 | $ hg commit --subrepos -m 'Message!' | filter_svn_output | ||
|
r11916 | committing subrepository s | ||
|
r12377 | Sending*s/alpha (glob) | ||
|
r11916 | Committed revision 3. | ||
|
r15607 | Fetching external item into '*s/externals'* (glob) | ||
|
r11916 | External at revision 1. | ||
At revision 3. | ||||
|
r12366 | $ hg debugsub | ||
|
r11916 | path s | ||
|
r12668 | source file://*/svn-repo/src (glob) | ||
|
r11916 | revision 3 | ||
|
r13015 | path subdir/s | ||
source file://*/svn-repo/src (glob) | ||||
revision 2 | ||||
|
r11916 | |||
|
r16529 | missing svn file, commit should fail | ||
$ rm s/alpha | ||||
$ hg commit --subrepos -m 'abort on missing file' | ||||
committing subrepository s | ||||
|
r18109 | abort: cannot commit missing svn entries (in subrepo s) | ||
|
r16529 | [255] | ||
$ svn revert s/alpha > /dev/null | ||||
|
r13287 | add an unrelated revision in svn and update the subrepo to without | ||
bringing any changes. | ||||
|
r26374 | $ svn mkdir "$SVNREPOURL/unrelated" -qm 'create unrelated' | ||
|
r15607 | $ svn up -q s | ||
|
r13287 | $ hg sum | ||
parent: 2:* tip (glob) | ||||
Message! | ||||
branch: default | ||||
commit: (clean) | ||||
update: (current) | ||||
|
r25382 | phases: 3 draft | ||
|
r13287 | |||
|
r11916 | $ echo a > s/a | ||
should be empty despite change to s/a | ||||
$ hg st | ||||
add a commit from svn | ||||
|
r17033 | $ cd "$WCROOT/src" | ||
|
r15607 | $ svn up -q | ||
|
r11916 | $ echo xyz >> alpha | ||
$ svn propset svn:mime-type 'text/xml' alpha | ||||
property 'svn:mime-type' set on 'alpha' | ||||
|
r26374 | $ svn ci -qm 'amend a from svn' | ||
|
r11916 | $ cd ../../sub/t | ||
this commit from hg will fail | ||||
$ echo zzz >> s/alpha | ||||
|
r15607 | $ (hg ci --subrepos -m 'amend alpha from hg' 2>&1; echo "[$?]") | grep -vi 'out of date' | ||
|
r11916 | committing subrepository s | ||
|
r15607 | abort: svn:*Commit failed (details follow): (glob) | ||
|
r12366 | [255] | ||
|
r11916 | $ svn revert -q s/alpha | ||
this commit fails because of meta changes | ||||
$ svn propset svn:mime-type 'text/html' s/alpha | ||||
|
r17032 | property 'svn:mime-type' set on 's/alpha' (glob) | ||
|
r15607 | $ (hg ci --subrepos -m 'amend alpha from hg' 2>&1; echo "[$?]") | grep -vi 'out of date' | ||
|
r11916 | committing subrepository s | ||
|
r15607 | abort: svn:*Commit failed (details follow): (glob) | ||
|
r12366 | [255] | ||
|
r11916 | $ svn revert -q s/alpha | ||
this commit fails because of externals changes | ||||
$ echo zzz > s/externals/other | ||||
|
r15321 | $ hg ci --subrepos -m 'amend externals from hg' | ||
|
r11916 | committing subrepository s | ||
|
r18109 | abort: cannot commit svn externals (in subrepo s) | ||
|
r12316 | [255] | ||
|
r12209 | $ hg diff --subrepos -r 1:2 | grep -v diff | ||
--- a/.hgsubstate Thu Jan 01 00:00:00 1970 +0000 | ||||
+++ b/.hgsubstate Thu Jan 01 00:00:00 1970 +0000 | ||||
|
r13015 | @@ -1,2 +1,2 @@ | ||
|
r12209 | -2 s | ||
+3 s | ||||
|
r13015 | 2 subdir/s | ||
|
r12209 | --- a/a Thu Jan 01 00:00:00 1970 +0000 | ||
+++ b/a Thu Jan 01 00:00:00 1970 +0000 | ||||
@@ -1,1 +1,2 @@ | ||||
a | ||||
+a | ||||
|
r11916 | $ svn revert -q s/externals/other | ||
this commit fails because of externals meta changes | ||||
$ svn propset svn:mime-type 'text/html' s/externals/other | ||||
|
r17032 | property 'svn:mime-type' set on 's/externals/other' (glob) | ||
|
r15321 | $ hg ci --subrepos -m 'amend externals from hg' | ||
|
r11916 | committing subrepository s | ||
|
r18109 | abort: cannot commit svn externals (in subrepo s) | ||
|
r12316 | [255] | ||
|
r11916 | $ svn revert -q s/externals/other | ||
clone | ||||
$ cd .. | ||||
|
r17033 | $ hg clone t tc | ||
|
r11916 | updating to branch default | ||
|
r17033 | A tc/s/alpha (glob) | ||
U tc/s (glob) | ||||
|
r13907 | |||
|
r15607 | Fetching external item into 'tc/s/externals'* (glob) | ||
|
r17033 | A tc/s/externals/other (glob) | ||
|
r13907 | Checked out external at revision 1. | ||
Checked out revision 3. | ||||
|
r17033 | A tc/subdir/s/alpha (glob) | ||
U tc/subdir/s (glob) | ||||
|
r13015 | |||
|
r15607 | Fetching external item into 'tc/subdir/s/externals'* (glob) | ||
|
r17033 | A tc/subdir/s/externals/other (glob) | ||
|
r13015 | Checked out external at revision 1. | ||
Checked out revision 2. | ||||
|
r11916 | 3 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||
$ cd tc | ||||
debugsub in clone | ||||
|
r12366 | $ hg debugsub | ||
|
r11916 | path s | ||
|
r12668 | source file://*/svn-repo/src (glob) | ||
|
r11916 | revision 3 | ||
|
r13015 | path subdir/s | ||
source file://*/svn-repo/src (glob) | ||||
revision 2 | ||||
|
r11916 | |||
verify subrepo is contained within the repo directory | ||||
|
r22947 | $ $PYTHON -c "import os.path; print os.path.exists('s')" | ||
|
r11916 | True | ||
|
r12930 | |||
update to nullrev (must delete the subrepo) | ||||
$ hg up null | ||||
0 files updated, 0 files merged, 3 files removed, 0 files unresolved | ||||
|
r13015 | $ ls | ||
|
r13322 | |||
Check hg update --clean | ||||
|
r17033 | $ cd "$TESTTMP/sub/t" | ||
|
r13322 | $ cd s | ||
$ echo c0 > alpha | ||||
$ echo c1 > f1 | ||||
$ echo c1 > f2 | ||||
$ svn add f1 -q | ||||
|
r15607 | $ svn status | sort | ||
|
r13410 | ? * a (glob) | ||
? * f2 (glob) | ||||
|
r15607 | A * f1 (glob) | ||
|
r13410 | M * alpha (glob) | ||
|
r15607 | Performing status on external item at 'externals'* (glob) | ||
X * externals (glob) | ||||
|
r13332 | $ cd ../.. | ||
$ hg -R t update -C | ||||
|
r13322 | |||
|
r15607 | Fetching external item into 't/s/externals'* (glob) | ||
|
r13322 | Checked out external at revision 1. | ||
Checked out revision 3. | ||||
1 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||||
|
r13332 | $ cd t/s | ||
|
r16526 | $ svn status | sort | ||
|
r13410 | ? * a (glob) | ||
? * f1 (glob) | ||||
? * f2 (glob) | ||||
|
r15607 | Performing status on external item at 'externals'* (glob) | ||
|
r16526 | X * externals (glob) | ||
|
r13417 | |||
Sticky subrepositories, no changes | ||||
|
r17033 | $ cd "$TESTTMP/sub/t" | ||
|
r13417 | $ hg id -n | ||
2 | ||||
$ cd s | ||||
$ svnversion | ||||
3 | ||||
$ cd .. | ||||
$ hg update 1 | ||||
|
r15607 | U *s/alpha (glob) | ||
|
r13417 | |||
|
r15607 | Fetching external item into '*s/externals'* (glob) | ||
|
r13417 | Checked out external at revision 1. | ||
Checked out revision 2. | ||||
2 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||||
$ hg id -n | ||||
1 | ||||
$ cd s | ||||
$ svnversion | ||||
2 | ||||
$ cd .. | ||||
|
r21024 | Sticky subrepositories, file changes | ||
|
r13417 | $ touch s/f1 | ||
$ cd s | ||||
$ svn add f1 | ||||
A f1 | ||||
$ cd .. | ||||
$ hg id -n | ||||
|
r17255 | 1+ | ||
|
r13417 | $ cd s | ||
$ svnversion | ||||
2M | ||||
$ cd .. | ||||
$ hg update tip | ||||
|
r19811 | subrepository s diverged (local revision: 2, remote revision: 3) | ||
|
r30060 | (M)erge, keep (l)ocal [working copy] or keep (r)emote [destination]? m | ||
|
r13417 | subrepository sources for s differ | ||
|
r22590 | use (l)ocal source (2) or (r)emote source (3)? l | ||
|
r13417 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||
$ hg id -n | ||||
2+ | ||||
$ cd s | ||||
$ svnversion | ||||
2M | ||||
$ cd .. | ||||
$ hg update --clean tip | ||||
|
r15607 | U *s/alpha (glob) | ||
|
r13417 | |||
|
r15607 | Fetching external item into '*s/externals'* (glob) | ||
|
r13417 | Checked out external at revision 1. | ||
Checked out revision 3. | ||||
1 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||||
Sticky subrepository, revision updates | ||||
$ hg id -n | ||||
2 | ||||
$ cd s | ||||
$ svnversion | ||||
3 | ||||
$ cd .. | ||||
$ cd s | ||||
|
r15607 | $ svn update -qr 1 | ||
|
r13417 | $ cd .. | ||
$ hg update 1 | ||||
|
r19811 | subrepository s diverged (local revision: 3, remote revision: 2) | ||
|
r30060 | (M)erge, keep (l)ocal [working copy] or keep (r)emote [destination]? m | ||
|
r13417 | subrepository sources for s differ (in checked out version) | ||
|
r22590 | use (l)ocal source (1) or (r)emote source (2)? l | ||
|
r13417 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||
$ hg id -n | ||||
1+ | ||||
$ cd s | ||||
$ svnversion | ||||
1 | ||||
$ cd .. | ||||
Sticky subrepository, file changes and revision updates | ||||
$ touch s/f1 | ||||
$ cd s | ||||
$ svn add f1 | ||||
A f1 | ||||
$ svnversion | ||||
1M | ||||
$ cd .. | ||||
$ hg id -n | ||||
1+ | ||||
$ hg update tip | ||||
|
r19811 | subrepository s diverged (local revision: 3, remote revision: 3) | ||
|
r30060 | (M)erge, keep (l)ocal [working copy] or keep (r)emote [destination]? m | ||
|
r13417 | subrepository sources for s differ | ||
|
r22590 | use (l)ocal source (1) or (r)emote source (3)? l | ||
|
r13417 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||
$ hg id -n | ||||
|
r17255 | 2+ | ||
|
r13417 | $ cd s | ||
$ svnversion | ||||
1M | ||||
$ cd .. | ||||
Sticky repository, update --clean | ||||
|
r17032 | $ hg update --clean tip | grep -v 's[/\]externals[/\]other' | ||
|
r15607 | U *s/alpha (glob) | ||
U *s (glob) | ||||
|
r13417 | |||
|
r15607 | Fetching external item into '*s/externals'* (glob) | ||
|
r13417 | Checked out external at revision 1. | ||
Checked out revision 3. | ||||
1 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||||
$ hg id -n | ||||
2 | ||||
$ cd s | ||||
$ svnversion | ||||
3 | ||||
$ cd .. | ||||
Test subrepo already at intended revision: | ||||
$ cd s | ||||
|
r15607 | $ svn update -qr 2 | ||
|
r13417 | $ cd .. | ||
$ hg update 1 | ||||
|
r19811 | subrepository s diverged (local revision: 3, remote revision: 2) | ||
|
r30060 | (M)erge, keep (l)ocal [working copy] or keep (r)emote [destination]? m | ||
|
r13417 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||
$ hg id -n | ||||
1+ | ||||
$ cd s | ||||
$ svnversion | ||||
2 | ||||
$ cd .. | ||||
|
r14050 | |||
Test case where subversion would fail to update the subrepo because there | ||||
are unknown directories being replaced by tracked ones (happens with rebase). | ||||
|
r17033 | $ cd "$WCROOT/src" | ||
|
r14050 | $ mkdir dir | ||
$ echo epsilon.py > dir/epsilon.py | ||||
$ svn add dir | ||||
A dir | ||||
|
r17032 | A dir/epsilon.py (glob) | ||
|
r26374 | $ svn ci -qm 'Add dir/epsilon.py' | ||
|
r14050 | $ cd ../.. | ||
$ hg init rebaserepo | ||||
$ cd rebaserepo | ||||
|
r17033 | $ svn co -r5 --quiet "$SVNREPOURL"/src s | ||
$ echo "s = [svn] $SVNREPOURL/src" >> .hgsub | ||||
|
r14050 | $ hg add .hgsub | ||
$ hg ci -m addsub | ||||
$ echo a > a | ||||
|
r23963 | $ hg add . | ||
|
r14050 | adding a | ||
|
r23963 | $ hg ci -m adda | ||
|
r14050 | $ hg up 0 | ||
0 files updated, 0 files merged, 1 files removed, 0 files unresolved | ||||
|
r15607 | $ svn up -qr6 s | ||
|
r14050 | $ hg ci -m updatesub | ||
created new head | ||||
$ echo pyc > s/dir/epsilon.pyc | ||||
$ hg up 1 | ||||
|
r15607 | D *s/dir (glob) | ||
|
r14050 | |||
|
r15607 | Fetching external item into '*s/externals'* (glob) | ||
|
r14050 | Checked out external at revision 1. | ||
Checked out revision 5. | ||||
2 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||||
|
r16898 | $ hg up -q 2 | ||
|
r14664 | |||
Modify one of the externals to point to a different path so we can | ||||
test having obstructions when switching branches on checkout: | ||||
$ hg checkout tip | ||||
0 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||||
|
r17033 | $ echo "obstruct = [svn] $SVNREPOURL/externals" >> .hgsub | ||
$ svn co -r5 --quiet "$SVNREPOURL"/externals obstruct | ||||
|
r15372 | $ hg commit -m 'Start making obstructed working copy' | ||
|
r14664 | $ hg book other | ||
$ hg co -r 'p1(tip)' | ||||
2 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||||
|
r21404 | (leaving bookmark other) | ||
|
r17033 | $ echo "obstruct = [svn] $SVNREPOURL/src" >> .hgsub | ||
$ svn co -r5 --quiet "$SVNREPOURL"/src obstruct | ||||
|
r14664 | $ hg commit -m 'Other branch which will be obstructed' | ||
created new head | ||||
Switching back to the head where we have another path mapped to the | ||||
same subrepo should work if the subrepo is clean. | ||||
$ hg co other | ||||
|
r15607 | A *obstruct/other (glob) | ||
|
r14664 | Checked out revision 1. | ||
2 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||||
|
r21503 | (activating bookmark other) | ||
|
r14664 | |||
This is surprising, but is also correct based on the current code: | ||||
$ echo "updating should (maybe) fail" > obstruct/other | ||||
$ hg co tip | ||||
|
r19799 | abort: uncommitted changes | ||
(commit or update --clean to discard changes) | ||||
|
r14664 | [255] | ||
|
r14820 | |||
Point to a Subversion branch which has since been deleted and recreated | ||||
First, create that condition in the repository. | ||||
|
r26374 | $ hg ci --subrepos -m cleanup | filter_svn_output | ||
|
r14820 | committing subrepository obstruct | ||
|
r17032 | Sending obstruct/other (glob) | ||
|
r14820 | Committed revision 7. | ||
At revision 7. | ||||
|
r26374 | $ svn mkdir -qm "baseline" $SVNREPOURL/trunk | ||
$ svn copy -qm "initial branch" $SVNREPOURL/trunk $SVNREPOURL/branch | ||||
|
r17033 | $ svn co --quiet "$SVNREPOURL"/branch tempwc | ||
|
r14820 | $ cd tempwc | ||
$ echo "something old" > somethingold | ||||
$ svn add somethingold | ||||
A somethingold | ||||
|
r26374 | $ svn ci -qm 'Something old' | ||
$ svn rm -qm "remove branch" $SVNREPOURL/branch | ||||
$ svn copy -qm "recreate branch" $SVNREPOURL/trunk $SVNREPOURL/branch | ||||
|
r15607 | $ svn up -q | ||
|
r14820 | $ echo "something new" > somethingnew | ||
$ svn add somethingnew | ||||
A somethingnew | ||||
|
r26374 | $ svn ci -qm 'Something new' | ||
|
r14820 | $ cd .. | ||
$ rm -rf tempwc | ||||
|
r17033 | $ svn co "$SVNREPOURL/branch"@10 recreated | ||
|
r17032 | A recreated/somethingold (glob) | ||
|
r14820 | Checked out revision 10. | ||
|
r17033 | $ echo "recreated = [svn] $SVNREPOURL/branch" >> .hgsub | ||
|
r14820 | $ hg ci -m addsub | ||
$ cd recreated | ||||
|
r15607 | $ svn up -q | ||
|
r14820 | $ cd .. | ||
$ hg ci -m updatesub | ||||
$ hg up -r-2 | ||||
|
r15607 | D *recreated/somethingnew (glob) | ||
A *recreated/somethingold (glob) | ||||
|
r14820 | Checked out revision 10. | ||
1 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||||
|
r21404 | (leaving bookmark other) | ||
|
r15282 | $ test -f recreated/somethingold | ||
|
r14820 | |||
|
r16450 | Test archive | ||
|
r25125 | $ hg archive -S ../archive-all --debug --config progress.debug=true | ||
|
r16450 | archiving: 0/2 files (0.00%) | ||
archiving: .hgsub 1/2 files (50.00%) | ||||
archiving: .hgsubstate 2/2 files (100.00%) | ||||
archiving (obstruct): 0/1 files (0.00%) | ||||
archiving (obstruct): 1/1 files (100.00%) | ||||
|
r18364 | archiving (recreated): 0/1 files (0.00%) | ||
archiving (recreated): 1/1 files (100.00%) | ||||
|
r16450 | archiving (s): 0/2 files (0.00%) | ||
archiving (s): 1/2 files (50.00%) | ||||
archiving (s): 2/2 files (100.00%) | ||||
|
r16527 | |||
|
r25125 | $ hg archive -S ../archive-exclude --debug --config progress.debug=true -X **old | ||
|
r17108 | archiving: 0/2 files (0.00%) | ||
archiving: .hgsub 1/2 files (50.00%) | ||||
archiving: .hgsubstate 2/2 files (100.00%) | ||||
archiving (obstruct): 0/1 files (0.00%) | ||||
archiving (obstruct): 1/1 files (100.00%) | ||||
|
r18364 | archiving (recreated): 0 files | ||
|
r17108 | archiving (s): 0/2 files (0.00%) | ||
archiving (s): 1/2 files (50.00%) | ||||
archiving (s): 2/2 files (100.00%) | ||||
$ find ../archive-exclude | sort | ||||
../archive-exclude | ||||
../archive-exclude/.hg_archival.txt | ||||
../archive-exclude/.hgsub | ||||
../archive-exclude/.hgsubstate | ||||
../archive-exclude/obstruct | ||||
../archive-exclude/obstruct/other | ||||
../archive-exclude/s | ||||
../archive-exclude/s/alpha | ||||
../archive-exclude/s/dir | ||||
../archive-exclude/s/dir/epsilon.py | ||||
|
r16527 | Test forgetting files, not implemented in svn subrepo, used to | ||
traceback | ||||
|
r17032 | #if no-windows | ||
|
r16527 | $ hg forget 'notafile*' | ||
notafile*: No such file or directory | ||||
[1] | ||||
|
r17032 | #else | ||
$ hg forget 'notafile' | ||||
notafile: * (glob) | ||||
[1] | ||||
#endif | ||||
|
r16554 | |||
Test a subrepo referencing a just moved svn path. Last commit rev will | ||||
be different from the revision, and the path will be different as | ||||
well. | ||||
|
r17033 | $ cd "$WCROOT" | ||
|
r16554 | $ svn up > /dev/null | ||
$ mkdir trunk/subdir branches | ||||
$ echo a > trunk/subdir/a | ||||
$ svn add trunk/subdir branches | ||||
|
r17032 | A trunk/subdir (glob) | ||
A trunk/subdir/a (glob) | ||||
|
r16554 | A branches | ||
|
r26374 | $ svn ci -qm addsubdir | ||
$ svn cp -qm branchtrunk $SVNREPOURL/trunk $SVNREPOURL/branches/somebranch | ||||
|
r16554 | $ cd .. | ||
$ hg init repo2 | ||||
$ cd repo2 | ||||
|
r17033 | $ svn co $SVNREPOURL/branches/somebranch/subdir | ||
|
r17032 | A subdir/a (glob) | ||
|
r16554 | Checked out revision 15. | ||
|
r17033 | $ echo "subdir = [svn] $SVNREPOURL/branches/somebranch/subdir" > .hgsub | ||
|
r16554 | $ hg add .hgsub | ||
$ hg ci -m addsub | ||||
$ hg up null | ||||
0 files updated, 0 files merged, 2 files removed, 0 files unresolved | ||||
$ hg up | ||||
A *subdir/a (glob) | ||||
Checked out revision 15. | ||||
2 files updated, 0 files merged, 0 files removed, 0 files unresolved | ||||
$ cd .. | ||||
|
r21564 | |||
Test sanitizing ".hg/hgrc" in subrepo | ||||
$ cd sub/t | ||||
$ hg update -q -C tip | ||||
$ cd s | ||||
$ mkdir .hg | ||||
$ echo '.hg/hgrc in svn repo' > .hg/hgrc | ||||
$ mkdir -p sub/.hg | ||||
$ echo 'sub/.hg/hgrc in svn repo' > sub/.hg/hgrc | ||||
$ svn add .hg sub | ||||
A .hg | ||||
A .hg/hgrc (glob) | ||||
A sub | ||||
A sub/.hg (glob) | ||||
A sub/.hg/hgrc (glob) | ||||
|
r26374 | $ svn ci -qm 'add .hg/hgrc to be sanitized at hg update' | ||
|
r21564 | $ svn up -q | ||
$ cd .. | ||||
$ hg commit -S -m 'commit with svn revision including .hg/hgrc' | ||||
$ grep ' s$' .hgsubstate | ||||
16 s | ||||
$ cd .. | ||||
|
r21566 | $ hg -R tc pull -u -q 2>&1 | sort | ||
warning: removing potentially hostile 'hgrc' in '$TESTTMP/sub/tc/s/.hg' (glob) | ||||
warning: removing potentially hostile 'hgrc' in '$TESTTMP/sub/tc/s/sub/.hg' (glob) | ||||
|
r21564 | $ cd tc | ||
$ grep ' s$' .hgsubstate | ||||
16 s | ||||
|
r21930 | $ test -f s/.hg/hgrc | ||
|
r21564 | [1] | ||
|
r21930 | $ test -f s/sub/.hg/hgrc | ||
|
r21564 | [1] | ||
|
r21567 | Test that sanitizing is omitted in meta data area: | ||
$ mkdir s/.svn/.hg | ||||
$ echo '.hg/hgrc in svn metadata area' > s/.svn/.hg/hgrc | ||||
$ hg update -q -C '.^1' | ||||
|
r21564 | $ cd ../.. | ||
|
r33713 | |||
SEC: test for ssh exploit | ||||
$ hg init ssh-vuln | ||||
$ cd ssh-vuln | ||||
$ echo "s = [svn]$SVNREPOURL/src" >> .hgsub | ||||
$ svn co --quiet "$SVNREPOURL"/src s | ||||
$ hg add .hgsub | ||||
$ hg ci -m1 | ||||
$ echo "s = [svn]svn+ssh://-oProxyCommand=touch%20owned%20nested" > .hgsub | ||||
$ hg ci -m2 | ||||
$ cd .. | ||||
$ hg clone ssh-vuln ssh-vuln-clone | ||||
updating to branch default | ||||
abort: potentially unsafe url: 'svn+ssh://-oProxyCommand=touch owned nested' (in subrepo s) | ||||
[255] | ||||
also check that a percent encoded '-' (%2D) doesn't work | ||||
$ cd ssh-vuln | ||||
$ echo "s = [svn]svn+ssh://%2DoProxyCommand=touch%20owned%20nested" > .hgsub | ||||
$ hg ci -m3 | ||||
$ cd .. | ||||
$ rm -r ssh-vuln-clone | ||||
$ hg clone ssh-vuln ssh-vuln-clone | ||||
updating to branch default | ||||
abort: potentially unsafe url: 'svn+ssh://-oProxyCommand=touch owned nested' (in subrepo s) | ||||
[255] | ||||
also check that hiding the attack in the username doesn't work: | ||||
$ cd ssh-vuln | ||||
$ echo "s = [svn]svn+ssh://%2DoProxyCommand=touch%20owned%20foo@example.com/nested" > .hgsub | ||||
$ hg ci -m3 | ||||
$ cd .. | ||||
$ rm -r ssh-vuln-clone | ||||
$ hg clone ssh-vuln ssh-vuln-clone | ||||
updating to branch default | ||||
abort: potentially unsafe url: 'svn+ssh://-oProxyCommand=touch owned foo@example.com/nested' (in subrepo s) | ||||
[255] | ||||