view tests/test-push-warn @ 11541:ab9fa7a85dd9 stable

filelog: cmp: don't read data if hashes are identical (issue2273) filelog.renamed() is an expensive call as it reads the filelog if p1 == nullid. It's more efficient to first compute the hash, and to bail early if the computed hash is the same as the stored nodeid. 'samehashes' variable is not strictly necessary, but helps for comprehension.
author Nicolas Dumazet <nicdumz.commits@gmail.com>
date Mon, 05 Jul 2010 19:49:54 +0900
parents e43c23d189a5
children 4c94b6d0fb1c
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 % failed push of new named branch
echo 12 > foo
hg -q ci -d "1000000 0" -m 12a
hg -q up 11
echo 13 > foo
hg -q branch e
hg -q ci -d "1000000 0" -m 13d
hg push -r 12 -r 13 ../f; echo $?

echo % using --new-branch to push new named branch
hg push --new-branch -r 12 -r 13 ../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