hgext/evolve.py
changeset 313 47d10459fa24
parent 312 a7b5989d1d92
child 314 ebd286f06879
equal deleted inserted replaced
312:a7b5989d1d92 313:47d10459fa24
    61     references a changeset existing before the rewrite call.
    61     references a changeset existing before the rewrite call.
    62     """
    62     """
    63     if len(old.parents()) > 1: #XXX remove this unecessary limitation.
    63     if len(old.parents()) > 1: #XXX remove this unecessary limitation.
    64         raise error.Abort(_('cannot amend merge changesets'))
    64         raise error.Abort(_('cannot amend merge changesets'))
    65     base = old.p1()
    65     base = old.p1()
    66     bm = bookmarks.readcurrent(repo)
    66     updatebookmarks = _bookmarksupdater(repo, old.node())
    67 
    67 
    68     wlock = repo.wlock()
    68     wlock = repo.wlock()
    69     try:
    69     try:
    70 
    70 
    71         # commit a new version of the old changeset, including the update
    71         # commit a new version of the old changeset, including the update
   132         revcount = len(repo)
   132         revcount = len(repo)
   133         newid = repo.commitctx(new)
   133         newid = repo.commitctx(new)
   134         new = repo[newid]
   134         new = repo[newid]
   135         created = len(repo) != revcount
   135         created = len(repo) != revcount
   136         if created:
   136         if created:
   137             # update the bookmark
   137             updatebookmarks(newid)
   138             if bm:
       
   139                 repo._bookmarks[bm] = newid
       
   140                 bookmarks.write(repo)
       
   141 
       
   142             # add evolution metadata
   138             # add evolution metadata
   143             collapsed = set([u.node() for u in updates] + [old.node()])
   139             collapsed = set([u.node() for u in updates] + [old.node()])
   144             repo.addcollapsedobsolete(collapsed, new.node())
   140             repo.addcollapsedobsolete(collapsed, new.node())
   145             oldbookmarks = repo.nodebookmarks(old.node())
       
   146             for book in oldbookmarks:
       
   147                 repo._bookmarks[book] = new.node()
       
   148             if oldbookmarks:
       
   149                 bookmarks.write(repo)
       
   150         else:
   141         else:
   151             # newid is an existing revision. It could make sense to
   142             # newid is an existing revision. It could make sense to
   152             # replace revisions with existing ones but probably not by
   143             # replace revisions with existing ones but probably not by
   153             # default.
   144             # default.
   154             pass
   145             pass
   214                                   ctx.rev()))
   205                                   ctx.rev()))
   215         if unstables:
   206         if unstables:
   216             return unstables[0]
   207             return unstables[0]
   217     return None
   208     return None
   218 
   209 
       
   210 def _bookmarksupdater(repo, oldid):
       
   211     """Return a callable update(newid) updating the current bookmark
       
   212     and bookmarks bound to oldid to newid.
       
   213     """
       
   214     bm = bookmarks.readcurrent(repo)
       
   215     def updatebookmarks(newid):
       
   216         dirty = False
       
   217         if bm:
       
   218             repo._bookmarks[bm] = newid
       
   219             dirty = True
       
   220         oldbookmarks = repo.nodebookmarks(oldid)
       
   221         if oldbookmarks:
       
   222             for b in oldbookmarks:
       
   223                 repo._bookmarks[b] = newid
       
   224             dirty = True
       
   225         if dirty:
       
   226             bookmarks.write(repo)
       
   227     return updatebookmarks
       
   228 
   219 ### new command
   229 ### new command
   220 #############################
   230 #############################
   221 cmdtable = {}
   231 cmdtable = {}
   222 command = cmdutil.command(cmdtable)
   232 command = cmdutil.command(cmdtable)
   223 
   233 
   582             if old.phase() == phases.public:
   592             if old.phase() == phases.public:
   583                 raise util.Abort(_("cannot rewrite immutable changeset"))
   593                 raise util.Abort(_("cannot rewrite immutable changeset"))
   584             if len(old.parents()) > 1:
   594             if len(old.parents()) > 1:
   585                 raise util.Abort(_("cannot uncommit merge changeset"))
   595                 raise util.Abort(_("cannot uncommit merge changeset"))
   586             oldphase = old.phase()
   596             oldphase = old.phase()
       
   597             updatebookmarks = _bookmarksupdater(repo, old.node())
   587             # Recommit the filtered changeset
   598             # Recommit the filtered changeset
   588             newid = None
   599             newid = None
   589             if pats or opts.get('include') or opts.get('exclude'):
   600             if pats or opts.get('include') or opts.get('exclude'):
   590                 match = scmutil.match(old, pats, opts)
   601                 match = scmutil.match(old, pats, opts)
   591                 newid = _commitfiltered(repo, old, match)
   602                 newid = _commitfiltered(repo, old, match)
   594             # Move local changes on filtered changeset
   605             # Move local changes on filtered changeset
   595             repo.addobsolete(newid, old.node())
   606             repo.addobsolete(newid, old.node())
   596             phases.retractboundary(repo, oldphase, [newid])
   607             phases.retractboundary(repo, oldphase, [newid])
   597             repo.dirstate.setparents(newid, node.nullid)
   608             repo.dirstate.setparents(newid, node.nullid)
   598             _uncommitdirstate(repo, old, match)
   609             _uncommitdirstate(repo, old, match)
       
   610             updatebookmarks(newid)
   599         finally:
   611         finally:
   600             wlock.release()
   612             wlock.release()
   601     finally:
   613     finally:
   602         lock.release()
   614         lock.release()
   603 
   615