mirror of
https://github.com/facebook/sapling.git
synced 2024-10-10 16:57:49 +03:00
8ae803be30
If paths are supplied but resolve to nothing, localrepo.commit() is called with an empty set and commits the whole dirstate. Avoid this by passing the match function to commit.
459 lines
10 KiB
Plaintext
459 lines
10 KiB
Plaintext
% 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; <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
|
|
% qnew with uncommitted changes
|
|
abort: local changes found, refresh first
|
|
A somefile
|
|
% qnew with uncommitted changes and missing file (issue 803)
|
|
someotherfile: No such file or directory
|
|
A somefile
|
|
issue803.patch
|
|
Patch queue now empty
|
|
% 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
|
|
file foo already exists
|
|
1 out of 1 hunk 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 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)
|
|
% refresh omitting an added file
|
|
C newfile
|
|
A newfile
|
|
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
|
|
Now at: addalexander
|
|
applying addbucephalus
|
|
Now at: addbucephalus
|
|
8ba2a2f3e77b55d03051ff9c24ad65e7 bucephalus
|
|
% 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
|
|
abort: versioned patch repository not found (see qinit -c)
|
|
adding .hg/patches/patch1
|
|
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
|