mirror of
https://github.com/facebook/sapling.git
synced 2024-10-10 00:45:18 +03:00
6f58bfc15e
This resolves the issue of hg cmd --mq not being colorized. This was due to color wrapping only the instance of ui passed to dispatch._runcommand(), which isn't the same ui object that mq.mqcommand() receives. After dispatch calls extensions.loadall(), it makes sure any changes to ui.__class__ in uisetup are propagated. progress is updated to wrap ui in the same manner because wrapfunction doesn't play well when ui.__class__ has been replaced by another extension (orig will point to the old class method instead of color's).
626 lines
11 KiB
Bash
Executable File
626 lines
11 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
. $TESTDIR/helpers.sh
|
|
|
|
checkundo()
|
|
{
|
|
if [ -f .hg/store/undo ]; then
|
|
echo ".hg/store/undo still exists after $1"
|
|
fi
|
|
}
|
|
|
|
echo "[extensions]" >> $HGRCPATH
|
|
echo "mq=" >> $HGRCPATH
|
|
|
|
echo "[mq]" >> $HGRCPATH
|
|
echo "plain=true" >> $HGRCPATH
|
|
|
|
echo % help
|
|
hg help mq
|
|
|
|
hg init a
|
|
cd a
|
|
echo a > a
|
|
hg ci -Ama
|
|
|
|
hg clone . ../k
|
|
|
|
mkdir b
|
|
echo z > b/z
|
|
hg ci -Ama
|
|
|
|
echo % qinit
|
|
|
|
hg qinit
|
|
|
|
cd ..
|
|
hg init b
|
|
|
|
echo % -R qinit
|
|
|
|
hg -R b qinit
|
|
|
|
hg init c
|
|
|
|
echo % qinit -c
|
|
|
|
hg --cwd c qinit -c
|
|
hg -R c/.hg/patches st
|
|
|
|
echo '% qinit; qinit -c'
|
|
hg init d
|
|
cd d
|
|
hg qinit
|
|
hg qinit -c
|
|
# qinit -c should create both files if they don't exist
|
|
echo ' .hgignore:'
|
|
cat .hg/patches/.hgignore
|
|
echo ' series:'
|
|
cat .hg/patches/series
|
|
hg qinit -c 2>&1 | sed -e 's/repository.*already/repository already/'
|
|
cd ..
|
|
|
|
echo '% qinit; <stuff>; qinit -c'
|
|
hg init e
|
|
cd e
|
|
hg qnew A
|
|
checkundo qnew
|
|
echo foo > foo
|
|
hg add foo
|
|
hg qrefresh
|
|
hg qnew B
|
|
echo >> foo
|
|
hg qrefresh
|
|
echo status >> .hg/patches/.hgignore
|
|
echo bleh >> .hg/patches/.hgignore
|
|
hg qinit -c
|
|
hg -R .hg/patches status
|
|
# qinit -c shouldn't touch these files if they already exist
|
|
echo ' .hgignore:'
|
|
cat .hg/patches/.hgignore
|
|
echo ' series:'
|
|
cat .hg/patches/series
|
|
|
|
echo '% status --mq with color (issue2096)'
|
|
hg status --mq --config extensions.color= --color=always
|
|
cd ..
|
|
|
|
echo '% init --mq without repo'
|
|
mkdir f
|
|
cd f
|
|
hg init --mq
|
|
cd ..
|
|
|
|
echo '% init --mq with repo path'
|
|
hg init g
|
|
hg init --mq g
|
|
test -d g/.hg/patches/.hg && echo "ok" || echo "failed"
|
|
|
|
echo '% init --mq with nonexistent directory'
|
|
hg init --mq nonexistentdir
|
|
|
|
echo '% init --mq with bundle (non "local")'
|
|
hg -R a bundle --all a.bundle >/dev/null
|
|
hg init --mq a.bundle
|
|
|
|
cd a
|
|
|
|
hg qnew -m 'foo bar' test.patch
|
|
|
|
echo % qrefresh
|
|
|
|
echo a >> a
|
|
hg qrefresh
|
|
sed -e "s/^\(diff -r \)\([a-f0-9]* \)/\1 x/" \
|
|
-e "s/\(+++ [a-zA-Z0-9_/.-]*\).*/\1/" \
|
|
-e "s/\(--- [a-zA-Z0-9_/.-]*\).*/\1/" .hg/patches/test.patch
|
|
|
|
echo % empty qrefresh
|
|
|
|
hg qrefresh -X a
|
|
echo 'revision:'
|
|
hg diff -r -2 -r -1
|
|
echo 'patch:'
|
|
cat .hg/patches/test.patch
|
|
echo 'working dir diff:'
|
|
hg diff --nodates -q
|
|
# restore things
|
|
hg qrefresh
|
|
checkundo qrefresh
|
|
|
|
echo % qpop
|
|
|
|
hg qpop
|
|
checkundo qpop
|
|
|
|
echo % qpush with dump of tag cache
|
|
|
|
# Dump the tag cache to ensure that it has exactly one head after qpush.
|
|
rm -f .hg/tags.cache
|
|
hg tags > /dev/null
|
|
echo ".hg/tags.cache (pre qpush):"
|
|
sed 's/ [0-9a-f]*//' .hg/tags.cache
|
|
hg qpush
|
|
hg tags > /dev/null
|
|
echo ".hg/tags.cache (post qpush):"
|
|
sed 's/ [0-9a-f]*//' .hg/tags.cache
|
|
|
|
checkundo qpush
|
|
|
|
cd ..
|
|
|
|
echo % pop/push outside repo
|
|
|
|
hg -R a qpop
|
|
hg -R a qpush
|
|
|
|
cd a
|
|
hg qnew test2.patch
|
|
|
|
echo % qrefresh in subdir
|
|
|
|
cd b
|
|
echo a > a
|
|
hg add a
|
|
hg qrefresh
|
|
|
|
echo % pop/push -a in subdir
|
|
|
|
hg qpop -a
|
|
hg --traceback qpush -a
|
|
|
|
# setting columns & formatted tests truncating (issue1912)
|
|
echo % qseries
|
|
COLUMNS=4 hg qseries --config ui.formatted=true
|
|
COLUMNS=20 hg qseries --config ui.formatted=true -vs
|
|
hg qpop
|
|
hg qseries -vs
|
|
hg sum | grep mq
|
|
hg qpush
|
|
hg sum | grep mq
|
|
|
|
echo % qapplied
|
|
hg qapplied
|
|
|
|
echo % qtop
|
|
hg qtop
|
|
|
|
echo % prev
|
|
hg qapp -1
|
|
|
|
echo % next
|
|
hg qunapp -1
|
|
|
|
hg qpop
|
|
echo % commit should fail
|
|
hg commit
|
|
|
|
echo % push should fail
|
|
hg push ../../k
|
|
|
|
echo % import should fail
|
|
hg st .
|
|
echo foo >> ../a
|
|
hg diff > ../../import.diff
|
|
hg revert --no-backup ../a
|
|
hg import ../../import.diff
|
|
hg st
|
|
echo % import --no-commit should succeed
|
|
hg import --no-commit ../../import.diff
|
|
hg st
|
|
hg revert --no-backup ../a
|
|
|
|
echo % qunapplied
|
|
hg qunapplied
|
|
|
|
echo % qpush/qpop with index
|
|
hg qnew test1b.patch
|
|
echo 1b > 1b
|
|
hg add 1b
|
|
hg qrefresh
|
|
hg qpush 2
|
|
hg qpop 0
|
|
hg qpush test.patch+1
|
|
hg qpush test.patch+2
|
|
hg qpop test2.patch-1
|
|
hg qpop test2.patch-2
|
|
hg qpush test1b.patch+1
|
|
|
|
echo % qpush --move
|
|
hg qpop -a
|
|
hg qpush --move test2.patch # move to front
|
|
hg qpush --move test1b.patch
|
|
hg qpush --move test.patch # noop move
|
|
hg qseries -v
|
|
hg qpop -a
|
|
hg qpush --move test.patch # cleaning up
|
|
hg qpush --move test1b.patch
|
|
hg qpush --move bogus # nonexistent patch
|
|
hg qpush --move test.patch # already applied
|
|
hg qpush
|
|
|
|
echo % pop, qapplied, qunapplied
|
|
hg qseries -v
|
|
echo % qapplied -1 test.patch
|
|
hg qapplied -1 test.patch
|
|
echo % qapplied -1 test1b.patch
|
|
hg qapplied -1 test1b.patch
|
|
echo % qapplied -1 test2.patch
|
|
hg qapplied -1 test2.patch
|
|
echo % qapplied -1
|
|
hg qapplied -1
|
|
echo % qapplied
|
|
hg qapplied
|
|
echo % qapplied test1b.patch
|
|
hg qapplied test1b.patch
|
|
echo % qunapplied -1
|
|
hg qunapplied -1
|
|
echo % qunapplied
|
|
hg qunapplied
|
|
echo % popping
|
|
hg qpop
|
|
echo % qunapplied -1
|
|
hg qunapplied -1
|
|
echo % qunapplied
|
|
hg qunapplied
|
|
echo % qunapplied test2.patch
|
|
hg qunapplied test2.patch
|
|
echo % qunapplied -1 test2.patch
|
|
hg qunapplied -1 test2.patch
|
|
echo % popping -a
|
|
hg qpop -a
|
|
echo % qapplied
|
|
hg qapplied
|
|
echo % qapplied -1
|
|
hg qapplied -1
|
|
hg qpush
|
|
|
|
echo % push should succeed
|
|
hg qpop -a
|
|
hg push ../../k
|
|
|
|
echo % qpush/qpop error codes
|
|
errorcode()
|
|
{
|
|
hg "$@" && echo " $@ succeeds" || echo " $@ fails"
|
|
}
|
|
|
|
# we want to start with some patches applied
|
|
hg qpush -a
|
|
echo " % pops all patches and succeeds"
|
|
errorcode qpop -a
|
|
echo " % does nothing and succeeds"
|
|
errorcode qpop -a
|
|
echo " % fails - nothing else to pop"
|
|
errorcode qpop
|
|
echo " % pushes a patch and succeeds"
|
|
errorcode qpush
|
|
echo " % pops a patch and succeeds"
|
|
errorcode qpop
|
|
echo " % pushes up to test1b.patch and succeeds"
|
|
errorcode qpush test1b.patch
|
|
echo " % does nothing and succeeds"
|
|
errorcode qpush test1b.patch
|
|
echo " % does nothing and succeeds"
|
|
errorcode qpop test1b.patch
|
|
echo " % fails - can't push to this patch"
|
|
errorcode qpush test.patch
|
|
echo " % fails - can't pop to this patch"
|
|
errorcode qpop test2.patch
|
|
echo " % pops up to test.patch and succeeds"
|
|
errorcode qpop test.patch
|
|
echo " % pushes all patches and succeeds"
|
|
errorcode qpush -a
|
|
echo " % does nothing and succeeds"
|
|
errorcode qpush -a
|
|
echo " % fails - nothing else to push"
|
|
errorcode qpush
|
|
echo " % does nothing and succeeds"
|
|
errorcode qpush test2.patch
|
|
|
|
|
|
echo % strip
|
|
cd ../../b
|
|
echo x>x
|
|
hg ci -Ama
|
|
hg strip tip | hidebackup
|
|
hg unbundle .hg/strip-backup/*
|
|
|
|
echo % strip with local changes, should complain
|
|
hg up
|
|
echo y>y
|
|
hg add y
|
|
hg strip tip | hidebackup
|
|
echo % --force strip with local changes
|
|
hg strip -f tip | hidebackup
|
|
|
|
echo '% cd b; hg qrefresh'
|
|
hg init refresh
|
|
cd refresh
|
|
echo a > a
|
|
hg ci -Ama
|
|
hg qnew -mfoo foo
|
|
echo a >> a
|
|
hg qrefresh
|
|
mkdir b
|
|
cd b
|
|
echo f > f
|
|
hg add f
|
|
hg qrefresh
|
|
sed -e "s/\(+++ [a-zA-Z0-9_/.-]*\).*/\1/" \
|
|
-e "s/\(--- [a-zA-Z0-9_/.-]*\).*/\1/" ../.hg/patches/foo
|
|
echo % hg qrefresh .
|
|
hg qrefresh .
|
|
sed -e "s/\(+++ [a-zA-Z0-9_/.-]*\).*/\1/" \
|
|
-e "s/\(--- [a-zA-Z0-9_/.-]*\).*/\1/" ../.hg/patches/foo
|
|
hg status
|
|
|
|
echo % qpush failure
|
|
cd ..
|
|
hg qrefresh
|
|
hg qnew -mbar bar
|
|
echo foo > foo
|
|
echo bar > bar
|
|
hg add foo bar
|
|
hg qrefresh
|
|
hg qpop -a
|
|
echo bar > foo
|
|
hg qpush -a
|
|
hg st
|
|
|
|
echo % mq tags
|
|
hg log --template '{rev} {tags}\n' -r qparent:qtip
|
|
|
|
echo % bad node in status
|
|
hg qpop
|
|
hg strip -qn tip
|
|
hg tip 2>&1 | sed -e 's/unknown node .*/unknown node/'
|
|
hg branches 2>&1 | sed -e 's/unknown node .*/unknown node/'
|
|
hg qpop 2>&1 | sed -e 's/unknown node .*/unknown node/'
|
|
|
|
cat >>$HGRCPATH <<EOF
|
|
[diff]
|
|
git = True
|
|
EOF
|
|
cd ..
|
|
hg init git
|
|
cd git
|
|
hg qinit
|
|
|
|
hg qnew -m'new file' new
|
|
echo foo > new
|
|
chmod +x new
|
|
hg add new
|
|
hg qrefresh
|
|
sed -e "s/\(+++ [a-zA-Z0-9_/.-]*\).*/\1/" \
|
|
-e "s/\(--- [a-zA-Z0-9_/.-]*\).*/\1/" .hg/patches/new
|
|
|
|
hg qnew -m'copy file' copy
|
|
hg cp new copy
|
|
hg qrefresh
|
|
sed -e "s/\(+++ [a-zA-Z0-9_/.-]*\).*/\1/" \
|
|
-e "s/\(--- [a-zA-Z0-9_/.-]*\).*/\1/" .hg/patches/copy
|
|
|
|
hg qpop
|
|
hg qpush
|
|
hg qdiff
|
|
cat >>$HGRCPATH <<EOF
|
|
[diff]
|
|
git = False
|
|
EOF
|
|
hg qdiff --git
|
|
cd ..
|
|
|
|
echo % test file addition in slow path
|
|
hg init slow
|
|
cd slow
|
|
hg qinit
|
|
echo foo > foo
|
|
hg add foo
|
|
hg ci -m 'add foo'
|
|
hg qnew bar
|
|
echo bar > bar
|
|
hg add bar
|
|
hg mv foo baz
|
|
hg qrefresh --git
|
|
hg up -C 0
|
|
echo >> foo
|
|
hg ci -m 'change foo'
|
|
hg up -C 1
|
|
hg qrefresh --git 2>&1 | grep -v 'saving bundle'
|
|
cat .hg/patches/bar
|
|
hg log -v --template '{rev} {file_copies}\n' -r .
|
|
hg qrefresh --git
|
|
cat .hg/patches/bar
|
|
hg log -v --template '{rev} {file_copies}\n' -r .
|
|
hg qrefresh
|
|
grep 'diff --git' .hg/patches/bar
|
|
|
|
echo % test file move chains in the slow path
|
|
hg up -C 1
|
|
echo >> foo
|
|
hg ci -m 'change foo again'
|
|
hg up -C 2
|
|
hg mv bar quux
|
|
hg mv baz bleh
|
|
hg qrefresh --git 2>&1 | grep -v 'saving bundle'
|
|
cat .hg/patches/bar
|
|
hg log -v --template '{rev} {file_copies}\n' -r .
|
|
hg mv quux fred
|
|
hg mv bleh barney
|
|
hg qrefresh --git
|
|
cat .hg/patches/bar
|
|
hg log -v --template '{rev} {file_copies}\n' -r .
|
|
|
|
echo % refresh omitting an added file
|
|
hg qnew baz
|
|
echo newfile > newfile
|
|
hg add newfile
|
|
hg qrefresh
|
|
hg st -A newfile
|
|
hg qrefresh -X newfile
|
|
hg st -A newfile
|
|
hg revert newfile
|
|
rm newfile
|
|
hg qpop
|
|
hg qdel baz
|
|
|
|
echo % create a git patch
|
|
echo a > alexander
|
|
hg add alexander
|
|
hg qnew -f --git addalexander
|
|
grep diff .hg/patches/addalexander
|
|
|
|
echo % create a git binary patch
|
|
cat > writebin.py <<EOF
|
|
import sys
|
|
path = sys.argv[1]
|
|
open(path, 'wb').write('BIN\x00ARY')
|
|
EOF
|
|
python writebin.py bucephalus
|
|
|
|
python "$TESTDIR/md5sum.py" bucephalus
|
|
hg add bucephalus
|
|
hg qnew -f --git addbucephalus
|
|
grep diff .hg/patches/addbucephalus
|
|
|
|
echo % check binary patches can be popped and pushed
|
|
hg qpop
|
|
test -f bucephalus && echo % bucephalus should not be there
|
|
hg qpush
|
|
test -f bucephalus || echo % bucephalus should be there
|
|
python "$TESTDIR/md5sum.py" bucephalus
|
|
|
|
|
|
echo '% strip again'
|
|
cd ..
|
|
hg init strip
|
|
cd strip
|
|
touch foo
|
|
hg add foo
|
|
hg ci -m 'add foo'
|
|
echo >> foo
|
|
hg ci -m 'change foo 1'
|
|
hg up -C 0
|
|
echo 1 >> foo
|
|
hg ci -m 'change foo 2'
|
|
HGMERGE=true hg merge
|
|
hg ci -m merge
|
|
hg log
|
|
hg strip 1 | hidebackup
|
|
checkundo strip
|
|
hg log
|
|
cd ..
|
|
|
|
echo '% qclone'
|
|
qlog()
|
|
{
|
|
echo 'main repo:'
|
|
hg log --template ' rev {rev}: {desc}\n'
|
|
echo 'patch repo:'
|
|
hg -R .hg/patches log --template ' rev {rev}: {desc}\n'
|
|
}
|
|
hg init qclonesource
|
|
cd qclonesource
|
|
echo foo > foo
|
|
hg add foo
|
|
hg ci -m 'add foo'
|
|
hg qinit
|
|
hg qnew patch1
|
|
echo bar >> foo
|
|
hg qrefresh -m 'change foo'
|
|
cd ..
|
|
|
|
# repo with unversioned patch dir
|
|
hg qclone qclonesource failure
|
|
|
|
cd qclonesource
|
|
hg qinit -c
|
|
hg qci -m checkpoint
|
|
qlog
|
|
cd ..
|
|
|
|
# repo with patches applied
|
|
hg qclone qclonesource qclonedest
|
|
cd qclonedest
|
|
qlog
|
|
cd ..
|
|
|
|
# repo with patches unapplied
|
|
cd qclonesource
|
|
hg qpop -a
|
|
qlog
|
|
cd ..
|
|
hg qclone qclonesource qclonedest2
|
|
cd qclonedest2
|
|
qlog
|
|
cd ..
|
|
|
|
echo % 'test applying on an empty file (issue 1033)'
|
|
hg init empty
|
|
cd empty
|
|
touch a
|
|
hg ci -Am addempty
|
|
echo a > a
|
|
hg qnew -f -e changea
|
|
hg qpop
|
|
hg qpush
|
|
cd ..
|
|
|
|
echo % test qpush with --force, issue1087
|
|
hg init forcepush
|
|
cd forcepush
|
|
echo hello > hello.txt
|
|
echo bye > bye.txt
|
|
hg ci -Ama
|
|
hg qnew -d '0 0' empty
|
|
hg qpop
|
|
echo world >> hello.txt
|
|
|
|
echo % qpush should fail, local changes
|
|
hg qpush
|
|
|
|
echo % apply force, should not discard changes with empty patch
|
|
hg qpush -f 2>&1 | sed 's,^.*/patch,patch,g'
|
|
hg diff --config diff.nodates=True
|
|
hg qdiff --config diff.nodates=True
|
|
hg log -l1 -p
|
|
hg qref -d '0 0'
|
|
hg qpop
|
|
echo universe >> hello.txt
|
|
echo universe >> bye.txt
|
|
|
|
echo % qpush should fail, local changes
|
|
hg qpush
|
|
|
|
echo % apply force, should discard changes in hello, but not bye
|
|
hg qpush -f
|
|
hg st
|
|
hg diff --config diff.nodates=True
|
|
hg qdiff --config diff.nodates=True
|
|
|
|
echo % test popping revisions not in working dir ancestry
|
|
hg qseries -v
|
|
hg up qparent
|
|
hg qpop
|
|
|
|
cd ..
|
|
hg init deletion-order
|
|
cd deletion-order
|
|
|
|
touch a
|
|
hg ci -Aqm0
|
|
|
|
hg qnew rename-dir
|
|
hg rm a
|
|
hg qrefresh
|
|
|
|
mkdir a b
|
|
touch a/a b/b
|
|
hg add -q a b
|
|
hg qrefresh
|
|
|
|
echo % test popping must remove files added in subdirectories first
|
|
hg qpop
|
|
cd ..
|