[PATCH 3 of 9 phases] phases: add a phases command to display and manipulate phases

Pierre-Yves David pierre-yves.david at ens-lyon.org
Wed Jan 4 19:25:40 CST 2012


# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at ens-lyon.org>
# Date 1325725909 -3600
# Node ID a05126892848ccaaf8b94a23b91776c6530b85bf
# Parent  6b569ff0bd5dbe065e6f10bdd0c008a1039ce79b
phases: add a phases command to display and manipulate phases

This changeset only introduce changeset related code. working directory related
one will the added by a later commit.

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,75 @@
                 ui.write("%s\n" % name)
             else:
                 ui.write("%s = %s\n" % (name, util.hidepassword(path)))
+ at command('^phases',
+    [('p', 'public', False, _('Set changeset to public')),
+     ('d', 'draft', False, _('Set changeset to draft')),
+     ('s', 'secret', False, _('Set changeset to secret')),
+     ('C', 'clean', False, _('Clear phase data for the next commit')),
+     ('f', 'force', False, _('allow to move boundary backward')),
+     ('r', 'rev', [], _('target revision')),
+    ],
+    _('[-p|-d|-s] [-f] [-C] [-r] [REV]'))
+def phases(ui, repo, *revs, **opts):
+    """set or show the current phase name
+
+    See :hg:`help phase-concept` for more information about phases if you are
+    not familliar with this concept.
+
+    With no argument, show the phase name of specified revision or of the next
+    commit when no revision is provided.
+
+    With on one of `--public`, `--draft` or `--secret`, change the phase value.
+
+    Setting the phase of working directory will change the phase of the next
+    commit.
+
+    .. note:: By default a commit will be at least in a the ``draft`` phase.
+              This default value may be altered with the phases.new-commit
+              option.
+
+    Unless -f/--force is specified, phase will never let you move phase in an
+    unusual direction: Phase are ordered  public as follow < draft < secret.
+    Existing changeset will not move from a lower phase to an higher phase.
+    Working directory phase won't be set a in revision lower than the phase of
+    the working directory parents.
+
+
+    Use -C/--clean to reset the working directory branch phase to it's default
+    value. In all case phase of the working directory is lost on update.
+    """
+    # 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
+   phases     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
+   phases     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
+   phases     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
+ phases     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
+  phases
   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
+  phases: public, draft, secret, clean, 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
+   phases       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
+   phases       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
+   phases     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
+   phases     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
+   phases       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
+   phases       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
+   phases:
+        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
+   phases     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
+   phases     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
+   phases       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
@@ -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
+   phases     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