Mercurial > hg
view tests/test-push-warn @ 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 | a101a743c570 |
children | e43c23d189a5 |
line wrap: on
line source
#!/bin/sh echo "[extensions]" >> $HGRCPATH echo "graphlog=" >> $HGRCPATH mkdir a cd a hg init echo foo > t1 hg add t1 hg commit -m "1" -d "1000000 0" cd .. hg clone a b cd a echo foo > t2 hg add t2 hg commit -m "2" -d "1000000 0" cd ../b echo foo > t3 hg add t3 hg commit -m "3" -d "1000000 0" hg push ../a hg pull ../a hg push ../a hg merge hg commit -m "4" -d "1000000 0" hg push ../a cd .. hg init c cd c for i in 0 1 2; do echo $i >> foo hg ci -Am $i -d "1000000 0" done cd .. hg clone c d cd d for i in 0 1; do hg co -C $i echo d-$i >> foo hg ci -m d-$i -d "1000000 0" done HGMERGE=true hg merge 3 hg ci -m c-d -d "1000000 0" hg push ../c; echo $? hg push -r 2 ../c; echo $? hg push -r 3 ../c; echo $? hg push -r 3 -r 4 ../c; echo $? hg push -f -r 3 -r 4 ../c; echo $? hg push -r 5 ../c; echo $? hg in ../c echo % issue 450 hg init ../e hg push -r 0 ../e ; echo $? hg push -r 1 ../e ; echo $? cd .. echo % issue 736 hg init f cd f hg -q branch a echo 0 > foo hg -q ci -d "1000000 0" -Am 0 echo 1 > foo hg -q ci -d "1000000 0" -m 1 hg -q up 0 echo 2 > foo hg -q ci -d "1000000 0" -m 2 hg -q up 0 hg -q branch b echo 3 > foo hg -q ci -d "1000000 0" -m 3 cd .. hg -q clone f g cd g echo % push on existing branch and new branch hg -q up 1 echo 4 > foo hg -q ci -d "1000000 0" -m 4 hg -q up 0 echo 5 > foo hg -q branch c hg -q ci -d "1000000 0" -m 5 hg push ../f; echo $? hg push -r 4 -r 5 ../f; echo $? echo % multiple new branches hg -q branch d echo 6 > foo hg -q ci -d "1000000 0" -m 6 hg push ../f; echo $? hg push -r 4 -r 6 ../f; echo $? cd ../g echo % fail on multiple head push hg -q up 1 echo 7 > foo hg -q ci -d "1000000 0" -m 7 hg push -r 4 -r 7 ../f; echo $? echo % push replacement head on existing branches hg -q up 3 echo 8 > foo hg -q ci -d "1000000 0" -m 8 hg push -r 7 -r 8 ../f; echo $? echo % merge of branch a to other branch b followed by unrelated push on branch a hg -q up 7 HGMERGE=true hg -q merge 8 hg -q ci -d "1000000 0" -m 9 hg -q up 8 echo 10 > foo hg -q ci -d "1000000 0" -m 10 hg push -r 9 ../f; echo $? hg push -r 10 ../f; echo $? echo % cheating the counting algorithm hg -q up 9 HGMERGE=true hg -q merge 2 hg -q ci -d "1000000 0" -m 11 hg -q up 1 echo 12 > foo hg -q ci -d "1000000 0" -m 12 hg push -r 11 -r 12 ../f; echo $? echo % checking prepush logic does not allow silently pushing multiple new heads cd .. hg init h echo init > h/init hg -R h ci -Am init echo a > h/a hg -R h ci -Am a hg clone h i hg -R h up 0 echo b > h/b hg -R h ci -Am b hg -R i up 0 echo c > i/c hg -R i ci -Am c hg -R i push h echo echo % check prepush logic with merged branches hg init j hg -R j branch a echo init > j/foo hg -R j ci -Am init hg clone j k echo a1 > j/foo hg -R j ci -m a1 hg -R k branch b echo b > k/foo hg -R k ci -m b hg -R k up 0 hg -R k merge b hg -R k ci -m merge hg -R k push -r a j echo echo % prepush -r should not allow you to sneak in new heads hg init l cd l echo a >> foo hg -q add foo hg -q branch a hg -q ci -d '0 0' -ma hg -q up null echo a >> foo hg -q add foo hg -q branch b hg -q ci -d '0 0' -mb cd .. hg -q clone l m -u a cd m hg -q merge b hg -q ci -d '0 0' -mmb hg -q up 0 echo a >> foo hg -q ci -ma2 hg -q up 2 echo a >> foo hg -q branch -f b hg -q ci -d '0 0' -mb2 hg -q merge 3 hg -q ci -d '0 0' -mma hg push ../l -b b cd .. echo % check prepush with new branch head on former topo non-head hg init n cd n hg branch A echo a >a hg ci -Ama hg branch B echo b >b hg ci -Amb # b is now branch head of B, and a topological head # a is now branch head of A, but not a topological head hg clone . inner cd inner hg up B echo b1 >b1 hg ci -Amb1 # in the clone b1 is now the head of B cd .. hg up 0 echo a2 >a2 hg ci -Ama2 # a2 is now the new branch head of A, and a new topological head # it replaces a former inner branch head, so it should at most warn about A, not B echo %% glog of local hg glog --template "{rev}: {branches} {desc}\n" echo %% glog of remote hg glog -R inner --template "{rev}: {branches} {desc}\n" echo %% outgoing hg out inner --template "{rev}: {branches} {desc}\n" hg push inner cd .. echo % check prepush with new branch head on former topo head hg init o cd o hg branch A echo a >a hg ci -Ama hg branch B echo b >b hg ci -Amb # b is now branch head of B, and a topological head hg up 0 echo a1 >a1 hg ci -Ama1 # a1 is now branch head of A, and a topological head hg clone . inner cd inner hg up B echo b1 >b1 hg ci -Amb1 # in the clone b1 is now the head of B cd .. echo a2 >a2 hg ci -Ama2 # a2 is now the new branch head of A, and a topological head # it replaces a former topological and branch head, so this should not warn echo %% glog of local hg glog --template "{rev}: {branches} {desc}\n" echo %% glog of remote hg glog -R inner --template "{rev}: {branches} {desc}\n" echo %% outgoing hg out inner --template "{rev}: {branches} {desc}\n" hg push inner cd .. echo % check prepush with new branch head and new child of former branch head echo % but child is on different branch hg init p cd p hg branch A echo a0 >a hg ci -Ama0 echo a1 >a hg ci -ma1 hg up null hg branch B echo b0 >b hg ci -Amb0 echo b1 >b hg ci -mb1 hg clone . inner hg up A hg branch -f B echo a3 >a hg ci -ma3 hg up 3 hg branch -f A echo b3 >b hg ci -mb3 echo %% glog of local hg glog --template "{rev}: {branches} {desc}\n" echo %% glog of remote hg glog -R inner --template "{rev}: {branches} {desc}\n" echo %% outgoing hg out inner --template "{rev}: {branches} {desc}\n" hg push inner hg push inner -r4 -r5 hg in inner cd .. exit 0