changeset 410:598ff1df3b92 stable

amend: wrap the whole process in a single transaction.
author Pierre-Yves David <pierre-yves.david@ens-lyon.org>
date Mon, 30 Jul 2012 22:45:06 +0200
parents c4cc1d5eba7a
children 4c1997e41d18 299af91b8b6e
files hgext/evolve.py
diffstat 1 files changed, 55 insertions(+), 49 deletions(-) [+]
line wrap: on
line diff
--- a/hgext/evolve.py
+++ b/hgext/evolve.py
@@ -413,57 +413,63 @@
     try:
         wlock = repo.wlock()
         try:
-            if old.phase() == phases.public:
-                raise util.Abort(_("can not rewrite immutable changeset %s")
-                                 % old)
-            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
+            tr = repo.transaction('amend')
+            try:
+                if old.phase() == phases.public:
+                    raise util.Abort(_("can not rewrite immutable changeset %s")
+                                     % old)
+                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]
+                # 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 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.
-                if tempid is not None:
-                    repo.addobsolete(node.nullid, tempid)
-                # XXX: need another message in collapse case.
-                raise error.Abort(_('no updates found'))
+                # 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 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.
+                    if tempid is not None:
+                        repo.addobsolete(node.nullid, tempid)
+                    # XXX: need another message in collapse case.
+                    tr.close()
+                    raise error.Abort(_('no updates found'))
+                tr.close()
+            finally:
+                tr.release()
         finally:
             wlock.release()
     finally: