% help mq extension - patch management and development 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): prepare repository to work with patches qinit create new patch qnew import existing patch qimport print patch series qseries print applied patches qapplied print name of top applied patch qtop add known patch to applied stack qpush remove patch from applied stack qpop refresh contents of top applied patch qrefresh list of commands: qapplied print the patches already applied qclone clone main and patch repository at same time qcommit commit changes in the queue repository qdelete remove patches from queue qdiff diff of the current patch 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 qinit init a new queue repository 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 qrefresh update the current patch qrename rename a patch qrestore restore the queue state saved by a rev qsave save current queue state 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 a revision and all later revs on the same branch use "hg -v help mq" to show aliases and global options adding a 1 files updated, 0 files merged, 0 files removed, 0 files unresolved adding b/z % qinit % -R qinit % qinit -c A .hgignore A series % qnew implies add A .hgignore A series A test.patch % qinit; qinit -c .hgignore: syntax: glob status guards series: abort: repository already exists! % qinit; ; qinit -c adding .hg/patches/A adding .hg/patches/B A .hgignore A A A B A series .hgignore: status bleh series: A B % qnew -m foo bar % qrefresh foo bar diff -r xa --- a/a +++ b/a @@ -1,1 +1,2 @@ a a +a % empty qrefresh revision: patch: foo bar working dir diff: --- a/a +++ b/a @@ -1,1 +1,2 @@ a a +a % qpop Patch queue now empty % qpush applying test.patch Now at: test.patch % pop/push outside repo Patch queue now empty applying test.patch Now at: test.patch % qrefresh in subdir % pop/push -a in subdir Patch queue now empty applying test.patch applying test2.patch Now at: test2.patch % qseries test.patch test2.patch Now at: test.patch 0 A test.patch: foo bar 1 U test2.patch: applying test2.patch Now at: test2.patch % qapplied test.patch test2.patch % qtop test2.patch % qprev test.patch % qnext All patches applied % pop, qnext, qprev, qapplied Now at: test.patch test2.patch Only one patch applied 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 % qunapplied test2.patch % qpush/qpop with index applying test2.patch Now at: test2.patch Now at: test.patch applying test1b.patch Now at: test1b.patch applying test2.patch Now at: test2.patch Now at: test1b.patch Now at: test.patch applying test1b.patch applying test2.patch Now at: test2.patch % push should succeed 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 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 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 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 all patches are currently applied qpush test2.patch succeeds % strip adding x 0 files updated, 0 files merged, 1 files removed, 0 files unresolved saving 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) % cd b; hg qrefresh adding a foo diff -r cb9a9f314b8b a --- a/a +++ b/a @@ -1,1 +1,2 @@ a 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 Patch queue now empty applying foo applying bar 1 out of 1 hunk ignored -- 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 qbase foo 2 qtip bar tip 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 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 1 files updated, 0 files merged, 2 files removed, 0 files unresolved 2 files updated, 0 files merged, 1 files removed, 0 files unresolved adding branch adding changesets adding manifests adding file changes added 1 changesets with 1 changes to 1 files (run 'hg update' to get a working copy) Patch queue now empty applying bar Now at: 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 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 1 files updated, 0 files merged, 2 files removed, 0 files unresolved 2 files updated, 0 files merged, 1 files removed, 0 files unresolved adding branch adding changesets adding manifests adding file changes added 1 changesets with 1 changes to 1 files (run 'hg update' to get a working copy) Patch queue now empty applying bar Now at: 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 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) % strip again 1 files updated, 0 files merged, 0 files removed, 0 files unresolved 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 saving bundle to saving bundle to adding branch adding changesets adding manifests adding file changes added 1 changesets with 1 changes to 1 files (run 'hg update' to get a working copy) 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 main repo: rev 1: change foo rev 0: add foo patch repo: rev 0: checkpoint 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 Patch queue now empty main repo: rev 0: add foo patch repo: rev 0: checkpoint 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