diff options
Diffstat (limited to 'tests/test-subrepo-svn.t')
-rw-r--r-- | tests/test-subrepo-svn.t | 625 |
1 files changed, 625 insertions, 0 deletions
diff --git a/tests/test-subrepo-svn.t b/tests/test-subrepo-svn.t new file mode 100644 index 0000000..ba9611d --- /dev/null +++ b/tests/test-subrepo-svn.t @@ -0,0 +1,625 @@ + $ "$TESTDIR/hghave" svn15 || exit 80 + + $ SVNREPOPATH=`pwd`/svn-repo +#if windows + $ SVNREPOURL=file:///`python -c "import urllib, sys; sys.stdout.write(urllib.quote(sys.argv[1]))" "$SVNREPOPATH"` +#else + $ SVNREPOURL=file://`python -c "import urllib, sys; sys.stdout.write(urllib.quote(sys.argv[1]))" "$SVNREPOPATH"` +#endif + +create subversion repo + + $ WCROOT="`pwd`/svn-wc" + $ svnadmin create svn-repo + $ svn co "$SVNREPOURL" svn-wc + Checked out revision 0. + $ cd svn-wc + $ mkdir src + $ echo alpha > src/alpha + $ svn add src + A src + A src/alpha (glob) + $ mkdir externals + $ echo other > externals/other + $ svn add externals + A externals + A externals/other (glob) + $ svn ci -m 'Add alpha' + Adding externals + Adding externals/other (glob) + Adding src + Adding src/alpha (glob) + Transmitting file data .. + Committed revision 1. + $ svn up -q + $ echo "externals -r1 $SVNREPOURL/externals" > extdef + $ svn propset -F extdef svn:externals src + property 'svn:externals' set on 'src' + $ svn ci -m 'Setting externals' + Sending src + + Committed revision 2. + $ 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 + + $ echo "s = [svn] $SVNREPOURL/src" >> .hgsub + $ echo "subdir/s = [svn] $SVNREPOURL/src" >> .hgsub + $ svn co --quiet "$SVNREPOURL"/src s + $ mkdir subdir + $ svn co --quiet "$SVNREPOURL"/src subdir/s + $ hg add .hgsub + $ hg ci -m1 + +make sure we avoid empty commits (issue2445) + + $ hg sum + parent: 1:* tip (glob) + 1 + branch: default + commit: (clean) + update: (current) + $ hg ci -moops + nothing changed + [1] + +debugsub + + $ hg debugsub + path s + source file://*/svn-repo/src (glob) + revision 2 + path subdir/s + source file://*/svn-repo/src (glob) + revision 2 + +change file in svn and hg, commit + + $ echo a >> a + $ echo alpha >> s/alpha + $ hg sum + parent: 1:* tip (glob) + 1 + branch: default + commit: 1 modified, 1 subrepos + update: (current) + $ hg commit --subrepos -m 'Message!' | grep -v Updating + committing subrepository s + Sending*s/alpha (glob) + Transmitting file data . + Committed revision 3. + + Fetching external item into '*s/externals'* (glob) + External at revision 1. + + At revision 3. + $ hg debugsub + path s + source file://*/svn-repo/src (glob) + revision 3 + path subdir/s + source file://*/svn-repo/src (glob) + revision 2 + +missing svn file, commit should fail + + $ rm s/alpha + $ hg commit --subrepos -m 'abort on missing file' + committing subrepository s + abort: cannot commit missing svn entries + [255] + $ svn revert s/alpha > /dev/null + +add an unrelated revision in svn and update the subrepo to without +bringing any changes. + + $ svn mkdir "$SVNREPOURL/unrelated" -m 'create unrelated' + + Committed revision 4. + $ svn up -q s + $ hg sum + parent: 2:* tip (glob) + Message! + branch: default + commit: (clean) + update: (current) + + $ echo a > s/a + +should be empty despite change to s/a + + $ hg st + +add a commit from svn + + $ cd "$WCROOT/src" + $ svn up -q + $ echo xyz >> alpha + $ svn propset svn:mime-type 'text/xml' alpha + property 'svn:mime-type' set on 'alpha' + $ svn ci -m 'amend a from svn' + Sending *alpha (glob) + Transmitting file data . + Committed revision 5. + $ cd ../../sub/t + +this commit from hg will fail + + $ echo zzz >> s/alpha + $ (hg ci --subrepos -m 'amend alpha from hg' 2>&1; echo "[$?]") | grep -vi 'out of date' + committing subrepository s + abort: svn:*Commit failed (details follow): (glob) + [255] + $ svn revert -q s/alpha + +this commit fails because of meta changes + + $ svn propset svn:mime-type 'text/html' s/alpha + property 'svn:mime-type' set on 's/alpha' (glob) + $ (hg ci --subrepos -m 'amend alpha from hg' 2>&1; echo "[$?]") | grep -vi 'out of date' + committing subrepository s + abort: svn:*Commit failed (details follow): (glob) + [255] + $ svn revert -q s/alpha + +this commit fails because of externals changes + + $ echo zzz > s/externals/other + $ hg ci --subrepos -m 'amend externals from hg' + committing subrepository s + abort: cannot commit svn externals + [255] + $ 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 + @@ -1,2 +1,2 @@ + -2 s + +3 s + 2 subdir/s + --- 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 + $ svn revert -q s/externals/other + +this commit fails because of externals meta changes + + $ svn propset svn:mime-type 'text/html' s/externals/other + property 'svn:mime-type' set on 's/externals/other' (glob) + $ hg ci --subrepos -m 'amend externals from hg' + committing subrepository s + abort: cannot commit svn externals + [255] + $ svn revert -q s/externals/other + +clone + + $ cd .. + $ hg clone t tc + updating to branch default + A tc/s/alpha (glob) + U tc/s (glob) + + Fetching external item into 'tc/s/externals'* (glob) + A tc/s/externals/other (glob) + Checked out external at revision 1. + + Checked out revision 3. + A tc/subdir/s/alpha (glob) + U tc/subdir/s (glob) + + Fetching external item into 'tc/subdir/s/externals'* (glob) + A tc/subdir/s/externals/other (glob) + Checked out external at revision 1. + + Checked out revision 2. + 3 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ cd tc + +debugsub in clone + + $ hg debugsub + path s + source file://*/svn-repo/src (glob) + revision 3 + path subdir/s + source file://*/svn-repo/src (glob) + revision 2 + +verify subrepo is contained within the repo directory + + $ python -c "import os.path; print os.path.exists('s')" + True + +update to nullrev (must delete the subrepo) + + $ hg up null + 0 files updated, 0 files merged, 3 files removed, 0 files unresolved + $ ls + +Check hg update --clean + $ cd "$TESTTMP/sub/t" + $ cd s + $ echo c0 > alpha + $ echo c1 > f1 + $ echo c1 > f2 + $ svn add f1 -q + $ svn status | sort + + ? * a (glob) + ? * f2 (glob) + A * f1 (glob) + M * alpha (glob) + Performing status on external item at 'externals'* (glob) + X * externals (glob) + $ cd ../.. + $ hg -R t update -C + + Fetching external item into 't/s/externals'* (glob) + Checked out external at revision 1. + + Checked out revision 3. + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ cd t/s + $ svn status | sort + + ? * a (glob) + ? * f1 (glob) + ? * f2 (glob) + Performing status on external item at 'externals'* (glob) + X * externals (glob) + +Sticky subrepositories, no changes + $ cd "$TESTTMP/sub/t" + $ hg id -n + 2 + $ cd s + $ svnversion + 3 + $ cd .. + $ hg update 1 + U *s/alpha (glob) + + Fetching external item into '*s/externals'* (glob) + 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 .. + +Sticky subrepositorys, file changes + $ touch s/f1 + $ cd s + $ svn add f1 + A f1 + $ cd .. + $ hg id -n + 1+ + $ cd s + $ svnversion + 2M + $ cd .. + $ hg update tip + subrepository sources for s differ + use (l)ocal source (2) or (r)emote source (3)? + l + 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 + U *s/alpha (glob) + + Fetching external item into '*s/externals'* (glob) + 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 + $ svn update -qr 1 + $ cd .. + $ hg update 1 + subrepository sources for s differ (in checked out version) + use (l)ocal source (1) or (r)emote source (2)? + l + 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 + subrepository sources for s differ + use (l)ocal source (1) or (r)emote source (3)? + l + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg id -n + 2+ + $ cd s + $ svnversion + 1M + $ cd .. + +Sticky repository, update --clean + $ hg update --clean tip | grep -v 's[/\]externals[/\]other' + U *s/alpha (glob) + U *s (glob) + + Fetching external item into '*s/externals'* (glob) + 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 + $ svn update -qr 2 + $ cd .. + $ hg update 1 + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg id -n + 1+ + $ cd s + $ svnversion + 2 + $ cd .. + +Test case where subversion would fail to update the subrepo because there +are unknown directories being replaced by tracked ones (happens with rebase). + + $ cd "$WCROOT/src" + $ mkdir dir + $ echo epsilon.py > dir/epsilon.py + $ svn add dir + A dir + A dir/epsilon.py (glob) + $ svn ci -m 'Add dir/epsilon.py' + Adding *dir (glob) + Adding *dir/epsilon.py (glob) + Transmitting file data . + Committed revision 6. + $ cd ../.. + $ hg init rebaserepo + $ cd rebaserepo + $ svn co -r5 --quiet "$SVNREPOURL"/src s + $ echo "s = [svn] $SVNREPOURL/src" >> .hgsub + $ hg add .hgsub + $ hg ci -m addsub + $ echo a > a + $ hg ci -Am adda + adding a + $ hg up 0 + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ svn up -qr6 s + $ hg ci -m updatesub + created new head + $ echo pyc > s/dir/epsilon.pyc + $ hg up 1 + D *s/dir (glob) + + Fetching external item into '*s/externals'* (glob) + Checked out external at revision 1. + + Checked out revision 5. + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg up -q 2 + +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 + $ echo "obstruct = [svn] $SVNREPOURL/externals" >> .hgsub + $ svn co -r5 --quiet "$SVNREPOURL"/externals obstruct + $ hg commit -m 'Start making obstructed working copy' + $ hg book other + $ hg co -r 'p1(tip)' + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ echo "obstruct = [svn] $SVNREPOURL/src" >> .hgsub + $ svn co -r5 --quiet "$SVNREPOURL"/src obstruct + $ 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 + A *obstruct/other (glob) + Checked out revision 1. + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + +This is surprising, but is also correct based on the current code: + $ echo "updating should (maybe) fail" > obstruct/other + $ hg co tip + abort: crosses branches (merge branches or use --clean to discard changes) + [255] + +Point to a Subversion branch which has since been deleted and recreated +First, create that condition in the repository. + + $ hg ci --subrepos -m cleanup | grep -v Updating + committing subrepository obstruct + Sending obstruct/other (glob) + Transmitting file data . + Committed revision 7. + At revision 7. + $ svn mkdir -m "baseline" $SVNREPOURL/trunk + + Committed revision 8. + $ svn copy -m "initial branch" $SVNREPOURL/trunk $SVNREPOURL/branch + + Committed revision 9. + $ svn co --quiet "$SVNREPOURL"/branch tempwc + $ cd tempwc + $ echo "something old" > somethingold + $ svn add somethingold + A somethingold + $ svn ci -m 'Something old' + Adding somethingold + Transmitting file data . + Committed revision 10. + $ svn rm -m "remove branch" $SVNREPOURL/branch + + Committed revision 11. + $ svn copy -m "recreate branch" $SVNREPOURL/trunk $SVNREPOURL/branch + + Committed revision 12. + $ svn up -q + $ echo "something new" > somethingnew + $ svn add somethingnew + A somethingnew + $ svn ci -m 'Something new' + Adding somethingnew + Transmitting file data . + Committed revision 13. + $ cd .. + $ rm -rf tempwc + $ svn co "$SVNREPOURL/branch"@10 recreated + A recreated/somethingold (glob) + Checked out revision 10. + $ echo "recreated = [svn] $SVNREPOURL/branch" >> .hgsub + $ hg ci -m addsub + $ cd recreated + $ svn up -q + $ cd .. + $ hg ci -m updatesub + $ hg up -r-2 + D *recreated/somethingnew (glob) + A *recreated/somethingold (glob) + Checked out revision 10. + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ test -f recreated/somethingold + +Test archive + + $ hg archive -S ../archive-all --debug + 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%) + archiving (s): 0/2 files (0.00%) + archiving (s): 1/2 files (50.00%) + archiving (s): 2/2 files (100.00%) + archiving (recreated): 0/1 files (0.00%) + archiving (recreated): 1/1 files (100.00%) + + $ hg archive -S ../archive-exclude --debug -X **old + 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%) + archiving (s): 0/2 files (0.00%) + archiving (s): 1/2 files (50.00%) + archiving (s): 2/2 files (100.00%) + archiving (recreated): 0 files + $ 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 + +Test forgetting files, not implemented in svn subrepo, used to +traceback + +#if no-windows + $ hg forget 'notafile*' + notafile*: No such file or directory + [1] +#else + $ hg forget 'notafile' + notafile: * (glob) + [1] +#endif + +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. + + $ cd "$WCROOT" + $ svn up > /dev/null + $ mkdir trunk/subdir branches + $ echo a > trunk/subdir/a + $ svn add trunk/subdir branches + A trunk/subdir (glob) + A trunk/subdir/a (glob) + A branches + $ svn ci -m addsubdir + Adding branches + Adding trunk/subdir (glob) + Adding trunk/subdir/a (glob) + Transmitting file data . + Committed revision 14. + $ svn cp -m branchtrunk $SVNREPOURL/trunk $SVNREPOURL/branches/somebranch + + Committed revision 15. + $ cd .. + + $ hg init repo2 + $ cd repo2 + $ svn co $SVNREPOURL/branches/somebranch/subdir + A subdir/a (glob) + Checked out revision 15. + $ echo "subdir = [svn] $SVNREPOURL/branches/somebranch/subdir" > .hgsub + $ 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 .. |