[PATCH 7 of 9 phases] phases: add a phases command to display and manipulate phases
Pierre-Yves David
pierre-yves.david at ens-lyon.org
Sun Jan 8 09:31:00 CST 2012
# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at ens-lyon.org>
# Date 1325950301 -3600
# Node ID 3ac4298bdf2b3116d48e2aa3b57267fc4d0a2aef
# Parent 0c848dca7bea331a24180eeda7e2d6f3905e81a2
phases: add a phases command to display and manipulate phases
diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -18,6 +18,7 @@
import minirst, revset, fileset
import dagparser, context, simplemerge
import random, setdiscovery, treediscovery, dagutil
+import phases as phasesmod
table = {}
@@ -4210,6 +4211,61 @@
ui.write("%s\n" % name)
else:
ui.write("%s = %s\n" % (name, util.hidepassword(path)))
+ at command('^phase',
+ [('p', 'public', False, _('Set changeset to public')),
+ ('d', 'draft', False, _('Set changeset to draft')),
+ ('s', 'secret', False, _('Set changeset to secret')),
+ ('f', 'force', False, _('allow to move boundary backward')),
+ ('r', 'rev', [], _('target revision')),
+ ],
+ _('[-p|-d|-s] [-f] [-C] [-r] REV'))
+def phase(ui, repo, *revs, **opts):
+ """set or show the current phase name
+
+ See :hg:`help phases` for more information about phases if you are
+ not familliar with this concept.
+
+ With no argument, show the phase name of specified revisions.
+
+ With on one of `--public`, `--draft` or `--secret`, change the phase value.
+
+ Unless -f/--force is specified, :hg:`phase` won't move changeset from a
+ lower phase to an higher phase. Phase are ordered as follow:
+
+ public < draft < secret.
+ """
+ # search for a unique phase argument
+ targetphase = None
+ for idx, name in enumerate(phasesmod.phasenames):
+ if opts[name]:
+ if targetphase is not None:
+ raise util.Abort('only one phase can be specified')
+ targetphase = idx
+
+ # look for specified revision
+ revs = list(revs)
+ revs.extend(opts['rev'])
+ if not revs:
+ raise NotImplementedError('working directory phase not implemented '
+ 'yet')
+ lock = None
+ if targetphase is None:
+ # display
+ for ctx in repo.set('%lr', revs):
+ ui.write('%i: %s\n' % (ctx.rev(), ctx.phasestr()))
+ else:
+ lock = repo.lock()
+ try:
+ # set phase
+ nodes = [ctx.node() for ctx in repo.set('%lr', revs)]
+ if not nodes:
+ raise util.Abort(_('empty revision set'))
+ phasesmod.advanceboundary(repo, targetphase, nodes)
+ if opts['force']:
+ phasesmod.retractboundary(repo, targetphase, nodes)
+ finally:
+ lock.release()
+
def postincoming(ui, repo, modheads, optupdate, checkout):
if modheads == 0:
diff --git a/tests/test-alias.t b/tests/test-alias.t
--- a/tests/test-alias.t
+++ b/tests/test-alias.t
@@ -334,6 +334,7 @@
init create a new repository in the given directory
log show revision history of entire repository or files
merge merge working directory with another revision
+ phase set or show the current phase name
pull pull changes from the specified source
push push changes to the specified destination
remove remove the specified files on the next commit
@@ -360,6 +361,7 @@
init create a new repository in the given directory
log show revision history of entire repository or files
merge merge working directory with another revision
+ phase set or show the current phase name
pull pull changes from the specified source
push push changes to the specified destination
remove remove the specified files on the next commit
@@ -386,6 +388,7 @@
init create a new repository in the given directory
log show revision history of entire repository or files
merge merge working directory with another revision
+ phase set or show the current phase name
pull pull changes from the specified source
push push changes to the specified destination
remove remove the specified files on the next commit
diff --git a/tests/test-commandserver.py.out b/tests/test-commandserver.py.out
--- a/tests/test-commandserver.py.out
+++ b/tests/test-commandserver.py.out
@@ -26,6 +26,7 @@
init create a new repository in the given directory
log show revision history of entire repository or files
merge merge working directory with another revision
+ phase set or show the current phase name
pull pull changes from the specified source
push push changes to the specified destination
remove remove the specified files on the next commit
diff --git a/tests/test-debugcomplete.t b/tests/test-debugcomplete.t
--- a/tests/test-debugcomplete.t
+++ b/tests/test-debugcomplete.t
@@ -32,6 +32,7 @@
outgoing
parents
paths
+ phase
pull
push
recover
@@ -198,6 +199,7 @@
init: ssh, remotecmd, insecure
log: follow, follow-first, date, copies, keyword, rev, removed, only-merges, user, only-branch, branch, prune, hidden, patch, git, limit, no-merges, stat, style, template, include, exclude
merge: force, rev, preview, tool
+ phase: public, draft, secret, force, rev
pull: update, force, rev, bookmark, branch, ssh, remotecmd, insecure
push: force, rev, bookmark, branch, new-branch, ssh, remotecmd, insecure
remove: after, force, include, exclude
diff --git a/tests/test-globalopts.t b/tests/test-globalopts.t
--- a/tests/test-globalopts.t
+++ b/tests/test-globalopts.t
@@ -311,6 +311,7 @@
outgoing show changesets not found in the destination
parents show the parents of the working directory or revision
paths show aliases for remote repositories
+ phase set or show the current phase name
pull pull changes from the specified source
push push changes to the specified destination
recover roll back an interrupted transaction
@@ -393,6 +394,7 @@
outgoing show changesets not found in the destination
parents show the parents of the working directory or revision
paths show aliases for remote repositories
+ phase set or show the current phase name
pull pull changes from the specified source
push push changes to the specified destination
recover roll back an interrupted transaction
diff --git a/tests/test-help.t b/tests/test-help.t
--- a/tests/test-help.t
+++ b/tests/test-help.t
@@ -15,6 +15,7 @@
init create a new repository in the given directory
log show revision history of entire repository or files
merge merge working directory with another revision
+ phase set or show the current phase name
pull pull changes from the specified source
push push changes to the specified destination
remove remove the specified files on the next commit
@@ -36,6 +37,7 @@
init create a new repository in the given directory
log show revision history of entire repository or files
merge merge working directory with another revision
+ phase set or show the current phase name
pull pull changes from the specified source
push push changes to the specified destination
remove remove the specified files on the next commit
@@ -81,6 +83,7 @@
outgoing show changesets not found in the destination
parents show the parents of the working directory or revision
paths show aliases for remote repositories
+ phase set or show the current phase name
pull pull changes from the specified source
push push changes to the specified destination
recover roll back an interrupted transaction
@@ -157,6 +160,7 @@
outgoing show changesets not found in the destination
parents show the parents of the working directory or revision
paths show aliases for remote repositories
+ phase set or show the current phase name
pull pull changes from the specified source
push push changes to the specified destination
recover roll back an interrupted transaction
@@ -225,6 +229,8 @@
show revision history of entire repository or files
merge:
merge working directory with another revision
+ phase:
+ set or show the current phase name
pull:
pull changes from the specified source
push:
@@ -541,6 +547,7 @@
init create a new repository in the given directory
log show revision history of entire repository or files
merge merge working directory with another revision
+ phase set or show the current phase name
pull pull changes from the specified source
push push changes to the specified destination
remove remove the specified files on the next commit
@@ -568,6 +575,7 @@
init create a new repository in the given directory
log show revision history of entire repository or files
merge merge working directory with another revision
+ phase set or show the current phase name
pull pull changes from the specified source
push push changes to the specified destination
remove remove the specified files on the next commit
@@ -643,6 +651,7 @@
outgoing show changesets not found in the destination
parents show the parents of the working directory or revision
paths show aliases for remote repositories
+ phase set or show the current phase name
pull pull changes from the specified source
push push changes to the specified destination
recover roll back an interrupted transaction
diff --git a/tests/test-phases.t b/tests/test-phases.t
--- a/tests/test-phases.t
+++ b/tests/test-phases.t
@@ -26,7 +26,7 @@
Draft commit are properly created over public one:
- $ hg pull -q . # XXX use the dedicated phase command once available
+ $ hg phase --public .
$ hglog
1 0 B
0 0 A
@@ -154,3 +154,109 @@
4 2 E
5 2 H
7 2 merge B' and E
+
+Test phase command
+===================
+
+initial picture
+
+ $ cat >> $HGRCPATH << EOF
+ > [extensions]
+ > hgext.graphlog=
+ > EOF
+ $ hg log -G --template "{rev} {phase} {desc}\n"
+ @ 7 secret merge B' and E
+ |\
+ | o 6 draft B'
+ | |
+ +---o 5 secret H
+ | |
+ o | 4 secret E
+ | |
+ o | 3 draft D
+ | |
+ o | 2 draft C
+ |/
+ o 1 public B
+ |
+ o 0 public A
+
+
+display changesets phase
+
+(mixing -r and plain rev specification)
+
+ $ hg phase 1::4 -r 7
+ 1: public
+ 2: draft
+ 3: draft
+ 4: secret
+ 7: secret
+
+
+move changeset forward
+
+(with -r option)
+
+ $ hg phase --public -r 2
+ $ hg log -G --template "{rev} {phase} {desc}\n"
+ @ 7 secret merge B' and E
+ |\
+ | o 6 draft B'
+ | |
+ +---o 5 secret H
+ | |
+ o | 4 secret E
+ | |
+ o | 3 draft D
+ | |
+ o | 2 public C
+ |/
+ o 1 public B
+ |
+ o 0 public A
+
+
+move changeset backward
+
+(without -r option)
+
+ $ hg phase --draft --force 2
+ $ hg log -G --template "{rev} {phase} {desc}\n"
+ @ 7 secret merge B' and E
+ |\
+ | o 6 draft B'
+ | |
+ +---o 5 secret H
+ | |
+ o | 4 secret E
+ | |
+ o | 3 draft D
+ | |
+ o | 2 draft C
+ |/
+ o 1 public B
+ |
+ o 0 public A
+
+
+move changeset forward and backward
+
+ $ hg phase --draft --force 1::4
+ $ hg log -G --template "{rev} {phase} {desc}\n"
+ @ 7 secret merge B' and E
+ |\
+ | o 6 draft B'
+ | |
+ +---o 5 secret H
+ | |
+ o | 4 draft E
+ | |
+ o | 3 draft D
+ | |
+ o | 2 draft C
+ |/
+ o 1 draft B
+ |
+ o 0 public A
+
diff --git a/tests/test-strict.t b/tests/test-strict.t
--- a/tests/test-strict.t
+++ b/tests/test-strict.t
@@ -26,6 +26,7 @@
init create a new repository in the given directory
log show revision history of entire repository or files
merge merge working directory with another revision
+ phase set or show the current phase name
pull pull changes from the specified source
push push changes to the specified destination
remove remove the specified files on the next commit
More information about the Mercurial-devel
mailing list