--- a/tests/test-mq Sun Aug 15 18:50:19 2010 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,642 +0,0 @@
-#!/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 '# comment' > .hg/patches/series.tmp
-echo >> .hg/patches/series.tmp # empty line
-cat .hg/patches/series >> .hg/patches/series.tmp
-mv .hg/patches/series.tmp .hg/patches/series
-
-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 qguard test1b.patch -- -negguard
-hg qguard test2.patch -- +posguard
-hg qpush --move test2.patch # can't move guarded patch
-hg qselect posguard
-hg qpush --move test2.patch # move to front
-hg qpush --move test1b.patch # negative guard unselected
-hg qpush --move test.patch # noop move
-hg qseries -v
-hg qpop -a
-# cleaning up
-hg qselect --none
-hg qguard --none test1b.patch
-hg qguard --none test2.patch
-hg qpush --move test.patch
-hg qpush --move test1b.patch
-hg qpush --move bogus # nonexistent patch
-hg qpush --move # no patch
-hg qpush --move test.patch # already applied
-hg qpush
-
-echo % series after move
-cat `hg root`/.hg/patches/series
-
-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 ..
--- a/tests/test-mq.out Sun Aug 15 18:50:19 2010 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,653 +0,0 @@
-% help
-mq extension - manage a stack of patches
-
-This extension lets you work with a stack of patches in a Mercurial
-repository. It manages two stacks of patches - all known patches, and applied
-patches (subset of known patches).
-
-Known patches are represented as patch files in the .hg/patches directory.
-Applied patches are both patch files and changesets.
-
-Common tasks (use "hg help command" for more details):
-
- create new patch qnew
- import existing patch qimport
-
- print patch series qseries
- print applied patches qapplied
-
- add known patch to applied stack qpush
- remove patch from applied stack qpop
- refresh contents of top applied patch qrefresh
-
-By default, mq will automatically use git patches when required to avoid
-losing file mode changes, copy records, binary files or empty files creations
-or deletions. This behaviour can be configured with:
-
- [mq]
- git = auto/keep/yes/no
-
-If set to 'keep', mq will obey the [diff] section configuration while
-preserving existing git patches upon qrefresh. If set to 'yes' or 'no', mq
-will override the [diff] section and always generate git or regular patches,
-possibly losing data in the second case.
-
-You will by default be managing a patch queue named "patches". You can create
-other, independent patch queues with the "hg qqueue" command.
-
-list of commands:
-
- qapplied print the patches already applied
- qclone clone main and patch repository at same time
- qdelete remove patches from queue
- qdiff diff of the current patch and subsequent modifications
- qfinish move applied patches into repository history
- qfold fold the named patches into the current patch
- qgoto push or pop patches until named patch is at top of stack
- qguard set or print guards for a patch
- qheader print the header of the topmost or specified patch
- qimport import a patch
- qnew create a new patch
- qnext print the name of the next patch
- qpop pop the current patch off the stack
- qprev print the name of the previous patch
- qpush push the next patch onto the stack
- qqueue manage multiple patch queues
- qrefresh update the current patch
- qrename rename a patch
- qselect set or print guarded patches to push
- qseries print the entire series file
- qtop print the name of the current patch
- qunapplied print the patches not yet applied
- strip strip changesets and all their descendants from the repository
-
-use "hg -v help mq" to show aliases and global options
-adding a
-updating to branch default
-1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-adding b/z
-% qinit
-% -R qinit
-% qinit -c
-A .hgignore
-A series
-% qinit; qinit -c
- .hgignore:
-^\.hg
-^\.mq
-syntax: glob
-status
-guards
- series:
-abort: repository already exists!
-% qinit; <stuff>; qinit -c
-adding .hg/patches/A
-adding .hg/patches/B
-A .hgignore
-A A
-A B
-A series
- .hgignore:
-status
-bleh
- series:
-A
-B
-% status --mq with color (issue2096)
-[0;32;1mA .hgignore[0m
-[0;32;1mA A[0m
-[0;32;1mA B[0m
-[0;32;1mA series[0m
-% init --mq without repo
-abort: There is no Mercurial repository here (.hg not found)
-% init --mq with repo path
-ok
-% init --mq with nonexistent directory
-abort: repository nonexistentdir not found!
-% init --mq with bundle (non "local")
-abort: only a local queue repository may be initialized
-% qrefresh
-foo bar
-
-diff -r xa
---- a/a
-+++ b/a
-@@ -1,1 +1,2 @@
- a
-+a
-% empty qrefresh
-revision:
-patch:
-foo bar
-
-working dir diff:
---- a/a
-+++ b/a
-@@ -1,1 +1,2 @@
- a
-+a
-% qpop
-popping test.patch
-patch queue now empty
-% qpush with dump of tag cache
-.hg/tags.cache (pre qpush):
-1
-
-applying test.patch
-now at: test.patch
-.hg/tags.cache (post qpush):
-2
-
-% pop/push outside repo
-popping test.patch
-patch queue now empty
-applying test.patch
-now at: test.patch
-% qrefresh in subdir
-% pop/push -a in subdir
-popping test2.patch
-popping test.patch
-patch queue now empty
-applying test.patch
-applying test2.patch
-now at: test2.patch
-% qseries
-test.patch
-test2.patch
-0 A test.patch: f...
-1 A test2.patch:
-popping test2.patch
-now at: test.patch
-0 A test.patch: foo bar
-1 U test2.patch:
-mq: 1 applied, 1 unapplied
-applying test2.patch
-now at: test2.patch
-mq: 2 applied
-% qapplied
-test.patch
-test2.patch
-% qtop
-test2.patch
-% prev
-test.patch
-% next
-all patches applied
-popping test2.patch
-now at: test.patch
-% commit should fail
-abort: cannot commit over an applied mq patch
-% push should fail
-pushing to ../../k
-abort: source has mq patches applied
-% import should fail
-abort: cannot import over an applied patch
-% import --no-commit should succeed
-applying ../../import.diff
-M a
-% qunapplied
-test2.patch
-% qpush/qpop with index
-applying test2.patch
-now at: test2.patch
-popping test2.patch
-popping test1b.patch
-now at: test.patch
-applying test1b.patch
-now at: test1b.patch
-applying test2.patch
-now at: test2.patch
-popping test2.patch
-now at: test1b.patch
-popping test1b.patch
-now at: test.patch
-applying test1b.patch
-applying test2.patch
-now at: test2.patch
-% qpush --move
-popping test2.patch
-popping test1b.patch
-popping test.patch
-patch queue now empty
-cannot push 'test2.patch' - guarded by ['+posguard']
-number of unguarded, unapplied patches has changed from 2 to 3
-applying test2.patch
-now at: test2.patch
-applying test1b.patch
-now at: test1b.patch
-applying test.patch
-now at: test.patch
-0 A test2.patch
-1 A test1b.patch
-2 A test.patch
-popping test.patch
-popping test1b.patch
-popping test2.patch
-patch queue now empty
-guards deactivated
-number of unguarded, unapplied patches has changed from 3 to 2
-applying test.patch
-now at: test.patch
-applying test1b.patch
-now at: test1b.patch
-abort: patch bogus not in series
-abort: please specify the patch to move
-abort: cannot push to a previous patch: test.patch
-applying test2.patch
-now at: test2.patch
-% series after move
-test.patch
-test1b.patch
-test2.patch
-# comment
-
-% pop, qapplied, qunapplied
-0 A test.patch
-1 A test1b.patch
-2 A test2.patch
-% qapplied -1 test.patch
-only one patch applied
-% qapplied -1 test1b.patch
-test.patch
-% qapplied -1 test2.patch
-test1b.patch
-% qapplied -1
-test1b.patch
-% qapplied
-test.patch
-test1b.patch
-test2.patch
-% qapplied test1b.patch
-test.patch
-test1b.patch
-% qunapplied -1
-all patches applied
-% qunapplied
-% popping
-popping test2.patch
-now at: test1b.patch
-% qunapplied -1
-test2.patch
-% qunapplied
-test2.patch
-% qunapplied test2.patch
-% qunapplied -1 test2.patch
-all patches applied
-% popping -a
-popping test1b.patch
-popping test.patch
-patch queue now empty
-% qapplied
-% qapplied -1
-no patches applied
-applying test.patch
-now at: test.patch
-% push should succeed
-popping test.patch
-patch queue now empty
-pushing to ../../k
-searching for changes
-adding changesets
-adding manifests
-adding file changes
-added 1 changesets with 1 changes to 1 files
-% qpush/qpop error codes
-applying test.patch
-applying test1b.patch
-applying test2.patch
-now at: test2.patch
- % pops all patches and succeeds
-popping test2.patch
-popping test1b.patch
-popping test.patch
-patch queue now empty
- qpop -a succeeds
- % does nothing and succeeds
-no patches applied
- qpop -a succeeds
- % fails - nothing else to pop
-no patches applied
- qpop fails
- % pushes a patch and succeeds
-applying test.patch
-now at: test.patch
- qpush succeeds
- % pops a patch and succeeds
-popping test.patch
-patch queue now empty
- qpop succeeds
- % pushes up to test1b.patch and succeeds
-applying test.patch
-applying test1b.patch
-now at: test1b.patch
- qpush test1b.patch succeeds
- % does nothing and succeeds
-qpush: test1b.patch is already at the top
- qpush test1b.patch succeeds
- % does nothing and succeeds
-qpop: test1b.patch is already at the top
- qpop test1b.patch succeeds
- % fails - can't push to this patch
-abort: cannot push to a previous patch: test.patch
- qpush test.patch fails
- % fails - can't pop to this patch
-abort: patch test2.patch is not applied
- qpop test2.patch fails
- % pops up to test.patch and succeeds
-popping test1b.patch
-now at: test.patch
- qpop test.patch succeeds
- % pushes all patches and succeeds
-applying test1b.patch
-applying test2.patch
-now at: test2.patch
- qpush -a succeeds
- % does nothing and succeeds
-all patches are currently applied
- qpush -a succeeds
- % fails - nothing else to push
-patch series already fully applied
- qpush fails
- % does nothing and succeeds
-qpush: test2.patch is already at the top
- qpush test2.patch succeeds
-% strip
-adding x
-0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-saved backup bundle to
-adding changesets
-adding manifests
-adding file changes
-added 1 changesets with 1 changes to 1 files
-(run 'hg update' to get a working copy)
-% strip with local changes, should complain
-1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-abort: local changes found
-% --force strip with local changes
-0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-saved backup bundle to
-% cd b; hg qrefresh
-adding a
-foo
-
-diff -r cb9a9f314b8b a
---- a/a
-+++ b/a
-@@ -1,1 +1,2 @@
- a
-+a
-diff -r cb9a9f314b8b b/f
---- /dev/null
-+++ b/b/f
-@@ -0,0 +1,1 @@
-+f
-% hg qrefresh .
-foo
-
-diff -r cb9a9f314b8b b/f
---- /dev/null
-+++ b/b/f
-@@ -0,0 +1,1 @@
-+f
-M a
-% qpush failure
-popping bar
-popping foo
-patch queue now empty
-applying foo
-applying bar
-file foo already exists
-1 out of 1 hunks FAILED -- saving rejects to file foo.rej
-patch failed, unable to continue (try -v)
-patch failed, rejects left in working dir
-errors during apply, please fix and refresh bar
-? foo
-? foo.rej
-% mq tags
-0 qparent
-1 foo qbase
-2 bar qtip tip
-% bad node in status
-popping bar
-now at: foo
-changeset: 0:cb9a9f314b8b
-tag: tip
-user: test
-date: Thu Jan 01 00:00:00 1970 +0000
-summary: a
-
-default 0:cb9a9f314b8b
-no patches applied
-new file
-
-diff --git a/new b/new
-new file mode 100755
---- /dev/null
-+++ b/new
-@@ -0,0 +1,1 @@
-+foo
-copy file
-
-diff --git a/new b/copy
-copy from new
-copy to copy
-popping copy
-now at: new
-applying copy
-now at: copy
-diff --git a/new b/copy
-copy from new
-copy to copy
-diff --git a/new b/copy
-copy from new
-copy to copy
-% test file addition in slow path
-1 files updated, 0 files merged, 2 files removed, 0 files unresolved
-created new head
-2 files updated, 0 files merged, 1 files removed, 0 files unresolved
-diff --git a/bar b/bar
-new file mode 100644
---- /dev/null
-+++ b/bar
-@@ -0,0 +1,1 @@
-+bar
-diff --git a/foo b/baz
-rename from foo
-rename to baz
-2 baz (foo)
-diff --git a/bar b/bar
-new file mode 100644
---- /dev/null
-+++ b/bar
-@@ -0,0 +1,1 @@
-+bar
-diff --git a/foo b/baz
-rename from foo
-rename to baz
-2 baz (foo)
-diff --git a/bar b/bar
-diff --git a/foo b/baz
-% test file move chains in the slow path
-1 files updated, 0 files merged, 2 files removed, 0 files unresolved
-2 files updated, 0 files merged, 1 files removed, 0 files unresolved
-diff --git a/foo b/bleh
-rename from foo
-rename to bleh
-diff --git a/quux b/quux
-new file mode 100644
---- /dev/null
-+++ b/quux
-@@ -0,0 +1,1 @@
-+bar
-3 bleh (foo)
-diff --git a/foo b/barney
-rename from foo
-rename to barney
-diff --git a/fred b/fred
-new file mode 100644
---- /dev/null
-+++ b/fred
-@@ -0,0 +1,1 @@
-+bar
-3 barney (foo)
-% refresh omitting an added file
-C newfile
-A newfile
-popping baz
-now at: bar
-% create a git patch
-diff --git a/alexander b/alexander
-% create a git binary patch
-8ba2a2f3e77b55d03051ff9c24ad65e7 bucephalus
-diff --git a/bucephalus b/bucephalus
-% check binary patches can be popped and pushed
-popping addbucephalus
-now at: addalexander
-applying addbucephalus
-now at: addbucephalus
-8ba2a2f3e77b55d03051ff9c24ad65e7 bucephalus
-% strip again
-1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-created new head
-merging foo
-0 files updated, 1 files merged, 0 files removed, 0 files unresolved
-(branch merge, don't forget to commit)
-changeset: 3:99615015637b
-tag: tip
-parent: 2:20cbbe65cff7
-parent: 1:d2871fc282d4
-user: test
-date: Thu Jan 01 00:00:00 1970 +0000
-summary: merge
-
-changeset: 2:20cbbe65cff7
-parent: 0:53245c60e682
-user: test
-date: Thu Jan 01 00:00:00 1970 +0000
-summary: change foo 2
-
-changeset: 1:d2871fc282d4
-user: test
-date: Thu Jan 01 00:00:00 1970 +0000
-summary: change foo 1
-
-changeset: 0:53245c60e682
-user: test
-date: Thu Jan 01 00:00:00 1970 +0000
-summary: add foo
-
-1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-saved backup bundle to
-changeset: 1:20cbbe65cff7
-tag: tip
-user: test
-date: Thu Jan 01 00:00:00 1970 +0000
-summary: change foo 2
-
-changeset: 0:53245c60e682
-user: test
-date: Thu Jan 01 00:00:00 1970 +0000
-summary: add foo
-
-% qclone
-abort: versioned patch repository not found (see init --mq)
-adding .hg/patches/patch1
-main repo:
- rev 1: change foo
- rev 0: add foo
-patch repo:
- rev 0: checkpoint
-updating to branch default
-3 files updated, 0 files merged, 0 files removed, 0 files unresolved
-1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-main repo:
- rev 0: add foo
-patch repo:
- rev 0: checkpoint
-popping patch1
-patch queue now empty
-main repo:
- rev 0: add foo
-patch repo:
- rev 0: checkpoint
-updating to branch default
-3 files updated, 0 files merged, 0 files removed, 0 files unresolved
-1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-main repo:
- rev 0: add foo
-patch repo:
- rev 0: checkpoint
-% test applying on an empty file (issue 1033)
-adding a
-popping changea
-patch queue now empty
-applying changea
-now at: changea
-% test qpush with --force, issue1087
-adding bye.txt
-adding hello.txt
-popping empty
-patch queue now empty
-% qpush should fail, local changes
-abort: local changes found, refresh first
-% apply force, should not discard changes with empty patch
-applying empty
-patch empty is empty
-now at: empty
-diff -r bf5fc3f07a0a hello.txt
---- a/hello.txt
-+++ b/hello.txt
-@@ -1,1 +1,2 @@
- hello
-+world
-diff -r 9ecee4f634e3 hello.txt
---- a/hello.txt
-+++ b/hello.txt
-@@ -1,1 +1,2 @@
- hello
-+world
-changeset: 1:bf5fc3f07a0a
-tag: empty
-tag: qbase
-tag: qtip
-tag: tip
-user: test
-date: Thu Jan 01 00:00:00 1970 +0000
-summary: imported patch empty
-
-
-popping empty
-patch queue now empty
-% qpush should fail, local changes
-abort: local changes found, refresh first
-% apply force, should discard changes in hello, but not bye
-applying empty
-now at: empty
-M bye.txt
-diff -r ba252371dbc1 bye.txt
---- a/bye.txt
-+++ b/bye.txt
-@@ -1,1 +1,2 @@
- bye
-+universe
-diff -r 9ecee4f634e3 bye.txt
---- a/bye.txt
-+++ b/bye.txt
-@@ -1,1 +1,2 @@
- bye
-+universe
-diff -r 9ecee4f634e3 hello.txt
---- a/hello.txt
-+++ b/hello.txt
-@@ -1,1 +1,3 @@
- hello
-+world
-+universe
-% test popping revisions not in working dir ancestry
-0 A empty
-1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-popping empty
-patch queue now empty
-% test popping must remove files added in subdirectories first
-popping rename-dir
-patch queue now empty
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-mq.t Sun Aug 15 21:41:45 2010 +0900
@@ -0,0 +1,1359 @@
+ $ . $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
+
+
+help
+
+ $ hg help mq
+ mq extension - manage a stack of patches
+
+ This extension lets you work with a stack of patches in a Mercurial
+ repository. It manages two stacks of patches - all known patches, and applied
+ patches (subset of known patches).
+
+ Known patches are represented as patch files in the .hg/patches directory.
+ Applied patches are both patch files and changesets.
+
+ Common tasks (use "hg help command" for more details):
+
+ create new patch qnew
+ import existing patch qimport
+
+ print patch series qseries
+ print applied patches qapplied
+
+ add known patch to applied stack qpush
+ remove patch from applied stack qpop
+ refresh contents of top applied patch qrefresh
+
+ By default, mq will automatically use git patches when required to avoid
+ losing file mode changes, copy records, binary files or empty files creations
+ or deletions. This behaviour can be configured with:
+
+ [mq]
+ git = auto/keep/yes/no
+
+ If set to 'keep', mq will obey the [diff] section configuration while
+ preserving existing git patches upon qrefresh. If set to 'yes' or 'no', mq
+ will override the [diff] section and always generate git or regular patches,
+ possibly losing data in the second case.
+
+ You will by default be managing a patch queue named "patches". You can create
+ other, independent patch queues with the "hg qqueue" command.
+
+ list of commands:
+
+ qapplied print the patches already applied
+ qclone clone main and patch repository at same time
+ qdelete remove patches from queue
+ qdiff diff of the current patch and subsequent modifications
+ qfinish move applied patches into repository history
+ qfold fold the named patches into the current patch
+ qgoto push or pop patches until named patch is at top of stack
+ qguard set or print guards for a patch
+ qheader print the header of the topmost or specified patch
+ qimport import a patch
+ qnew create a new patch
+ qnext print the name of the next patch
+ qpop pop the current patch off the stack
+ qprev print the name of the previous patch
+ qpush push the next patch onto the stack
+ qqueue manage multiple patch queues
+ qrefresh update the current patch
+ qrename rename a patch
+ qselect set or print guarded patches to push
+ qseries print the entire series file
+ qtop print the name of the current patch
+ qunapplied print the patches not yet applied
+ strip strip changesets and all their descendants from the repository
+
+ use "hg -v help mq" to show aliases and global options
+
+ $ hg init a
+ $ cd a
+ $ echo a > a
+ $ hg ci -Ama
+ adding a
+
+ $ hg clone . ../k
+ updating to branch default
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ mkdir b
+ $ echo z > b/z
+ $ hg ci -Ama
+ adding b/z
+
+
+qinit
+
+ $ hg qinit
+
+ $ cd ..
+ $ hg init b
+
+
+-R qinit
+
+ $ hg -R b qinit
+
+ $ hg init c
+
+
+qinit -c
+
+ $ hg --cwd c qinit -c
+ $ hg -R c/.hg/patches st
+ A .hgignore
+ A series
+
+
+qinit; qinit -c
+
+ $ hg init d
+ $ cd d
+ $ hg qinit
+ $ hg qinit -c
+
+qinit -c should create both files if they don't exist
+
+ $ cat .hg/patches/.hgignore
+ ^\.hg
+ ^\.mq
+ syntax: glob
+ status
+ guards
+ $ cat .hg/patches/series
+ $ hg qinit -c
+ abort: repository .* already exists!
+ $ cd ..
+
+ $ echo '% qinit; <stuff>; qinit -c'
+ % 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
+ adding .hg/patches/A
+ adding .hg/patches/B
+ $ hg -R .hg/patches status
+ A .hgignore
+ A A
+ A B
+ A series
+
+qinit -c shouldn't touch these files if they already exist
+
+ $ cat .hg/patches/.hgignore
+ status
+ bleh
+ $ cat .hg/patches/series
+ A
+ B
+
+status --mq with color (issue2096)
+
+ $ hg status --mq --config extensions.color= --color=always
+ [0;32;1mA .hgignore[0m
+ [0;32;1mA A[0m
+ [0;32;1mA B[0m
+ [0;32;1mA series[0m
+ $ cd ..
+
+
+init --mq without repo
+
+ $ mkdir f
+ $ cd f
+ $ hg init --mq
+ abort: There is no Mercurial repository here (.hg not found)
+ $ cd ..
+
+init --mq with repo path
+
+ $ hg init g
+ $ hg init --mq g
+ $ test -d g/.hg/patches/.hg && echo "ok" || echo "failed"
+ ok
+
+init --mq with nonexistent directory
+
+ $ hg init --mq nonexistentdir
+ abort: repository nonexistentdir not found!
+
+
+init --mq with bundle (non "local")
+
+ $ hg -R a bundle --all a.bundle >/dev/null
+ $ hg init --mq a.bundle
+ abort: only a local queue repository may be initialized
+
+ $ cd a
+
+ $ hg qnew -m 'foo bar' test.patch
+
+ $ echo '# comment' > .hg/patches/series.tmp
+ $ echo >> .hg/patches/series.tmp # empty line
+ $ cat .hg/patches/series >> .hg/patches/series.tmp
+ $ mv .hg/patches/series.tmp .hg/patches/series
+
+
+qrefresh
+
+ $ echo a >> a
+ $ hg qrefresh
+ $ cat .hg/patches/test.patch
+ foo bar
+
+ diff -r [a-f0-9]* a
+ --- a/a\t(?P<date>.*)
+ \+\+\+ b/a\t(?P<date2>.*)
+ @@ -1,1 +1,2 @@
+ a
+ +a
+
+empty qrefresh
+
+ $ hg qrefresh -X a
+
+revision:
+
+ $ hg diff -r -2 -r -1
+
+patch:
+
+ $ cat .hg/patches/test.patch
+ foo bar
+
+
+working dir diff:
+
+ $ hg diff --nodates -q
+ --- a/a
+ +++ b/a
+ @@ -1,1 +1,2 @@
+ a
+ +a
+
+restore things
+
+ $ hg qrefresh
+ $ checkundo qrefresh
+
+
+qpop
+
+ $ hg qpop
+ popping test.patch
+ patch queue now empty
+ $ checkundo qpop
+
+
+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
+
+.hg/tags.cache (pre qpush):
+
+ $ cat .hg/tags.cache
+ 1 [\da-f]{40}
+
+ $ hg qpush
+ applying test.patch
+ now at: test.patch
+ $ hg tags > /dev/null
+
+.hg/tags.cache (post qpush):
+
+ $ cat .hg/tags.cache
+ 2 [\da-f]{40}
+
+ $ checkundo qpush
+ $ cd ..
+
+
+pop/push outside repo
+ $ hg -R a qpop
+ popping test.patch
+ patch queue now empty
+ $ hg -R a qpush
+ applying test.patch
+ now at: test.patch
+
+ $ cd a
+ $ hg qnew test2.patch
+
+qrefresh in subdir
+
+ $ cd b
+ $ echo a > a
+ $ hg add a
+ $ hg qrefresh
+
+pop/push -a in subdir
+
+ $ hg qpop -a
+ popping test2.patch
+ popping test.patch
+ patch queue now empty
+ $ hg --traceback qpush -a
+ applying test.patch
+ applying test2.patch
+ now at: test2.patch
+
+
+setting columns & formatted tests truncating (issue1912)
+
+ $ COLUMNS=4 hg qseries --config ui.formatted=true
+ test.patch
+ test2.patch
+ $ COLUMNS=20 hg qseries --config ui.formatted=true -vs
+ 0 A test.patch: f...
+ 1 A test2.patch:
+ $ hg qpop
+ popping test2.patch
+ now at: test.patch
+ $ hg qseries -vs
+ 0 A test.patch: foo bar
+ 1 U test2.patch:
+ $ hg sum | grep mq
+ mq: 1 applied, 1 unapplied
+ $ hg qpush
+ applying test2.patch
+ now at: test2.patch
+ $ hg sum | grep mq
+ mq: 2 applied
+ $ hg qapplied
+ test.patch
+ test2.patch
+ $ hg qtop
+ test2.patch
+
+
+prev
+
+ $ hg qapp -1
+ test.patch
+
+next
+
+ $ hg qunapp -1
+ all patches applied
+
+ $ hg qpop
+ popping test2.patch
+ now at: test.patch
+
+commit should fail
+
+ $ hg commit
+ abort: cannot commit over an applied mq patch
+
+push should fail
+
+ $ hg push ../../k
+ pushing to ../../k
+ abort: source has mq patches applied
+
+
+import should fail
+
+ $ hg st .
+ $ echo foo >> ../a
+ $ hg diff > ../../import.diff
+ $ hg revert --no-backup ../a
+ $ hg import ../../import.diff
+ abort: cannot import over an applied patch
+ $ hg st
+
+import --no-commit should succeed
+
+ $ hg import --no-commit ../../import.diff
+ applying ../../import.diff
+ $ hg st
+ M a
+ $ hg revert --no-backup ../a
+
+
+qunapplied
+
+ $ hg qunapplied
+ test2.patch
+
+
+qpush/qpop with index
+
+ $ hg qnew test1b.patch
+ $ echo 1b > 1b
+ $ hg add 1b
+ $ hg qrefresh
+ $ hg qpush 2
+ applying test2.patch
+ now at: test2.patch
+ $ hg qpop 0
+ popping test2.patch
+ popping test1b.patch
+ now at: test.patch
+ $ hg qpush test.patch+1
+ applying test1b.patch
+ now at: test1b.patch
+ $ hg qpush test.patch+2
+ applying test2.patch
+ now at: test2.patch
+ $ hg qpop test2.patch-1
+ popping test2.patch
+ now at: test1b.patch
+ $ hg qpop test2.patch-2
+ popping test1b.patch
+ now at: test.patch
+ $ hg qpush test1b.patch+1
+ applying test1b.patch
+ applying test2.patch
+ now at: test2.patch
+
+
+qpush --move
+
+ $ hg qpop -a
+ popping test2.patch
+ popping test1b.patch
+ popping test.patch
+ patch queue now empty
+ $ hg qguard test1b.patch -- -negguard
+ $ hg qguard test2.patch -- +posguard
+ $ hg qpush --move test2.patch # can't move guarded patch
+ cannot push 'test2.patch' - guarded by ['+posguard']
+ $ hg qselect posguard
+ number of unguarded, unapplied patches has changed from 2 to 3
+ $ hg qpush --move test2.patch # move to front
+ applying test2.patch
+ now at: test2.patch
+ $ hg qpush --move test1b.patch # negative guard unselected
+ applying test1b.patch
+ now at: test1b.patch
+ $ hg qpush --move test.patch # noop move
+ applying test.patch
+ now at: test.patch
+ $ hg qseries -v
+ 0 A test2.patch
+ 1 A test1b.patch
+ 2 A test.patch
+ $ hg qpop -a
+ popping test.patch
+ popping test1b.patch
+ popping test2.patch
+ patch queue now empty
+
+cleaning up
+
+ $ hg qselect --none
+ guards deactivated
+ number of unguarded, unapplied patches has changed from 3 to 2
+ $ hg qguard --none test1b.patch
+ $ hg qguard --none test2.patch
+ $ hg qpush --move test.patch
+ applying test.patch
+ now at: test.patch
+ $ hg qpush --move test1b.patch
+ applying test1b.patch
+ now at: test1b.patch
+ $ hg qpush --move bogus # nonexistent patch
+ abort: patch bogus not in series
+ $ hg qpush --move # no patch
+ abort: please specify the patch to move
+ $ hg qpush --move test.patch # already applied
+ abort: cannot push to a previous patch: test.patch
+ $ hg qpush
+ applying test2.patch
+ now at: test2.patch
+
+
+series after move
+
+ $ cat `hg root`/.hg/patches/series
+ test.patch
+ test1b.patch
+ test2.patch
+ # comment
+
+
+
+pop, qapplied, qunapplied
+
+ $ hg qseries -v
+ 0 A test.patch
+ 1 A test1b.patch
+ 2 A test2.patch
+
+qapplied -1 test.patch
+
+ $ hg qapplied -1 test.patch
+ only one patch applied
+
+qapplied -1 test1b.patch
+
+ $ hg qapplied -1 test1b.patch
+ test.patch
+
+qapplied -1 test2.patch
+
+ $ hg qapplied -1 test2.patch
+ test1b.patch
+
+qapplied -1
+
+ $ hg qapplied -1
+ test1b.patch
+
+qapplied
+
+ $ hg qapplied
+ test.patch
+ test1b.patch
+ test2.patch
+
+qapplied test1b.patch
+
+ $ hg qapplied test1b.patch
+ test.patch
+ test1b.patch
+
+qunapplied -1
+
+ $ hg qunapplied -1
+ all patches applied
+
+qunapplied
+
+ $ hg qunapplied
+
+popping
+
+ $ hg qpop
+ popping test2.patch
+ now at: test1b.patch
+
+qunapplied -1
+
+ $ hg qunapplied -1
+ test2.patch
+
+qunapplied
+
+ $ hg qunapplied
+ test2.patch
+
+qunapplied test2.patch
+
+ $ hg qunapplied test2.patch
+
+qunapplied -1 test2.patch
+
+ $ hg qunapplied -1 test2.patch
+ all patches applied
+
+popping -a
+
+ $ hg qpop -a
+ popping test1b.patch
+ popping test.patch
+ patch queue now empty
+
+qapplied
+
+ $ hg qapplied
+
+qapplied -1
+
+ $ hg qapplied -1
+ no patches applied
+ $ hg qpush
+ applying test.patch
+ now at: test.patch
+
+
+push should succeed
+
+ $ hg qpop -a
+ popping test.patch
+ patch queue now empty
+ $ hg push ../../k
+ pushing to ../../k
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+
+
+qpush/qpop error codes
+
+ $ errorcode()
+ > {
+ > hg "$@" && echo " $@ succeeds" || echo " $@ fails"
+ > }
+
+
+we want to start with some patches applied
+
+ $ hg qpush -a
+ applying test.patch
+ applying test1b.patch
+ applying test2.patch
+ now at: test2.patch
+
+% pops all patches and succeeds
+
+ $ errorcode qpop -a
+ popping test2.patch
+ popping test1b.patch
+ popping test.patch
+ patch queue now empty
+ qpop -a succeeds
+
+% does nothing and succeeds
+
+ $ errorcode qpop -a
+ no patches applied
+ qpop -a succeeds
+
+% fails - nothing else to pop
+
+ $ errorcode qpop
+ no patches applied
+ qpop fails
+
+% pushes a patch and succeeds
+
+ $ errorcode qpush
+ applying test.patch
+ now at: test.patch
+ qpush succeeds
+
+% pops a patch and succeeds
+
+ $ errorcode qpop
+ popping test.patch
+ patch queue now empty
+ qpop succeeds
+
+% pushes up to test1b.patch and succeeds
+
+ $ errorcode qpush test1b.patch
+ applying test.patch
+ applying test1b.patch
+ now at: test1b.patch
+ qpush test1b.patch succeeds
+
+% does nothing and succeeds
+
+ $ errorcode qpush test1b.patch
+ qpush: test1b.patch is already at the top
+ qpush test1b.patch succeeds
+
+% does nothing and succeeds
+
+ $ errorcode qpop test1b.patch
+ qpop: test1b.patch is already at the top
+ qpop test1b.patch succeeds
+
+% fails - can't push to this patch
+
+ $ errorcode qpush test.patch
+ abort: cannot push to a previous patch: test.patch
+ qpush test.patch fails
+
+% fails - can't pop to this patch
+
+ $ errorcode qpop test2.patch
+ abort: patch test2.patch is not applied
+ qpop test2.patch fails
+
+% pops up to test.patch and succeeds
+
+ $ errorcode qpop test.patch
+ popping test1b.patch
+ now at: test.patch
+ qpop test.patch succeeds
+
+% pushes all patches and succeeds
+
+ $ errorcode qpush -a
+ applying test1b.patch
+ applying test2.patch
+ now at: test2.patch
+ qpush -a succeeds
+
+% does nothing and succeeds
+
+ $ errorcode qpush -a
+ all patches are currently applied
+ qpush -a succeeds
+
+% fails - nothing else to push
+
+ $ errorcode qpush
+ patch series already fully applied
+ qpush fails
+
+% does nothing and succeeds
+
+ $ errorcode qpush test2.patch
+ qpush: test2.patch is already at the top
+ qpush test2.patch succeeds
+
+
+
+strip
+
+ $ cd ../../b
+ $ echo x>x
+ $ hg ci -Ama
+ adding x
+ $ hg strip tip | hidebackup
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ saved backup bundle to
+ $ hg unbundle .hg/strip-backup/*
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ (run 'hg update' to get a working copy)
+
+
+strip with local changes, should complain
+
+ $ hg up
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo y>y
+ $ hg add y
+ $ hg strip tip | hidebackup
+ abort: local changes found
+
+--force strip with local changes
+
+ $ hg strip -f tip | hidebackup
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ saved backup bundle to
+
+
+cd b; hg qrefresh
+
+ $ hg init refresh
+ $ cd refresh
+ $ echo a > a
+ $ hg ci -Ama
+ adding a
+ $ hg qnew -mfoo foo
+ $ echo a >> a
+ $ hg qrefresh
+ $ mkdir b
+ $ cd b
+ $ echo f > f
+ $ hg add f
+ $ hg qrefresh
+ $ cat ../.hg/patches/foo
+ foo
+
+ diff -r cb9a9f314b8b a
+ --- a/a\t(?P<date>.*)
+ \+\+\+ b/a\t(?P<date>.*)
+ @@ -1,1 +1,2 @@
+ a
+ +a
+ diff -r cb9a9f314b8b b/f
+ --- /dev/null\t(?P<date>.*)
+ \+\+\+ b/b/f\t(?P<date>.*)
+ @@ -0,0 +1,1 @@
+ +f
+
+hg qrefresh .
+
+ $ hg qrefresh .
+ $ cat ../.hg/patches/foo
+ foo
+
+ diff -r cb9a9f314b8b b/f
+ --- /dev/null\t(?P<date>.*)
+ \+\+\+ b/b/f\t(?P<date>.*)
+ @@ -0,0 +1,1 @@
+ +f
+ $ hg status
+ M a
+
+
+qpush failure
+
+ $ cd ..
+ $ hg qrefresh
+ $ hg qnew -mbar bar
+ $ echo foo > foo
+ $ echo bar > bar
+ $ hg add foo bar
+ $ hg qrefresh
+ $ hg qpop -a
+ popping bar
+ popping foo
+ patch queue now empty
+ $ echo bar > foo
+ $ hg qpush -a
+ applying foo
+ applying bar
+ file foo already exists
+ 1 out of 1 hunks FAILED -- saving rejects to file foo.rej
+ patch failed, unable to continue (try -v)
+ patch failed, rejects left in working dir
+ errors during apply, please fix and refresh bar
+ $ hg st
+ ? foo
+ ? foo.rej
+
+
+mq tags
+
+ $ hg log --template '{rev} {tags}\n' -r qparent:qtip
+ 0 qparent
+ 1 foo qbase
+ 2 bar qtip tip
+
+
+bad node in status
+
+ $ hg qpop
+ popping bar
+ now at: foo
+ $ hg strip -qn tip
+ $ hg tip
+ changeset: 0:cb9a9f314b8b
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: a
+
+ $ hg branches
+ default 0:cb9a9f314b8b
+ $ hg qpop
+ no patches applied
+
+ $ 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
+ $ cat .hg/patches/new
+ new file
+
+ diff --git a/new b/new
+ new file mode 100755
+ --- /dev/null
+ +++ b/new
+ @@ -0,0 +1,1 @@
+ +foo
+
+ $ hg qnew -m'copy file' copy
+ $ hg cp new copy
+ $ hg qrefresh
+ $ cat .hg/patches/copy
+ copy file
+
+ diff --git a/new b/copy
+ copy from new
+ copy to copy
+
+ $ hg qpop
+ popping copy
+ now at: new
+ $ hg qpush
+ applying copy
+ now at: copy
+ $ hg qdiff
+ diff --git a/new b/copy
+ copy from new
+ copy to copy
+ $ cat >>$HGRCPATH <<EOF
+ > [diff]
+ > git = False
+ > EOF
+ $ hg qdiff --git
+ diff --git a/new b/copy
+ copy from new
+ copy to copy
+ $ cd ..
+
+
+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
+ 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ $ echo >> foo
+ $ hg ci -m 'change foo'
+ created new head
+ $ hg up -C 1
+ 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg qrefresh --git 2>&1 | grep -v 'saving bundle'
+ $ cat .hg/patches/bar
+ diff --git a/bar b/bar
+ new file mode 100644
+ --- /dev/null
+ +++ b/bar
+ @@ -0,0 +1,1 @@
+ +bar
+ diff --git a/foo b/baz
+ rename from foo
+ rename to baz
+ $ hg log -v --template '{rev} {file_copies}\n' -r .
+ 2 baz (foo)
+ $ hg qrefresh --git
+ $ cat .hg/patches/bar
+ diff --git a/bar b/bar
+ new file mode 100644
+ --- /dev/null
+ +++ b/bar
+ @@ -0,0 +1,1 @@
+ +bar
+ diff --git a/foo b/baz
+ rename from foo
+ rename to baz
+ $ hg log -v --template '{rev} {file_copies}\n' -r .
+ 2 baz (foo)
+ $ hg qrefresh
+ $ grep 'diff --git' .hg/patches/bar
+ diff --git a/bar b/bar
+ diff --git a/foo b/baz
+
+
+test file move chains in the slow path
+
+ $ hg up -C 1
+ 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ $ echo >> foo
+ $ hg ci -m 'change foo again'
+ $ hg up -C 2
+ 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg mv bar quux
+ $ hg mv baz bleh
+ $ hg qrefresh --git 2>&1 | grep -v 'saving bundle'
+ $ cat .hg/patches/bar
+ diff --git a/foo b/bleh
+ rename from foo
+ rename to bleh
+ diff --git a/quux b/quux
+ new file mode 100644
+ --- /dev/null
+ +++ b/quux
+ @@ -0,0 +1,1 @@
+ +bar
+ $ hg log -v --template '{rev} {file_copies}\n' -r .
+ 3 bleh (foo)
+ $ hg mv quux fred
+ $ hg mv bleh barney
+ $ hg qrefresh --git
+ $ cat .hg/patches/bar
+ diff --git a/foo b/barney
+ rename from foo
+ rename to barney
+ diff --git a/fred b/fred
+ new file mode 100644
+ --- /dev/null
+ +++ b/fred
+ @@ -0,0 +1,1 @@
+ +bar
+ $ hg log -v --template '{rev} {file_copies}\n' -r .
+ 3 barney (foo)
+
+
+refresh omitting an added file
+
+ $ hg qnew baz
+ $ echo newfile > newfile
+ $ hg add newfile
+ $ hg qrefresh
+ $ hg st -A newfile
+ C newfile
+ $ hg qrefresh -X newfile
+ $ hg st -A newfile
+ A newfile
+ $ hg revert newfile
+ $ rm newfile
+ $ hg qpop
+ popping baz
+ now at: bar
+ $ hg qdel baz
+
+
+create a git patch
+
+ $ echo a > alexander
+ $ hg add alexander
+ $ hg qnew -f --git addalexander
+ $ grep diff .hg/patches/addalexander
+ diff --git a/alexander b/alexander
+
+
+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
+ 8ba2a2f3e77b55d03051ff9c24ad65e7 bucephalus
+ $ hg add bucephalus
+ $ hg qnew -f --git addbucephalus
+ $ grep diff .hg/patches/addbucephalus
+ diff --git a/bucephalus b/bucephalus
+
+
+check binary patches can be popped and pushed
+
+ $ hg qpop
+ popping addbucephalus
+ now at: addalexander
+ $ test -f bucephalus && echo % bucephalus should not be there
+ $ hg qpush
+ applying addbucephalus
+ now at: addbucephalus
+ $ test -f bucephalus || echo % bucephalus should be there
+ $ python "$TESTDIR/md5sum.py" bucephalus
+ 8ba2a2f3e77b55d03051ff9c24ad65e7 bucephalus
+
+
+
+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
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo 1 >> foo
+ $ hg ci -m 'change foo 2'
+ created new head
+ $ HGMERGE=true hg merge
+ merging foo
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg ci -m merge
+ $ hg log
+ changeset: 3:99615015637b
+ tag: tip
+ parent: 2:20cbbe65cff7
+ parent: 1:d2871fc282d4
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: merge
+
+ changeset: 2:20cbbe65cff7
+ parent: 0:53245c60e682
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: change foo 2
+
+ changeset: 1:d2871fc282d4
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: change foo 1
+
+ changeset: 0:53245c60e682
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add foo
+
+ $ hg strip 1 | hidebackup
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ saved backup bundle to
+ $ checkundo strip
+ $ hg log
+ changeset: 1:20cbbe65cff7
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: change foo 2
+
+ changeset: 0:53245c60e682
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add foo
+
+ $ cd ..
+
+
+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
+ abort: versioned patch repository not found (see init --mq)
+
+ $ cd qclonesource
+ $ hg qinit -c
+ adding .hg/patches/patch1
+ $ hg qci -m checkpoint
+ $ qlog
+ main repo:
+ rev 1: change foo
+ rev 0: add foo
+ patch repo:
+ rev 0: checkpoint
+ $ cd ..
+
+
+repo with patches applied
+
+ $ hg qclone qclonesource qclonedest
+ updating to branch default
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd qclonedest
+ $ qlog
+ main repo:
+ rev 0: add foo
+ patch repo:
+ rev 0: checkpoint
+ $ cd ..
+
+
+repo with patches unapplied
+
+ $ cd qclonesource
+ $ hg qpop -a
+ popping patch1
+ patch queue now empty
+ $ qlog
+ main repo:
+ rev 0: add foo
+ patch repo:
+ rev 0: checkpoint
+ $ cd ..
+ $ hg qclone qclonesource qclonedest2
+ updating to branch default
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd qclonedest2
+ $ qlog
+ main repo:
+ rev 0: add foo
+ patch repo:
+ rev 0: checkpoint
+ $ cd ..
+
+
+test applying on an empty file (issue 1033)
+
+ $ hg init empty
+ $ cd empty
+ $ touch a
+ $ hg ci -Am addempty
+ adding a
+ $ echo a > a
+ $ hg qnew -f -e changea
+ $ hg qpop
+ popping changea
+ patch queue now empty
+ $ hg qpush
+ applying changea
+ now at: changea
+ $ cd ..
+
+
+test qpush with --force, issue1087
+
+ $ hg init forcepush
+ $ cd forcepush
+ $ echo hello > hello.txt
+ $ echo bye > bye.txt
+ $ hg ci -Ama
+ adding bye.txt
+ adding hello.txt
+ $ hg qnew -d '0 0' empty
+ $ hg qpop
+ popping empty
+ patch queue now empty
+ $ echo world >> hello.txt
+
+
+qpush should fail, local changes
+
+ $ hg qpush
+ abort: local changes found, refresh first
+
+
+apply force, should not discard changes with empty patch
+
+ $ hg qpush -f
+ applying empty
+ patch empty is empty
+ now at: empty
+ $ hg diff --config diff.nodates=True
+ diff -r bf5fc3f07a0a hello.txt
+ --- a/hello.txt
+ +++ b/hello.txt
+ @@ -1,1 +1,2 @@
+ hello
+ +world
+ $ hg qdiff --config diff.nodates=True
+ diff -r 9ecee4f634e3 hello.txt
+ --- a/hello.txt
+ +++ b/hello.txt
+ @@ -1,1 +1,2 @@
+ hello
+ +world
+ $ hg log -l1 -p
+ changeset: 1:bf5fc3f07a0a
+ tag: empty
+ tag: qbase
+ tag: qtip
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: imported patch empty
+
+
+ $ hg qref -d '0 0'
+ $ hg qpop
+ popping empty
+ patch queue now empty
+ $ echo universe >> hello.txt
+ $ echo universe >> bye.txt
+
+
+qpush should fail, local changes
+
+ $ hg qpush
+ abort: local changes found, refresh first
+
+
+apply force, should discard changes in hello, but not bye
+
+ $ hg qpush -f
+ applying empty
+ now at: empty
+ $ hg st
+ M bye.txt
+ $ hg diff --config diff.nodates=True
+ diff -r ba252371dbc1 bye.txt
+ --- a/bye.txt
+ +++ b/bye.txt
+ @@ -1,1 +1,2 @@
+ bye
+ +universe
+ $ hg qdiff --config diff.nodates=True
+ diff -r 9ecee4f634e3 bye.txt
+ --- a/bye.txt
+ +++ b/bye.txt
+ @@ -1,1 +1,2 @@
+ bye
+ +universe
+ diff -r 9ecee4f634e3 hello.txt
+ --- a/hello.txt
+ +++ b/hello.txt
+ @@ -1,1 +1,3 @@
+ hello
+ +world
+ +universe
+
+
+test popping revisions not in working dir ancestry
+
+ $ hg qseries -v
+ 0 A empty
+ $ hg up qparent
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg qpop
+ popping empty
+ patch queue now empty
+
+ $ 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
+
+
+test popping must remove files added in subdirectories first
+
+ $ hg qpop
+ popping rename-dir
+ patch queue now empty
+ $ cd ..
+