comparison hgext/evolve.py @ 1506:a55c691f4cc0

evolve: use repo._bookmarks.recordchange instead of repo._bookmarks.write We want to get rid of the api repo._bookmarks.write and this patch removes its use in evolve.py. Before this patch, we were using repo._bookmarks.write to save bookmarks change immediately instead of repo._bookmarks.recordchange that write change when transaction ends.
author Laurent Charignon <lcharignon@fb.com>
date Wed, 16 Sep 2015 16:50:06 -0700
parents 53a6dbc33e36
children 6f574c76c142
comparison
equal deleted inserted replaced
1505:53a6dbc33e36 1506:a55c691f4cc0
803 """Return (nodeid, created) where nodeid is the identifier of the 803 """Return (nodeid, created) where nodeid is the identifier of the
804 changeset generated by the rewrite process, and created is True if 804 changeset generated by the rewrite process, and created is True if
805 nodeid was actually created. If created is False, nodeid 805 nodeid was actually created. If created is False, nodeid
806 references a changeset existing before the rewrite call. 806 references a changeset existing before the rewrite call.
807 """ 807 """
808 if True: 808 wlock = lock = tr = None
809 try:
810 wlock = repo.wlock()
811 lock = repo.lock()
812 tr = repo.transaction('rewrite')
809 if len(old.parents()) > 1: #XXX remove this unecessary limitation. 813 if len(old.parents()) > 1: #XXX remove this unecessary limitation.
810 raise error.Abort(_('cannot amend merge changesets')) 814 raise error.Abort(_('cannot amend merge changesets'))
811 base = old.p1() 815 base = old.p1()
812 updatebookmarks = _bookmarksupdater(repo, old.node()) 816 updatebookmarks = _bookmarksupdater(repo, old.node(), tr)
813 817
814 # commit a new version of the old changeset, including the update 818 # commit a new version of the old changeset, including the update
815 # collect all files which might be affected 819 # collect all files which might be affected
816 files = set(old.files()) 820 files = set(old.files())
817 for u in updates: 821 for u in updates:
871 newid = repo.commitctx(new) 875 newid = repo.commitctx(new)
872 new = repo[newid] 876 new = repo[newid]
873 created = len(repo) != revcount 877 created = len(repo) != revcount
874 updatebookmarks(newid) 878 updatebookmarks(newid)
875 879
880 tr.close()
876 return newid, created 881 return newid, created
882 finally:
883 lockmod.release(lock, wlock, tr)
877 884
878 class MergeFailure(util.Abort): 885 class MergeFailure(util.Abort):
879 pass 886 pass
880 887
881 def relocate(repo, orig, dest, keepbranch=False): 888 def relocate(repo, orig, dest, keepbranch=False):
970 for book in oldbookmarks: 977 for book in oldbookmarks:
971 repo._bookmarks[book] = dest.node() 978 repo._bookmarks[book] = dest.node()
972 for book in destbookmarks: # restore bookmark that rebase move 979 for book in destbookmarks: # restore bookmark that rebase move
973 repo._bookmarks[book] = dest.node() 980 repo._bookmarks[book] = dest.node()
974 if oldbookmarks or destbookmarks: 981 if oldbookmarks or destbookmarks:
975 repo._bookmarks.write() 982 repo._bookmarks.recordchange(tr)
976 tr.close() 983 tr.close()
977 finally: 984 finally:
978 tr.release() 985 tr.release()
979 return nodenew 986 return nodenew
980 987
981 def _bookmarksupdater(repo, oldid): 988 def _bookmarksupdater(repo, oldid, tr):
982 """Return a callable update(newid) updating the current bookmark 989 """Return a callable update(newid) updating the current bookmark
983 and bookmarks bound to oldid to newid. 990 and bookmarks bound to oldid to newid.
984 """ 991 """
985 def updatebookmarks(newid): 992 def updatebookmarks(newid):
986 dirty = False 993 dirty = False
988 if oldbookmarks: 995 if oldbookmarks:
989 for b in oldbookmarks: 996 for b in oldbookmarks:
990 repo._bookmarks[b] = newid 997 repo._bookmarks[b] = newid
991 dirty = True 998 dirty = True
992 if dirty: 999 if dirty:
993 repo._bookmarks.write() 1000 repo._bookmarks.recordchange(tr)
994 return updatebookmarks 1001 return updatebookmarks
995 1002
996 ### bookmarks api compatibility layer ### 1003 ### bookmarks api compatibility layer ###
997 def bmdeactivate(repo): 1004 def bmdeactivate(repo):
998 try: 1005 try:
1780 repo.ui.write('hg commit --msg "bumped update to %s"') 1787 repo.ui.write('hg commit --msg "bumped update to %s"')
1781 return 0 1788 return 0
1782 if progresscb: progresscb() 1789 if progresscb: progresscb()
1783 newid = tmpctx = None 1790 newid = tmpctx = None
1784 tmpctx = bumped 1791 tmpctx = bumped
1785 bmupdate = _bookmarksupdater(repo, bumped.node())
1786 # Basic check for common parent. Far too complicated and fragile 1792 # Basic check for common parent. Far too complicated and fragile
1787 tr = repo.transaction('bumped-stabilize') 1793 tr = repo.transaction('bumped-stabilize')
1794 bmupdate = _bookmarksupdater(repo, bumped.node(), tr)
1788 try: 1795 try:
1789 if not list(repo.set('parents(%d) and parents(%d)', bumped, prec)): 1796 if not list(repo.set('parents(%d) and parents(%d)', bumped, prec)):
1790 # Need to rebase the changeset at the right place 1797 # Need to rebase the changeset at the right place
1791 repo.ui.status( 1798 repo.ui.status(
1792 _('rebasing to destination parent: %s\n') % prec.p1()) 1799 _('rebasing to destination parent: %s\n') % prec.p1())
2336 # 2343 #
2337 # but then revset took a lazy arrow in the knee and became much 2344 # but then revset took a lazy arrow in the knee and became much
2338 # slower. The new forms makes as much sense and a much faster. 2345 # slower. The new forms makes as much sense and a much faster.
2339 for dest in ctx.ancestors(): 2346 for dest in ctx.ancestors():
2340 if not dest.obsolete(): 2347 if not dest.obsolete():
2341 updatebookmarks = _bookmarksupdater(repo, ctx.node()) 2348 updatebookmarks = _bookmarksupdater(repo, ctx.node(), tr)
2342 updatebookmarks(dest.node()) 2349 updatebookmarks(dest.node())
2343 break 2350 break
2344 2351
2345 tr.close() 2352 tr.close()
2346 finally: 2353 finally:
2521 if old.phase() == phases.public: 2528 if old.phase() == phases.public:
2522 raise util.Abort(_("cannot rewrite immutable changeset")) 2529 raise util.Abort(_("cannot rewrite immutable changeset"))
2523 if len(old.parents()) > 1: 2530 if len(old.parents()) > 1:
2524 raise util.Abort(_("cannot uncommit merge changeset")) 2531 raise util.Abort(_("cannot uncommit merge changeset"))
2525 oldphase = old.phase() 2532 oldphase = old.phase()
2526 updatebookmarks = _bookmarksupdater(repo, old.node())
2527 2533
2528 2534
2529 rev = None 2535 rev = None
2530 if opts.get('rev'): 2536 if opts.get('rev'):
2531 rev = scmutil.revsingle(repo, opts.get('rev')) 2537 rev = scmutil.revsingle(repo, opts.get('rev'))
2538 if disallowunstable and not onahead: 2544 if disallowunstable and not onahead:
2539 raise util.Abort(_("cannot uncommit in the middle of a stack")) 2545 raise util.Abort(_("cannot uncommit in the middle of a stack"))
2540 2546
2541 # Recommit the filtered changeset 2547 # Recommit the filtered changeset
2542 tr = repo.transaction('uncommit') 2548 tr = repo.transaction('uncommit')
2549 updatebookmarks = _bookmarksupdater(repo, old.node(), tr)
2543 newid = None 2550 newid = None
2544 includeorexclude = opts.get('include') or opts.get('exclude') 2551 includeorexclude = opts.get('include') or opts.get('exclude')
2545 if (pats or includeorexclude or opts.get('all')): 2552 if (pats or includeorexclude or opts.get('all')):
2546 match = scmutil.match(old, pats, opts) 2553 match = scmutil.match(old, pats, opts)
2547 newid = _commitfiltered(repo, old, match, target=rev) 2554 newid = _commitfiltered(repo, old, match, target=rev)
2632 raise util.Abort(_("cannot split commit: %s not a head") % ctx) 2639 raise util.Abort(_("cannot split commit: %s not a head") % ctx)
2633 2640
2634 if len(ctx.parents()) > 1: 2641 if len(ctx.parents()) > 1:
2635 raise util.Abort(_("cannot split merge commits")) 2642 raise util.Abort(_("cannot split merge commits"))
2636 prev = ctx.p1() 2643 prev = ctx.p1()
2637 bmupdate = _bookmarksupdater(repo, ctx.node()) 2644 bmupdate = _bookmarksupdater(repo, ctx.node(), tr)
2638 bookactive = bmactive(repo) 2645 bookactive = bmactive(repo)
2639 if bookactive is not None: 2646 if bookactive is not None:
2640 repo.ui.status(_("(leaving bookmark %s)\n") % bmactive(repo)) 2647 repo.ui.status(_("(leaving bookmark %s)\n") % bmactive(repo))
2641 bmdeactivate(repo) 2648 bmdeactivate(repo)
2642 hg.update(repo, prev) 2649 hg.update(repo, prev)