[PATCH 9 of 9 phases] phases: implement dirstate part of the phase command

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


# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at ens-lyon.org>
# Date 1325725258 -3600
# Node ID a84c0f8890a475fbc67b1548381d580a4d8031bb
# Parent  d7e18f0d70562c9094defe092df611ceb970a651
phases: implement dirstate part of the phase command

diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -4259,26 +4259,52 @@
     # look for specified revision
     revs = list(revs)
     revs.extend(opts['rev'])
-    if not revs:
-        raise NotImplementedError('working directory phase not implemented '
-                                  'yet')
+
+    if opts['clean']:
+        if revs:
+            raise util.Abort('can not Clear revision data')
+        if targetphase is not None:
+            raise util.Abort('can not specify both --clear and phase movement')
+        lock = repo.lock()
+        try:
+            repo.dirstate.setphase(None)
+        finally:
+            lock.release()
+        return 0
+
+
     lock = None
     if targetphase is None:
         # display
-        for ctx in repo.set('%lr', revs):
-            ui.write('%i: %s\n' % (ctx.rev(), ctx.phasestr()))
+        if revs:
+            for ctx in repo.set('%lr', revs):
+                ui.write('%i: %s\n' % (ctx.rev(), ctx.phasestr()))
+        else:
+            phase, pfrom = phasesmod.dirstatephase(repo)
+            ui.write('%s' % (phasesmod.phasenames[phase]))
+            # inclusion of pfrom is intentional, four distinct translation will
+            # probably be better.
+            ui.status(_(' (from %s)') % pfrom)
+            ui.write('\n')
+
     else:
-        lock = repo.lock()
+        lock = None
         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)
+            if revs:
+                lock = repo.lock()
+                # 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)
+            else:
+                lock = repo.wlock()
+                repo.dirstate.setphase(targetphase, opts['force'])
         finally:
-            lock.release()
+            if lock is not None:
+                lock.release()
 
 
 def postincoming(ui, repo, modheads, optupdate, checkout):
diff --git a/tests/test-phases.t b/tests/test-phases.t
--- a/tests/test-phases.t
+++ b/tests/test-phases.t
@@ -260,3 +260,71 @@
   |
   o  0 public A
   
+look at next commit phase
+
+(on secret parent)
+
+  $ hg phase -r .
+  7: secret
+  $ hg phase
+  secret (from parents)
+
+(on draft parent)
+
+  $ hg up 6 -q
+  $ hg phase -r .
+  6: draft
+  $ hg phase
+  draft (from parents)
+
+(on public parent)
+  $ hg up 0 -q
+  $ hg phase -r .
+  0: public
+  $ hg phase
+  draft (from default)
+
+Setting phase
+
+(set secret)
+
+  $ hg phase --secret
+  $ hg phase
+  secret (from dirstate)
+
+  $ mkcommit 'Made Secret on Public' -q
+  $ hg phase -r .
+  8: secret
+
+(set lower phase)
+
+  $ hg up -q 7
+  $ hg phase --draft
+  $ hg phase
+  secret (from parents)
+
+
+(force)
+((and test that data is purged on update))
+
+  $ hg up -q 2
+  $ hg phase --public --force
+  $ hg phase
+  public (from forced)
+
+  $ mkcommit 'Forced as Public' -q
+  $ hglog -r 'public()'
+  0 0 A
+  1 0 B
+  2 0 C
+  9 0 Forced as Public
+
+(clean)
+
+  $ hg up -q 3
+  $ hg phase --public --force
+  $ hg phase
+  public (from forced)
+  $ hg phase --clean
+  $ hg phase
+  draft (from parents)


More information about the Mercurial-devel mailing list