Mercurial > hg
view tests/test-import @ 11109:a2bc2f2d77a9
subrepo: normalize path part of URLs so that pulling subrepos from webdir works
For a "all projects at root" repo layout eg:
/main
/sub
Where subrepos are used such that a clone of main has this layout:
./main/
./main/.hgsub
./main/sub/
And the .hgsub content is:
sub = ../sub
This allows a pull from a hgweb where main and sub are exposed
at the root (or same directory level)
The current code doesn't normalize the path component of a pull
url. this results in trying to pull from
http://server.com/hg/main/../sub
Current hgweb implementation doesn't reduce the path component
so this results in a 404 error though everything is setup logically.
This patch adresses this 404 error on the puller side
normalizing the URLs used for pulling sub repos. For this
example, the URL would be reduced to http://server.com/hg/sub
Fix + test
author | Edouard Gomez <ed.gomez@free.fr> |
---|---|
date | Sat, 01 May 2010 23:05:19 +0200 |
parents | 196908117c27 |
children | f5be44090ba8 |
line wrap: on
line source
#!/bin/sh hg init a mkdir a/d1 mkdir a/d1/d2 echo line 1 > a/a echo line 1 > a/d1/d2/a hg --cwd a ci -Ama echo line 2 >> a/a hg --cwd a ci -u someone -d '1 0' -m'second change' echo % import exported patch hg clone -r0 a b hg --cwd a export tip > tip.patch hg --cwd b import ../tip.patch echo % message should be same hg --cwd b tip | grep 'second change' echo % committer should be same hg --cwd b tip | grep someone rm -r b echo % import exported patch with external patcher cat > dummypatch.py <<EOF print 'patching file a' file('a', 'wb').write('line2\n') EOF chmod +x dummypatch.py hg clone -r0 a b hg --cwd a export tip > tip.patch hg --config ui.patch='python ../dummypatch.py' --cwd b import ../tip.patch cat b/a rm -r b echo % import of plain diff should fail without message hg clone -r0 a b hg --cwd a diff -r0:1 > tip.patch hg --cwd b import ../tip.patch rm -r b echo % import of plain diff should be ok with message hg clone -r0 a b hg --cwd a diff -r0:1 > tip.patch hg --cwd b import -mpatch ../tip.patch rm -r b echo % import of plain diff with specific date and user hg clone -r0 a b hg --cwd a diff -r0:1 > tip.patch hg --cwd b import -mpatch -d '1 0' -u 'user@nowhere.net' ../tip.patch hg -R b tip -pv rm -r b echo % import of plain diff should be ok with --no-commit hg clone -r0 a b hg --cwd a diff -r0:1 > tip.patch hg --cwd b import --no-commit ../tip.patch hg --cwd b diff --nodates rm -r b echo % hg -R repo import # put the clone in a subdir - having a directory named "a" # used to hide a bug. mkdir dir hg clone -r0 a dir/b hg --cwd a export tip > dir/tip.patch cd dir hg -R b import tip.patch cd .. rm -r dir echo % import from stdin hg clone -r0 a b hg --cwd a export tip | hg --cwd b import - rm -r b echo % import two patches in one stream hg init b hg --cwd a export 0:tip | hg --cwd b import - hg --cwd a id hg --cwd b id rm -r b echo % override commit message hg clone -r0 a b hg --cwd a export tip | hg --cwd b import -m 'override' - hg --cwd b tip | grep override rm -r b cat > mkmsg.py <<EOF import email.Message, sys msg = email.Message.Message() msg.set_payload('email commit message\n' + open('tip.patch', 'rb').read()) msg['Subject'] = 'email patch' msg['From'] = 'email patcher' sys.stdout.write(msg.as_string()) EOF echo % plain diff in email, subject, message body hg clone -r0 a b hg --cwd a diff -r0:1 > tip.patch python mkmsg.py > msg.patch hg --cwd b import ../msg.patch hg --cwd b tip | grep email rm -r b echo % plain diff in email, no subject, message body hg clone -r0 a b grep -v '^Subject:' msg.patch | hg --cwd b import - rm -r b echo % plain diff in email, subject, no message body hg clone -r0 a b grep -v '^email ' msg.patch | hg --cwd b import - rm -r b echo % plain diff in email, no subject, no message body, should fail hg clone -r0 a b egrep -v '^(Subject|email)' msg.patch | hg --cwd b import - rm -r b echo % hg export in email, should use patch header hg clone -r0 a b hg --cwd a export tip > tip.patch python mkmsg.py | hg --cwd b import - hg --cwd b tip | grep second rm -r b # subject: duplicate detection, removal of [PATCH] # The '---' tests the gitsendmail handling without proper mail headers cat > mkmsg2.py <<EOF import email.Message, sys msg = email.Message.Message() msg.set_payload('email patch\n\nnext line\n---\n' + open('tip.patch').read()) msg['Subject'] = '[PATCH] email patch' msg['From'] = 'email patcher' sys.stdout.write(msg.as_string()) EOF echo '% plain diff in email, [PATCH] subject, message body with subject' hg clone -r0 a b hg --cwd a diff -r0:1 > tip.patch python mkmsg2.py | hg --cwd b import - hg --cwd b tip --template '{desc}\n' rm -r b # We weren't backing up the correct dirstate file when importing many patches # (issue963) echo '% import patch1 patch2; rollback' echo line 3 >> a/a hg --cwd a ci -m'third change' hg --cwd a export -o '../patch%R' 1 2 hg clone -qr0 a b hg --cwd b parents --template 'parent: {rev}\n' hg --cwd b import ../patch1 ../patch2 hg --cwd b rollback hg --cwd b parents --template 'parent: {rev}\n' rm -r b # bug non regression test # importing a patch in a subdirectory failed at the commit stage echo line 2 >> a/d1/d2/a hg --cwd a ci -u someoneelse -d '1 0' -m'subdir change' echo % hg import in a subdirectory hg clone -r0 a b hg --cwd a export tip | sed -e 's/d1\/d2\///' > tip.patch dir=`pwd` cd b/d1/d2 2>&1 > /dev/null hg import ../../../tip.patch cd "$dir" echo "% message should be 'subdir change'" hg --cwd b tip | grep 'subdir change' echo "% committer should be 'someoneelse'" hg --cwd b tip | grep someoneelse echo "% should be empty" hg --cwd b status # Test fuzziness (ambiguous patch location, fuzz=2) echo % test fuzziness hg init fuzzy cd fuzzy echo line1 > a echo line0 >> a echo line3 >> a hg ci -Am adda echo line1 > a echo line2 >> a echo line0 >> a echo line3 >> a hg ci -m change a hg export tip > tip.patch hg up -C 0 echo line1 > a echo line0 >> a echo line1 >> a echo line0 >> a hg ci -m brancha hg import --no-commit -v tip.patch hg revert -a echo '% test fuzziness with eol=auto' hg --config patch.eol=auto import --no-commit -v tip.patch cd .. # Test hunk touching empty files (issue906) hg init empty cd empty touch a touch b1 touch c1 echo d > d hg ci -Am init echo a > a echo b > b1 hg mv b1 b2 echo c > c1 hg copy c1 c2 rm d touch d hg diff --git hg ci -m empty hg export --git tip > empty.diff hg up -C 0 hg import empty.diff for name in a b1 b2 c1 c2 d; do echo % $name file test -f $name && cat $name done cd .. # Test importing a patch ending with a binary file removal echo % test trailing binary removal hg init binaryremoval cd binaryremoval echo a > a python -c "file('b', 'wb').write('a\x00b')" hg ci -Am addall hg rm a hg rm b hg st hg ci -m remove hg export --git . > remove.diff cat remove.diff | grep git hg up -C 0 hg import remove.diff hg manifest cd .. echo % 'test update+rename with common name (issue 927)' hg init t cd t touch a hg ci -Am t echo a > a # Here, bfile.startswith(afile) hg copy a a2 hg ci -m copya hg export --git tip > copy.diff hg up -C 0 hg import copy.diff echo % view a # a should contain an 'a' cat a echo % view a2 # and a2 should have duplicated it cat a2 cd .. echo % 'test -p0' hg init p0 cd p0 echo a > a hg ci -Am t hg import -p0 - << EOF foobar --- a Sat Apr 12 22:43:58 2008 -0400 +++ a Sat Apr 12 22:44:05 2008 -0400 @@ -1,1 +1,1 @@ -a +bb EOF hg status cat a cd .. echo % 'test paths outside repo root' mkdir outside touch outside/foo hg init inside cd inside hg import - <<EOF diff --git a/a b/b rename from ../outside/foo rename to bar EOF cd .. echo '% test import with similarity (issue295)' hg init sim cd sim echo 'this is a test' > a hg ci -Ama cat > ../rename.diff <<EOF diff --git a/a b/a deleted file mode 100644 --- a/a +++ /dev/null @@ -1,1 +0,0 @@ -this is a test diff --git a/b b/b new file mode 100644 --- /dev/null +++ b/b @@ -0,0 +1,2 @@ +this is a test +foo EOF hg import --no-commit -v -s 1 ../rename.diff hg st -C hg revert -a rm b hg import --no-commit -v -s 100 ../rename.diff hg st -C cd .. echo '% add empty file from the end of patch (issue 1495)' hg init addemptyend cd addemptyend touch a hg addremove hg ci -m "commit" cat > a.patch <<EOF diff --git a/a b/a --- a/a +++ b/a @@ -0,0 +1,1 @@ +a diff --git a/b b/b new file mode 100644 EOF hg import --no-commit a.patch cd .. echo '% create file when source is not /dev/null' cat > create.patch <<EOF diff -Naur proj-orig/foo proj-new/foo --- proj-orig/foo 1969-12-31 16:00:00.000000000 -0800 +++ proj-new/foo 2009-07-17 16:50:45.801368000 -0700 @@ -0,0 +1,1 @@ +a EOF # some people have patches like the following too cat > create2.patch <<EOF diff -Naur proj-orig/foo proj-new/foo --- proj-orig/foo.orig 1969-12-31 16:00:00.000000000 -0800 +++ proj-new/foo 2009-07-17 16:50:45.801368000 -0700 @@ -0,0 +1,1 @@ +a EOF hg init oddcreate cd oddcreate hg import --no-commit ../create.patch cat foo rm foo hg revert foo hg import --no-commit ../create2.patch cat foo echo % 'first line mistaken for email headers (issue 1859)' hg init emailconfusion cd emailconfusion cat > a.patch <<EOF module: summary description diff -r 000000000000 -r 9b4c1e343b55 test.txt --- /dev/null +++ b/a @@ -0,0 +1,1 @@ +a EOF hg import -d '0 0' a.patch hg parents -v cd .. echo % '--- in commit message' hg init commitconfusion cd commitconfusion cat > a.patch <<EOF module: summary --- description diff --git a/a b/a new file mode 100644 --- /dev/null +++ b/a @@ -0,0 +1,1 @@ +a EOF hg import -d '0 0' a.patch hg parents -v cd .. echo '% tricky header splitting' cat > trickyheaders.patch <<EOF From: User A <user@a> Subject: [PATCH] from: tricky! # HG changeset patch # User User B # Date 1266264441 18000 # Branch stable # Node ID f2be6a1170ac83bf31cb4ae0bad00d7678115bc0 # Parent 0000000000000000000000000000000000000000 from: tricky! That is not a header. diff -r 000000000000 -r f2be6a1170ac foo --- /dev/null +++ b/foo @@ -0,0 +1,1 @@ +foo EOF hg init trickyheaders cd trickyheaders hg import -d '0 0' ../trickyheaders.patch hg export --git tip cd .. echo '% issue2102' hg init issue2102 cd issue2102 mkdir -p src/cmd/gc touch src/cmd/gc/mksys.bash hg ci -Am init hg import - <<EOF # HG changeset patch # User Rob Pike # Date 1216685449 25200 # Node ID 03aa2b206f499ad6eb50e6e207b9e710d6409c98 # Parent 93d10138ad8df586827ca90b4ddb5033e21a3a84 help management of empty pkg and lib directories in perforce R=gri DELTA=4 (4 added, 0 deleted, 0 changed) OCL=13328 CL=13328 diff --git a/lib/place-holder b/lib/place-holder new file mode 100644 --- /dev/null +++ b/lib/place-holder @@ -0,0 +1,2 @@ +perforce does not maintain empty directories. +this file helps. diff --git a/pkg/place-holder b/pkg/place-holder new file mode 100644 --- /dev/null +++ b/pkg/place-holder @@ -0,0 +1,2 @@ +perforce does not maintain empty directories. +this file helps. diff --git a/src/cmd/gc/mksys.bash b/src/cmd/gc/mksys.bash old mode 100644 new mode 100755 EOF hg sum hg diff --git -c tip cd .. echo '% diff lines looking like headers' hg init difflineslikeheaders cd difflineslikeheaders echo a >a echo b >b echo c >c hg ci -Am1 echo "key: value" >>a echo "key: value" >>b echo "foo" >>c hg ci -m2 hg up -C 0 hg diff --git -c1 >want hg diff -c1 | hg import --no-commit - hg diff --git >have diff want have cd ..