Commits

Pierre-Yves David committed 6b10897 Merge

current release is stable enought

Comments (0)

Files changed (20)

 f9d305deeff3dba782e65faf4ef3fd1569995859 2.1.0
 862b6b71a35836e81f090ba7229c2888e8ed2f9f 3.0.0
 cdb52bbbe5b8770d5e68943b7e73bee4ba136ecc 3.1.0
+c3ba8a965a7a173e388d84819e936ea9bae9797f 3.2.0
 include docs/static/*.svg
 include hgext/__init__.py
 include hgext/evolve.py
+include hgext/pushexperiment.py
 include setup.py
 include README
 include COPYING
 Changelog
 =========
 
+3.2.0 -- 2013-11-15
+
+- conform to the Mercurial custom of lowercase messages
+- added a small extension to experiment with obsolescence marker push
+- amend: drop the deprecated note option
+- amend: use core mechanism for amend (fix multiple bugs)
+- parents command: add "working directory parent is obsolete" message
+- evolve command: allow updating to the successor if the parent is
+  obsolete
+- gdown and gup commands: add next and previous alias, respectively
+- make grab aliases compatible with Mercurial 2.8
+- Tested with 2.6, 2.7 and 2.8
+
 3.1.0 -- 2013-02-11
 
 - amend: drop deprecated --change option for amend
+mercurial-evolve (3.2.0-1) UNRELEASED; urgency=low
+
+  * New upstream release.
+
+ -- Julien Cristau <julien.cristau@logilab.fr>  Tue, 04 Jun 2013 17:28:02 +0200
+
 mercurial-evolve (3.1.0-1) UNRELEASED; urgency=low
 
   * New upstream release.
  Pierre-Yves David <pierre-yves.david@logilab.fr>,
 Standards-Version: 3.9.3
 Build-Depends:
- mercurial (>=2.5~),
- mercurial-common (>=2.5~),
+ mercurial (>=2.6~),
  python,
  debhelper (>= 8),
  python-sphinx (>= 1.0.8),
 Depends:
  ${python:Depends},
  ${misc:Depends},
- mercurial (>= 2.5),
+ mercurial (>= 2.6),
 Description: evolve extension for Mercurial
  This package provides the experimental "evolve" extension for the Mercurial
  DVCS.
 #!/usr/bin/make -f
 
-%:
+clean %:
 	dh $@ --with python2 --buildsystem=python_distutils
 
 build:
 	dh build --with python2 --buildsystem=python_distutils
 	$(MAKE) -C docs
 
-.PHONY: build
-
 ifeq (,$(filter nocheck, $(DEB_BUILD_OPTIONS)))
 override_dh_auto_test:
 	cd tests &&  python run-tests.py --with-hg=`which hg`
 	# avoid conflict with mercurial's own hgext/__init__.py
 	find debian -name __init__.py -delete
 	dh_python2
+
+clean: clean-docs
+
+clean-docs:
+	rm -rf html
+	rm -f docs/static/logo-evolve.ico
+	rm -f docs/tutorials/tutorial.rst
+
+.PHONY: build clean clean-docs

debian/source/format

+3.0 (quilt)
     - improves some aspect of the early implementation in 2.3
 '''
 
-testedwith = '2.5'
+testedwith = '2.7 2.7.1 2.7.2 2.8 2.8.1'
 buglink = 'https://bitbucket.org/marmoute/mutable-history/issues'
 
 import sys
     if ui.config('alias', 'odiff', None) is None:
         ui.setconfig('alias', 'odiff', "diff --hidden --rev 'limit(precursors(.),1)' --rev .")
     if ui.config('alias', 'grab', None) is None:
-        ui.setconfig('alias', 'grab', "rebase --dest . --rev $1")
+        ui.setconfig('alias', 'grab', "! $HG rebase --dest . --rev $@ && $HG up tip")
 
 
 ### Troubled revset symbol
 # This section take care of issue warning to the user when troubles appear
 
 @eh.wrapcommand("update")
+@eh.wrapcommand("parents")
 @eh.wrapcommand("pull")
 def wrapmayobsoletewc(origfn, ui, repo, *args, **opts):
     """Warn that the working directory parent is an obsolete changeset"""
     res = origfn(ui, repo, *args, **opts)
     if repo['.'].obsolete():
-        ui.warn(_('Working directory parent is obsolete\n'))
+        ui.warn(_('working directory parent is obsolete!\n'))
     return res
 
 # XXX this could wrap transaction code
     if not repo.local():
         return
 
-    opush = repo.push
-
     class evolvingrepo(repo.__class__):
         def push(self, remote, *args, **opts):
             """wrapper around pull that pull obsolete relation"""
             try:
-                result = opush(remote, *args, **opts)
+                result = super(evolvingrepo, self).push(remote, *args, **opts)
             except util.Abort, ex:
                 hint = _("use 'hg evolve' to get a stable history "
                          "or --force to ignore warnings")
     - rebase unstable changeset to make it stable again,
     - create proper diff from bumped changeset,
     - merge divergent changesets.
+    - update to a successor if the working directory parent is
+      obsolete
 
     By default, take the first trouble changeset that looks relevant.
 
 
     tr = _picknexttroubled(ui, repo, anyopt or allopt)
     if tr is None:
+        if repo['.'].obsolete():
+            displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate})
+            successors = set()
+
+            for successorsset in obsolete.successorssets(repo, repo['.'].node()):
+                for nodeid in successorsset:
+                    successors.add(repo[nodeid])
+
+            if not successors:
+                ui.warn(_('parent is obsolete without successors; ' +
+                          'likely killed\n'))
+                return 2
+
+            elif len(successors) > 1:
+                ui.warn(_('parent is obsolete with multiple successors:\n'))
+
+                for ctx in sorted(successors, key=lambda ctx: ctx.rev()):
+                    displayer.show(ctx)
+
+                return 2
+
+            else:
+                ctx = successors.pop()
+
+                ui.status(_('update:'))
+                if not ui.quiet:
+                    displayer.show(ctx)
+
+                if dryrunopt:
+                    print 'hg update %s' % ctx.rev()
+                    return 0
+                else:
+                    return hg.update(repo, ctx.rev())
+
         troubled = repo.revs('troubled()')
         if troubled:
             ui.write_err(_('nothing to evolve here\n'))
         try:
             repo.dirstate.setparents(divergent.node(), node.nullid)
             oldlen = len(repo)
-            amend(ui, repo)
+            amend(ui, repo, message='', logfile='')
             if oldlen == len(repo):
                 new = divergent
                 # no changes
         newer = [n for n in newer if n and ctx.node() not in n]
         if newer:
             return base, tuple(ctx._repo[o] for o in newer[0])
-    raise KeyError('Base seem unknown. This case is not handled yet.')
+    raise util.Abort('base of divergent changeset not found',
+                     hint='this case is not yet handled')
 
 
 
 shorttemplate = '[{rev}] {desc|firstline}\n'
 
-@command('^gdown',
+@command('^gdown|previous',
          [],
          '')
-def cmdgdown(ui, repo):
+def cmdprevious(ui, repo):
     """update to parent and display summary lines"""
     wkctx = repo[None]
     wparents = wkctx.parents()
         ui.warn(_('multiple parents, explicitly update to one\n'))
         return 1
 
-@command('^gup',
+@command('^gup|next',
          [],
          '')
-def cmdup(ui, repo):
+def cmdnext(ui, repo):
     """update to child and display summary lines"""
     wkctx = repo[None]
     wparents = wkctx.parents()
     children = [ctx for ctx in wparents[0].children() if not ctx.obsolete()]
     displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate})
     if not children:
-        ui.warn(_('No non-obsolete children\n'))
+        ui.warn(_('no non-obsolete children\n'))
         return 1
     if len(children) == 1:
         c = children[0]
     else:
         for c in children:
             displayer.show(c)
-        ui.warn(_('Multiple non-obsolete children, explicitly update to one\n'))
+        ui.warn(_('multiple non-obsolete children, explicitly update to one\n'))
         return 1
 
 def _reachablefrombookmark(repo, revs, mark):
 @command('amend|refresh',
     [('A', 'addremove', None,
      _('mark new/missing files as added/removed before committing')),
-    ('n', 'note', '', _('use text as commit message for this update (DEPRECATED)')),
     ('e', 'edit', False, _('invoke editor on commit messages')),
+    ('', 'close-branch', None,
+     _('mark a branch as closed, hiding it from the branch list')),
+    ('s', 'secret', None, _('use the secret phase for committing')),
     ] + walkopts + commitopts + commitopts2,
     _('[OPTION]... [FILE]...'))
 def amend(ui, repo, *pats, **opts):
 
     Returns 0 on success, 1 if nothing changed.
     """
-
-    # determine updates to subsume
-    old = scmutil.revsingle(repo, '.')
-    metadata = _getmetadata(**opts)
-
-    lock = repo.lock()
-    try:
-        wlock = repo.wlock()
-        try:
-            if old.phase() == phases.public:
-                raise util.Abort(_("can not rewrite immutable changeset %s")
-                                 % old)
-            tr = repo.transaction('amend')
-            try:
-                oldphase = old.phase()
-                # commit current changes as update
-                # code copied from commands.commit to avoid noisy messages
-                ciopts = dict(opts)
-                ciopts.pop('message', None)
-                ciopts.pop('logfile', None)
-                ciopts['message'] = opts.get('note') or ('amends %s' % old.hex())
-                e = cmdutil.commiteditor
-                def commitfunc(ui, repo, message, match, opts):
-                    return repo.commit(message, opts.get('user'), opts.get('date'),
-                                       match, editor=e)
-                revcount = len(repo)
-                tempid = cmdutil.commit(ui, repo, commitfunc, pats, ciopts)
-                if len(repo) == revcount:
-                    # No revision created
-                    tempid = None
-
-                # find all changesets to be considered updates
-                head = repo['.']
-                updatenodes = set(repo.changelog.nodesbetween(
-                        roots=[old.node()], heads=[head.node()])[0])
-                updatenodes.remove(old.node())
-                okoptions = ['message', 'logfile', 'edit', 'user']
-                if not updatenodes:
-                    for o in okoptions:
-                        if opts.get(o):
-                            break
-                    else:
-                        raise error.Abort(_('no updates found'))
-                updates = [repo[n] for n in updatenodes]
-
-                # perform amend
-                if opts.get('edit'):
-                    opts['force_editor'] = True
-                newid, created = rewrite(repo, old, updates, head,
-                                         [old.p1().node(), old.p2().node()], opts)
-
-                if newid != old.node():
-                    createmarkers(repo, [(old, (repo[newid],))])
-                if tempid is not None:
-                    createmarkers(repo, [(repo[tempid], ())])
-                if created:
-                    # reroute the working copy parent to the new changeset
-                    phases.retractboundary(repo, oldphase, [newid])
-                    repo.dirstate.setparents(newid, node.nullid)
-                else:
-                    # rewrite() recreated an existing revision, discard
-                    # the intermediate revision if any. No need to update
-                    # phases or parents.
-                    # XXX: need another message in collapse case.
-                    tr.close()
-                    raise error.Abort(_('no updates found'))
-                tr.close()
-            finally:
-                tr.release()
-        finally:
-            wlock.release()
-    finally:
-        lock.release()
+    opts = opts.copy()
+    edit = opts.pop('edit', False)
+    opts['amend'] = True
+    if not (edit or opts['message']):
+        opts['message'] = repo['.'].description()
+    _alias, commitcmd = cmdutil.findcmd('commit', commands.table)
+    return commitcmd[0](ui, repo, *pats, **opts)
 
 def _commitfiltered(repo, ctx, match):
     """Recommit ctx with changed files not in match. Return the new
         obsoleted[:] = [str(i) for i in repo.revs('%lr', obsoleted)]
         if obsoleted and len(revs) > 1:
 
-            raise error.Abort(_('Can not graft multiple revision while '
+            raise error.Abort(_('cannot graft multiple revisions while '
                                 'obsoleting (for now).'))
 
         return commitwrapper(orig, ui, repo,*revs, **kwargs)
     except KeyError:
         raise error.Abort(_('evolution extension requires rebase extension.'))
 
-    for cmd in ['amend', 'kill', 'uncommit', 'touch', 'fold']:
+    for cmd in ['kill', 'uncommit', 'touch', 'fold']:
         entry = extensions.wrapcommand(cmdtable, cmd,
                                        warnobserrors)
 

hgext/pushexperiment.py

+"""Small extension altering some push behavior
+
+- Add a new wire protocol command to exchange obsolescence markers. Sending the
+  raw file as a binary instead of using pushkey hack.
+- Add a "push done" notification
+- Push obsolescence marker before anything else (This works around the lack of global transaction)
+
+"""
+
+import errno
+from StringIO import StringIO
+
+from mercurial.i18n import _
+from mercurial import extensions
+from mercurial import wireproto
+from mercurial import obsolete
+from mercurial import localrepo
+
+
+def client_pushobsmarkers(self, obsfile):
+    """wireprotocol peer method"""
+    self.requirecap('_push_experiment_pushobsmarkers_0',
+                    _('push obsolete markers faster'))
+    ret, output = self._callpush('push_experiment_pushobsmarkers_0', obsfile)
+    for l in output.splitlines(True):
+        self.ui.status(_('remote: '), l)
+    return ret
+
+
+def srv_pushobsmarkers(repo, proto):
+    """wireprotocol command"""
+    fp = StringIO()
+    proto.redirect()
+    proto.getfile(fp)
+    data = fp.getvalue()
+    fp.close()
+    lock = repo.lock()
+    try:
+        tr = repo.transaction('pushkey: obsolete markers')
+        try:
+            repo.obsstore.mergemarkers(tr, data)
+            tr.close()
+        finally:
+            tr.release()
+    finally:
+        lock.release()
+    return wireproto.pushres(0)
+
+
+def syncpush(orig, repo, remote):
+    """wraper for obsolete.syncpush to use the fast way if possible"""
+    if not (obsolete._enabled and repo.obsstore):
+        return
+    if remote.capable('_push_experiment_pushobsmarkers_0'):
+        return # already pushed before changeset
+        remote.push_experiment_pushobsmarkers_0(obsfp)
+        return
+    return orig(repo, remote)
+
+
+def client_notifypushend(self):
+    """wire peer  command to notify a push is done"""
+    self.requirecap('_push_experiment_notifypushend_0', _('hook once push is all done'))
+    return self._call('push_experiment_notifypushend_0')
+
+
+def srv_notifypushend(repo, proto):
+    """wire protocol command to notify a push is done"""
+    proto.redirect()
+    repo.hook('notifypushend')
+    return wireproto.pushres(0)
+
+
+def augmented_push(orig, repo, remote, *args, **kwargs):
+    """push wrapped that call the wire protocol command"""
+    if not remote.canpush():
+        raise util.Abort(_("destination does not support push"))
+    if (obsolete._enabled and repo.obsstore
+        and remote.capable('_push_experiment_pushobsmarkers_0')):
+        # push marker early to limit damage of pushing too early.
+        try:
+            obsfp = repo.sopener('obsstore')
+        except IOError as e:
+            if e.errno != errno.ENOENT:
+                raise
+        else:
+            remote.push_experiment_pushobsmarkers_0(obsfp)
+    ret = orig(repo, remote, *args, **kwargs)
+    if remote.capable('_push_experiment_notifypushend_0'):
+        remote.push_experiment_notifypushend_0()
+    return ret
+
+
+def capabilities(orig, repo, proto):
+    """wrapper to advertise new capability"""
+    caps = orig(repo, proto)
+    if obsolete._enabled:
+        caps += ' _push_experiment_pushobsmarkers_0'
+    caps += ' _push_experiment_notifypushend_0'
+    return caps
+
+
+def extsetup(ui):
+    wireproto.wirepeer.push_experiment_pushobsmarkers_0 = client_pushobsmarkers
+    wireproto.wirepeer.push_experiment_notifypushend_0 = client_notifypushend
+    wireproto.commands['push_experiment_pushobsmarkers_0'] = (srv_pushobsmarkers, '')
+    wireproto.commands['push_experiment_notifypushend_0'] = (srv_notifypushend, '')
+    extensions.wrapfunction(wireproto, 'capabilities', capabilities)
+    extensions.wrapfunction(obsolete, 'syncpush', syncpush)
+    extensions.wrapfunction(localrepo.localrepository, 'push', augmented_push)
+
+
 
 setup(
     name='hg-evolve',
-    version='3.1.0',
+    version='3.2.0',
     author='Pierre-Yves David',
     maintainer='Pierre-Yves David',
     maintainer_email='pierre-yves.david@logilab.fr',
     long_description=open('README').read(),
     keywords='hg mercurial',
     license='GPLv2+',
-    py_modules=['hgext.evolve'],
+    py_modules=['hgext.evolve', 'hgext.pushexperiment'],
 )

tests/test-amend.t

   (branches are permanent and global, did you want a bookmark?)
   $ hg amend
   $ hg debugobsolete
-  07f4944404050f47db2e5c5071e0e84e7a27bba9 a34b93d251e49c93d5685ebacad785c73a7e8605 0 {'date': '* *', 'user': 'test'} (glob)
-  bd19cbe78fbfbd87eb33420c63986fe5f3154f2c 0 {'date': '* *', 'user': 'test'} (glob)
+  07f4944404050f47db2e5c5071e0e84e7a27bba9 6a022cbb61d5ba0f03f98ff2d36319dfea1034ae 0 {'date': '* *', 'user': 'test'} (glob)
+  b2e32ffb533cbe1d5759638c0cd4e8abc43b2738 0 {'date': '* *', 'user': 'test'} (glob)
   $ hg branch
   foo
   $ hg branches
-  foo                            2:a34b93d251e4
+  foo                            2:6a022cbb61d5
   $ glog
   @  2@foo(draft) adda
   
 Test no-op
 
   $ hg amend
-  abort: no updates found
-  [255]
+  nothing changed
+  [1]
   $ glog
   @  2@foo(draft) adda
   
 Test forcing the message to the same value, no intermediate revision.
 
   $ hg amend -m 'adda'
-  abort: no updates found
-  [255]
+  nothing changed
+  [1]
   $ glog
   @  2@foo(draft) adda
   
   M a
   $ hg pstatus
   $ hg diff
-  diff -r 2f97fe38810f a
+  diff -r f7a50201fe3a a
   --- a/a	Thu Jan 01 00:00:00 1970 +0000
   +++ b/a	* +0000 (glob)
   @@ -1,2 +1,1 @@
   $ hg pdiff
   $ hg ci -m reseta
   $ hg debugobsolete
-  07f4944404050f47db2e5c5071e0e84e7a27bba9 a34b93d251e49c93d5685ebacad785c73a7e8605 0 {'date': '* *', 'user': 'test'} (glob)
-  bd19cbe78fbfbd87eb33420c63986fe5f3154f2c 0 {'date': '* *', 'user': 'test'} (glob)
+  07f4944404050f47db2e5c5071e0e84e7a27bba9 6a022cbb61d5ba0f03f98ff2d36319dfea1034ae 0 {'date': '* *', 'user': 'test'} (glob)
+  b2e32ffb533cbe1d5759638c0cd4e8abc43b2738 0 {'date': '* *', 'user': 'test'} (glob)
   $ hg phase 2
   2: draft
   $ glog

tests/test-evolve.t

 
 and **amend**::
 
-  $ hg amend --note "fix spelling of Zwei"
-
-The `--note` is our commit message for the *update* only. So its only purpose
-is to document the evolution of the changeset. If we use `--message` with
-`amend`, it replaces the commit message of the changeset itself.
+  $ hg amend
 
 This results in a new single changeset for our amended changeset, and the old
 changeset plus the updating changeset are hidden from view by default::
 
 (amend of on ancestors)
 
-  $ hg amend --note 'french looks better'
+  $ hg amend
   1 new unstable changesets
   $ hg log
   6	feature-A: a nifty feature - test
   0	: base - test
   $ hg up -q 0
   $ glog --hidden
-  o  6:23409eba69a0@default(draft) a nifty feature
+  o  6:ba0ec09b1bab@default(draft) a nifty feature
   |
-  | x  5:e416e48b2742@default(draft) french looks better
+  | x  5:c296b79833d1@default(draft) temporary amend commit for 568a468b60fc
   | |
-  | | o  4:f8111a076f09@default(draft) another feature
+  | | o  4:207cbc4ea7fe@default(draft) another feature
   | |/
-  | | x  3:524e478d4811@default(draft) fix spelling of Zwei
+  | | x  3:5bb880fc0f12@default(draft) temporary amend commit for 7b36850622b2
   | | |
   | | x  2:7b36850622b2@default(draft) another feature
   | |/
   @  0:e55e0562ee93@default(public) base
   
   $ hg debugobsolete
-  7b36850622b2fd159fa30a4fb2a1edd2043b4a14 f8111a076f0975cbecb336e2bd3411be22b673fb 0 {'date': '* *', 'user': 'test'} (glob)
-  524e478d4811d405c8771e4c441de4483bdf8b33 0 {'date': '* *', 'user': 'test'} (glob)
-  568a468b60fc99a42d5d4ddbe181caff1eef308d 23409eba69a0986e90cd42252852c1e6da97af5b 0 {'date': '* *', 'user': 'test'} (glob)
-  e416e48b27428695d00c2a2cc4a0b9619482e63f 0 {'date': '* *', 'user': 'test'} (glob)
+  7b36850622b2fd159fa30a4fb2a1edd2043b4a14 207cbc4ea7fee30d18b3a25f534fe5db22c6071b 0 {'date': '* *', 'user': 'test'} (glob)
+  5bb880fc0f12dd61eee6de36f62b93fdbc3684b0 0 {'date': '* *', 'user': 'test'} (glob)
+  568a468b60fc99a42d5d4ddbe181caff1eef308d ba0ec09b1babf3489b567853807f452edd46704f 0 {'date': '* *', 'user': 'test'} (glob)
+  c296b79833d1d497f33144786174bf35e04e44a3 0 {'date': '* *', 'user': 'test'} (glob)
   $ hg evolve
   move:[4] another feature
   atop:[6] a nifty feature
   recreate:[8] another feature that rox
   atop:[7] another feature
   computing new diff
-  commited as 53ff506edef1
+  commited as ca3b75e3e59b
   $ hg glog
-  @  9	feature-B: bumped update to 5f4744038ed5: - test
+  @  9	feature-B: bumped update to abe98aeaaa35: - test
   |
   o  7	: another feature - test
   |

tests/test-obsolete.t

   4
   - 725c380fe99b
   $ hg up --hidden 3 -q
-  Working directory parent is obsolete
+  working directory parent is obsolete!
+(reported by parents too)
+  $ hg parents
+  changeset:   3:0d3f46688ccc
+  parent:      1:7c3bad9141dc
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     add obsol_c
+  
+  working directory parent is obsolete!
   $ mkcommit d # 5 (on 3)
   1 new unstable changesets
   $ qlog -r 'obsolete()'
   0
   - 1f0dee641bb7
   $ hg up --hidden 3 -q
-  Working directory parent is obsolete
+  working directory parent is obsolete!
   $ mkcommit obsol_d # 6
   created new head
   1 new unstable changesets
   [1]
 
   $ hg up --hidden -q .^ # 3
-  Working directory parent is obsolete
+  working directory parent is obsolete!
   $ mkcommit "obsol_d'" # 7
   created new head
   1 new unstable changesets
 Test rollback support
 
   $ hg up --hidden .^ -q # 3
-  Working directory parent is obsolete
+  working directory parent is obsolete!
   $ mkcommit "obsol_d''"
   created new head
   1 new unstable changesets
 #excluded 'whole rebase set is extinct and ignored.' message not in core
   $ hg rebase -b '3' -d 4 --traceback
   2 new divergent changesets
+  $ hg up tip
+  ? files updated, 0 files merged, 0 files removed, 0 files unresolved (glob)
   $ hg log -G --template='{rev} - {node|short} {desc}\n'
   @  11 - 9468a5f5d8b2 add obsol_d''
   |
   
 
 Does not complain about new head if you obsolete the old one
+(re necesarry when we start runnind discovery on unfiltered repo in core)
 
   $ hg push ../other-new --traceback
   pushing to ../other-new
   adding changesets
   adding manifests
   adding file changes
-  added 2 changesets with 1 changes to 1 files
+  added 2 changesets with 1 changes to [12] files (re)
   $ hg up -q 10
   $ mkcommit "obsol_d'''"
   created new head
   date:        Thu Jan 01 00:00:00 1970 +0000
   summary:     add obsolet_conflicting_d
   
+
+  $ hg up --hidden 3 -q
+  working directory parent is obsolete!
+  $ hg evolve
+  parent is obsolete with multiple successors:
+  [4] add obsol_c'
+  [10] add obsol_c
+  [2]
+  $ hg olog
+  changeset:   2:4538525df7e2
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     add c
+  

tests/test-prune.t

   working directory now at d62d843c9a01
   bookmark 'todelete' deleted
   $ hg id -ir dcbb326fdec2
-  abort: 00changelog.i@dcbb326fdec2*: no node! (glob)
+  abort: unknown revision 'dcbb326fdec2'!
   [255]
   $ hg id -ir d62d843c9a01
   d62d843c9a01
   3 changesets pruned
   bookmark 'delete' deleted
   $ hg id -ir 6:2702dd0c91e7
-  abort: 00changelog.i@2702dd0c91e7*: no node! (glob)
+  abort: unknown revision '2702dd0c91e7'!
   [255]
 

tests/test-stabilize-conflict.t

   merging babar
   $ hg resolve -l
   $ hg log -G
-  @  changeset:   5:800217d738cd
+  @  changeset:   5:71c18f70c34f
   |  tag:         tip
   |  user:        test
   |  date:        Thu Jan 01 00:00:00 1970 +0000
   |  summary:     babar count up to fifteen
   |
-  o  changeset:   4:6bd654225435
+  o  changeset:   4:5977072d13c5
   |  parent:      0:29ec1554cfaf
   |  user:        test
   |  date:        Thu Jan 01 00:00:00 1970 +0000
   [4] babar count up to ten
   $ safesed 's/dix/ten/' babar
   $ hg diff
-  diff -r 6bd654225435 babar
+  diff -r 5977072d13c5 babar
   --- a/babar	Thu Jan 01 00:00:00 1970 +0000
   +++ b/babar	* (glob)
   @@ -7,4 +7,4 @@
   $ hg resolve -l
   U babar
   $ hg log -G
-  @  changeset:   7:3e191dd96e18
+  @  changeset:   7:e04690b09bc6
   |  tag:         tip
   |  parent:      0:29ec1554cfaf
   |  user:        test
   |  date:        Thu Jan 01 00:00:00 1970 +0000
   |  summary:     babar count up to ten
   |
-  | @  changeset:   5:800217d738cd
+  | @  changeset:   5:71c18f70c34f
   | |  user:        test
   | |  date:        Thu Jan 01 00:00:00 1970 +0000
   | |  summary:     babar count up to fifteen
   | |
-  | x  changeset:   4:6bd654225435
+  | x  changeset:   4:5977072d13c5
   |/   parent:      0:29ec1554cfaf
   |    user:        test
   |    date:        Thu Jan 01 00:00:00 1970 +0000
   grafting revision 5
   $ hg resolve -l
   $ hg log -G
-  @  changeset:   8:92429cce7036
+  @  changeset:   8:1836b91c6c1d
   |  tag:         tip
   |  user:        test
   |  date:        Thu Jan 01 00:00:00 1970 +0000
   |  summary:     babar count up to fifteen
   |
-  o  changeset:   7:3e191dd96e18
+  o  changeset:   7:e04690b09bc6
   |  parent:      0:29ec1554cfaf
   |  user:        test
   |  date:        Thu Jan 01 00:00:00 1970 +0000
   [7] babar count up to ten
   $ safesed 's/ten/zehn/' babar
   $ hg diff
-  diff -r 3e191dd96e18 babar
+  diff -r e04690b09bc6 babar
   --- a/babar	Thu Jan 01 00:00:00 1970 +0000
   +++ b/babar	* (glob)
   @@ -7,4 +7,4 @@
   $ hg resolve -l
   U babar
   $ hg log -G
-  @  changeset:   10:a7fe09efd4a1
+  @  changeset:   10:b20d08eea373
   |  tag:         tip
   |  parent:      0:29ec1554cfaf
   |  user:        test
   |  date:        Thu Jan 01 00:00:00 1970 +0000
   |  summary:     babar count up to ten
   |
-  | @  changeset:   8:92429cce7036
+  | @  changeset:   8:1836b91c6c1d
   | |  user:        test
   | |  date:        Thu Jan 01 00:00:00 1970 +0000
   | |  summary:     babar count up to fifteen
   | |
-  | x  changeset:   7:3e191dd96e18
+  | x  changeset:   7:e04690b09bc6
   |/   parent:      0:29ec1554cfaf
   |    user:        test
   |    date:        Thu Jan 01 00:00:00 1970 +0000

tests/test-stabilize-order.t

   $ hg amend
   1 new unstable changesets
   $ glog
-  @  7:f5ff10856e5a@default(draft) adda
+  @  7:005fe5914f78@default(draft) adda
   |
-  | o  5:ab8cbb6d87ff@default(draft) addb
+  | o  5:22619daeed78@default(draft) addb
   | |
   | | o  3:7a7552255fb5@default(draft) addc
   | | |
   $ hg evolve -v
   move:[5] addb
   atop:[7] adda
-  hg rebase -r ab8cbb6d87ff -d f5ff10856e5a
+  hg rebase -r 22619daeed78 -d 005fe5914f78
   resolving manifests
   getting b
   b
   $ glog
-  @  8:6bf44048e43f@default(draft) addb
+  @  8:bede829dd2d3@default(draft) addb
   |
-  o  7:f5ff10856e5a@default(draft) adda
+  o  7:005fe5914f78@default(draft) adda
   |
   | o  3:7a7552255fb5@default(draft) addc
   | |
   $ hg evolve -v
   move:[3] addc
   atop:[8] addb
-  hg rebase -r 7a7552255fb5 -d 6bf44048e43f
+  hg rebase -r 7a7552255fb5 -d bede829dd2d3
   resolving manifests
   getting b
   resolving manifests
   --- successors.old* (glob)
   +++ successors.new* (glob)
   @@ -3,3 +3,4 @@
-   93418d2c0979643ad446f621195e78720edb05b4 f5ff10856e5ab3c8dc420b9c11460e6832a3b78c 0 {'date': '* *', 'user': 'test'} (glob)
-   3a4a591493f80708e46f2bf6d3b4debfad8ff91e 0 {'date': '* *', 'user': 'test'} (glob)
-   ab8cbb6d87ff3ab5526735a051cba6b63f3d6775 6bf44048e43f830accbf7d2bd7bc252ad7a3b99c 0 {'date': '* *', 'user': 'test'} (glob)
-  +7a7552255fb5f8bd745e46fba6f0ca633a4dd716 5e819fbb0d278117c0a83b7f6f6486689732cfb2 0 {'date': '* *', 'user': 'test'} (glob)
+   93418d2c0979643ad446f621195e78720edb05b4 005fe5914f78e8bc64c7eba28117b0b1fa210d0d 0 {'date': '* *', 'user': 'test'} (glob)
+   7a7d76dc97c57751de9e80f61ed2a639bd03cd24 0 {'date': '* *', 'user': 'test'} (glob)
+   22619daeed78036f80fbd326b6852519c4f0c25e bede829dd2d3b2ae9bf198c23432b250dc964458 0 {'date': '* *', 'user': 'test'} (glob)
+  +7a7552255fb5f8bd745e46fba6f0ca633a4dd716 65095d7d0dd5e4f15503bb7b1f433a5fe9bac052 0 {'date': '* *', 'user': 'test'} (glob)
   [1]
+
+
+
   $ glog
-  @  9:5e819fbb0d27@default(draft) addc
+  @  9:65095d7d0dd5@default(draft) addc
   |
-  o  8:6bf44048e43f@default(draft) addb
+  o  8:bede829dd2d3@default(draft) addb
   |
-  o  7:f5ff10856e5a@default(draft) adda
+  o  7:005fe5914f78@default(draft) adda
   |
   o  0:c471ef929e6a@default(draft) addroot
   
   $ hg amend
   1 new unstable changesets
   $ glog
-  @  11:4e7cec6b4afe@default(draft) addb
+  @  11:036cf654e942@default(draft) addb
   |
-  | o  9:5e819fbb0d27@default(draft) addc
+  | o  9:65095d7d0dd5@default(draft) addc
   | |
-  | x  8:6bf44048e43f@default(draft) addb
+  | x  8:bede829dd2d3@default(draft) addb
   |/
-  o  7:f5ff10856e5a@default(draft) adda
+  o  7:005fe5914f78@default(draft) adda
   |
   o  0:c471ef929e6a@default(draft) addroot
   
   $ hg evolve --any -v
   move:[9] addc
   atop:[11] addb
-  hg rebase -r 5e819fbb0d27 -d 4e7cec6b4afe
+  hg rebase -r 65095d7d0dd5 -d 036cf654e942
   resolving manifests
   removing c
   getting b
   getting c
   c
   $ glog
-  @  12:24f95816bb21@default(draft) addc
+  @  12:e99ecf51c867@default(draft) addc
   |
-  o  11:4e7cec6b4afe@default(draft) addb
+  o  11:036cf654e942@default(draft) addb
   |
-  o  7:f5ff10856e5a@default(draft) adda
+  o  7:005fe5914f78@default(draft) adda
   |
   o  0:c471ef929e6a@default(draft) addroot
   

tests/test-stabilize-result.t

   $ hg evolve -v
   move:[2] changea
   atop:[4] changea
-  hg rebase -r cce2c55b8965 -d 1447e1c4828d
+  hg rebase -r cce2c55b8965 -d fb9d051ec0a4
   resolving manifests
   $ glog --hidden
-  @  4:1447e1c4828d@default(draft) bk:[changea] changea
+  @  4:fb9d051ec0a4@default(draft) bk:[changea] changea
   |
-  | x  3:41ad4fe8c795@default(draft) bk:[] amends 102a90ea7b4a3361e4082ed620918c261189a36a
+  | x  3:c5727dbded3c@default(draft) bk:[] temporary amend commit for 102a90ea7b4a
   | |
   | | x  2:cce2c55b8965@default(draft) bk:[] changea
   | |/
   o  0:07f494440405@default(draft) bk:[] adda
   
   $ hg debugobsolete
-  102a90ea7b4a3361e4082ed620918c261189a36a 1447e1c4828d2347df8f858aa041305fa4cf7db1 0 {'date': '* *', 'user': 'test'} (glob)
-  41ad4fe8c79565a06c89f032ef0937b3cbd68a04 0 {'date': '* *', 'user': 'test'} (glob)
+  102a90ea7b4a3361e4082ed620918c261189a36a fb9d051ec0a450a4aa2ffc8c324979832ef88065 0 {'date': '* *', 'user': 'test'} (glob)
+  c5727dbded3c3a6877cf60d6bb552a76812cb844 0 {'date': '* *', 'user': 'test'} (glob)
   cce2c55b896511e0b6e04173c9450ba822ebc740 0 {'date': '* *', 'user': 'test'} (glob)
 
 Test evolve with conflict
   [255]
   $ hg revert -r 'unstable()' a
   $ hg diff
-  diff -r e8cc1b534401 a
+  diff -r 66719795a494 a
   --- a/a	* (glob)
   +++ b/a	* (glob)
   @@ -1,1 +1,3 @@
 (the same parent case is handled in test-evolve.t)
 
   $ glog
-  @  8:e3183e9c0961@default(draft) bk:[] newer a
+  @  8:1cf0aacfd363@default(draft) bk:[] newer a
   |
-  o  7:e8cc1b534401@default(draft) bk:[changea] changea
+  o  7:66719795a494@default(draft) bk:[changea] changea
   |
   o  0:07f494440405@default(draft) bk:[] adda
   
 Get a successors of 8 on it
 
   $ hg grab 8
+  ? files updated, 0 files merged, 0 files removed, 0 files unresolved (glob)
 
 Add real change to the successors
 
   $ hg phase --hidden --public 8
   1 new bumped changesets
   $ glog
-  @  12:15c83af6f3a3@default(draft) bk:[] newer a
+  @  12:(73b15c7566e9|d5c7ef82d003)@default\(draft\) bk:\[\] newer a (re)
   |
-  o  9:355c5cda4de1@default(draft) bk:[] add c
+  o  9:7bc2f5967f5e@default(draft) bk:[] add c
   |
-  | o  8:e3183e9c0961@default(public) bk:[] newer a
+  | o  8:1cf0aacfd363@default(public) bk:[] newer a
   |/
-  o  7:e8cc1b534401@default(public) bk:[changea] changea
+  o  7:66719795a494@default(public) bk:[changea] changea
   |
   o  0:07f494440405@default(public) bk:[] adda
   
   $ hg evolve --any --dry-run
   recreate:[12] newer a
   atop:[8] newer a
-  hg rebase --rev 15c83af6f3a3 --dest e8cc1b534401;
-  hg update e3183e9c0961;
-  hg revert --all --rev 15c83af6f3a3;
+  hg rebase --rev (73b15c7566e9|d5c7ef82d003) --dest 66719795a494; (re)
+  hg update 1cf0aacfd363;
+  hg revert --all --rev (73b15c7566e9|d5c7ef82d003); (re)
   hg commit --msg "bumped update to %s" (no-eol)
   $ hg evolve --any
   recreate:[12] newer a
   atop:[8] newer a
-  rebasing to destination parent: e8cc1b534401
+  rebasing to destination parent: 66719795a494
   computing new diff
-  commited as eeeb8f6e7648
+  commited as (a7cabd7bd9c2|671b9d7eeaec) (re)
   $ glog
-  @  14:eeeb8f6e7648@default(draft) bk:[] bumped update to e3183e9c0961:
+  @  14:(a7cabd7bd9c2|671b9d7eeaec)@default\(draft\) bk:\[\] bumped update to 1cf0aacfd363: (re)
   |
-  | o  9:355c5cda4de1@default(draft) bk:[] add c
+  | o  9:7bc2f5967f5e@default(draft) bk:[] add c
   | |
-  o |  8:e3183e9c0961@default(public) bk:[] newer a
+  o |  8:1cf0aacfd363@default(public) bk:[] newer a
   |/
-  o  7:e8cc1b534401@default(public) bk:[changea] changea
+  o  7:66719795a494@default(public) bk:[changea] changea
   |
   o  0:07f494440405@default(public) bk:[] adda
   
   > EOF
   $ hg ci -m 'More addition'
   $ glog
-  @  15:7391601a4bfa@default(draft) bk:[] More addition
+  @  15:3932c176bbaa@default(draft) bk:[] More addition
   |
-  | o  14:eeeb8f6e7648@default(draft) bk:[] bumped update to e3183e9c0961:
+  | o  14:(a7cabd7bd9c2|671b9d7eeaec)@default\(draft\) bk:\[\] bumped update to 1cf0aacfd363: (re)
   | |
-  o |  9:355c5cda4de1@default(draft) bk:[] add c
+  o |  9:7bc2f5967f5e@default(draft) bk:[] add c
   | |
-  | o  8:e3183e9c0961@default(public) bk:[] newer a
+  | o  8:1cf0aacfd363@default(public) bk:[] newer a
   |/
-  o  7:e8cc1b534401@default(public) bk:[changea] changea
+  o  7:66719795a494@default(public) bk:[changea] changea
   |
   o  0:07f494440405@default(public) bk:[] adda
   
   $ hg amend
   $ hg up --hidden 15
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  Working directory parent is obsolete
+  working directory parent is obsolete!
   $ mv a a.old
   $ echo 'jungle' > a
   $ cat a.old >> a
   $ hg amend
   2 new divergent changesets
   $ glog
-  @  19:3883461cc228@default(draft) bk:[] More addition
+  @  19:eacc9c8240fe@default(draft) bk:[] More addition
   |
-  | o  17:4754d61bc2db@default(draft) bk:[] More addition
+  | o  17:d2f173e25686@default(draft) bk:[] More addition
   |/
-  | o  14:eeeb8f6e7648@default(draft) bk:[] bumped update to e3183e9c0961:
+  | o  14:(a7cabd7bd9c2|671b9d7eeaec)@default\(draft\) bk:\[\] bumped update to 1cf0aacfd363: (re)
   | |
-  o |  9:355c5cda4de1@default(draft) bk:[] add c
+  o |  9:7bc2f5967f5e@default(draft) bk:[] add c
   | |
-  | o  8:e3183e9c0961@default(public) bk:[] newer a
+  | o  8:1cf0aacfd363@default(public) bk:[] newer a
   |/
-  o  7:e8cc1b534401@default(public) bk:[changea] changea
+  o  7:66719795a494@default(public) bk:[changea] changea
   |
   o  0:07f494440405@default(public) bk:[] adda
   
 Stabilize It
 
   $ hg evolve -qn --traceback
-  hg update -c 3883461cc228 &&
-  hg merge 4754d61bc2db &&
-  hg commit -m "auto merge resolving conflict between 3883461cc228 and 4754d61bc2db"&&
-  hg up -C 7391601a4bfa &&
+  hg update -c eacc9c8240fe &&
+  hg merge d2f173e25686 &&
+  hg commit -m "auto merge resolving conflict between eacc9c8240fe and d2f173e25686"&&
+  hg up -C 3932c176bbaa &&
   hg revert --all --rev tip &&
-  hg commit -m "`hg log -r 3883461cc228 --template={desc}`";
+  hg commit -m "`hg log -r eacc9c8240fe --template={desc}`";
   $ hg evolve -v
   merge:[19] More addition
   with: [17] More addition
   resolving manifests
   merging a
   0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+  amending changeset eacc9c8240fe
   a
+  copying changeset 283ccd10e2b8 to 7bc2f5967f5e
   a
+  committed changeset 21:f344982e63c4
   $ hg st
-  $ hg amend -d '0 0' -m 'More addition' # kill date variation XXX should be done in evolve
   $ glog
-  @  22:ac6d600735a4@default(draft) bk:[] More addition
+  @  21:f344982e63c4@default(draft) bk:[] More addition
   |
-  | o  14:eeeb8f6e7648@default(draft) bk:[] bumped update to e3183e9c0961:
+  | o  14:(a7cabd7bd9c2|671b9d7eeaec)@default\(draft\) bk:\[\] bumped update to 1cf0aacfd363: (re)
   | |
-  o |  9:355c5cda4de1@default(draft) bk:[] add c
+  o |  9:7bc2f5967f5e@default(draft) bk:[] add c
   | |
-  | o  8:e3183e9c0961@default(public) bk:[] newer a
+  | o  8:1cf0aacfd363@default(public) bk:[] newer a
   |/
-  o  7:e8cc1b534401@default(public) bk:[changea] changea
+  o  7:66719795a494@default(public) bk:[changea] changea
   |
   o  0:07f494440405@default(public) bk:[] adda
   
   $ hg summary
-  parent: 22:ac6d600735a4 tip
+  parent: 21:f344982e63c4 tip
    More addition
   branch: default
   commit: (clean)
   # HG changeset patch
   # User test
   # Date 0 0
-  # Node ID ac6d600735a49ee377e29d1f74a0576e8c972e7b
-  # Parent  355c5cda4de162658ed9f961a98a73a10b3167b1
+  #      Thu Jan 01 00:00:00 1970 +0000
+  # Node ID f344982e63c462b1e44c0371c804685389e673a9
+  # Parent  7bc2f5967f5e4ed277f60a89b7b04cc5d6407ced
   More addition
   
-  diff -r 355c5cda4de1 -r ac6d600735a4 a
+  diff -r 7bc2f5967f5e -r f344982e63c4 a
   --- a/a	Thu Jan 01 00:00:00 1970 +0000
   +++ b/a	Thu Jan 01 00:00:00 1970 +0000
   @@ -1,1 +1,9 @@
 
   $ hg up --hidden 15
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  Working directory parent is obsolete
+  working directory parent is obsolete!
   $ echo 'gotta break' >> a
   $ hg amend
   2 new divergent changesets
   $ hg phase 'divergent()'
-  22: draft
-  24: draft
+  21: draft
+  23: draft
   $ hg evolve -qn
-  hg update -c c956a4b140b6 &&
-  hg merge ac6d600735a4 &&
-  hg commit -m "auto merge resolving conflict between c956a4b140b6 and ac6d600735a4"&&
-  hg up -C 7391601a4bfa &&
+  hg update -c 36e188246d67 &&
+  hg merge f344982e63c4 &&
+  hg commit -m "auto merge resolving conflict between 36e188246d67 and f344982e63c4"&&
+  hg up -C 3932c176bbaa &&
   hg revert --all --rev tip &&
-  hg commit -m "`hg log -r c956a4b140b6 --template={desc}`";
+  hg commit -m "`hg log -r 36e188246d67 --template={desc}`";
   $ hg evolve
-  merge:[24] More addition
-  with: [22] More addition
+  merge:[23] More addition
+  with: [21] More addition
   base: [15] More addition
   merging a
   warning: conflicts during merge.

tests/test-touch.t

   $ hg commit -m ab --amend
   $ hg up --hidden 1
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  Working directory parent is obsolete
+  working directory parent is obsolete!
   $ hg log -G
   o  3:[0-9a-f]{12} ab (re)
   

tests/test-tutorial.t

   # HG changeset patch
   # User test
   # Date 0 0
+  #      Thu Jan 01 00:00:00 1970 +0000
   # Node ID d85de4546133030c82d257bbcdd9b1b416d0c31c
   # Parent  4d5dc81870237d492284826e21840b2ca00e26d1
   adding fruit
   # HG changeset patch
   # User test
   # Date 0 0
+  #      Thu Jan 01 00:00:00 1970 +0000
   # Node ID 9d0363b81950646bc6ad1ec5de8b8197ea586541
   # Parent  4d5dc81870237d492284826e21840b2ca00e26d1
   adding fruit
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
   $ hg rebase --rev fac207dec9f5 --dest . # moving "SPAM SPAM" to the working directory parent
   merging shopping
+  $ hg up tip
+  ? files updated, 0 files merged, 0 files removed, 0 files unresolved (glob)
   $ hg log -G
   @  a224f2a4fb9f (draft): SPAM SPAM
   |
   # HG changeset patch
   # User test
   # Date 0 0
+  #      Thu Jan 01 00:00:00 1970 +0000
   # Node ID a224f2a4fb9f9f828f608959912229d7b38b26de
   # Parent  41aff6a42b7578ec7ec3cb2041633f1ca43cca96
   SPAM SPAM
 
   $ hg rebase -r 10b8aeaa8cc8 -d a224f2a4fb9f
   merging shopping
+  $ hg up tip
+  ? files updated, 0 files merged, 0 files removed, 0 files unresolved (glob)
   $ hg phase --draft .
   $ hg log -G
   @  75954b8cd933 (draft): bathroom stuff
   pulling from $TESTTMP/local
   searching for changes
   no changes found
-  Working directory parent is obsolete
+  working directory parent is obsolete!
 
-  $ hg up ee942144f952
+now let's see where we are, and update to the successor
+
+  $ hg parents
+  bf1b0d202029 (draft): animals
+  working directory parent is obsolete!
+  $ hg evolve
+  update:[8] animals
   1 files updated, 0 files merged, 0 files removed, 0 files unresolved
 
 Relocating unstable change after prune

tests/test-uncommit.t

 
   $ hg up -C 3 --hidden
   8 files updated, 0 files merged, 1 files removed, 0 files unresolved
-  Working directory parent is obsolete
+  working directory parent is obsolete!
   $ hg --config extensions.purge= purge
   $ hg uncommit -I 'set:added() and e'
   2 new divergent changesets
 
   $ hg up -C 3 --hidden
   2 files updated, 0 files merged, 0 files removed, 0 files unresolved
-  Working directory parent is obsolete
+  working directory parent is obsolete!
   $ hg --config extensions.purge= purge
   $ hg uncommit --all -X e
   1 new divergent changesets
   $ hg ci -m touncommit
   $ echo unrelated > unrelated
   $ hg ci -Am addunrelated unrelated
-  $ hg gdown
+  $ hg previous
   0 files updated, 0 files merged, 1 files removed, 0 files unresolved
   [8] touncommit
   $ hg uncommit aa