[PATCH 9 of 9 phases] phases: implement dirstate part of the phase command
Pierre-Yves David
pierre-yves.david at ens-lyon.org
Thu Jan 5 01:25:46 UTC 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