Mercurial > hg
changeset 11894:a15936ac7ec5
tests: unify test-mq
author | Nicolas Dumazet <nicdumz.commits@gmail.com> |
---|---|
date | Sun, 15 Aug 2010 21:41:45 +0900 |
parents | aa50d07208d2 |
children | 78e3a70c4445 |
files | tests/test-mq tests/test-mq.out tests/test-mq.t |
diffstat | 3 files changed, 1359 insertions(+), 1295 deletions(-) [+] |
line wrap: on
line diff
--- 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 .. +