hgext/evolve.py
changeset 482 d2531a747ff5
parent 481 4e0f1aae8d24
child 484 20e2f2dd71f1
equal deleted inserted replaced
481:4e0f1aae8d24 482:d2531a747ff5
   841         finally:
   841         finally:
   842             lock.release()
   842             lock.release()
   843     finally:
   843     finally:
   844         wlock.release()
   844         wlock.release()
   845 
   845 
       
   846 @command('^fold',
       
   847     [('r', 'rev', [], 'revision to fold'),],
       
   848     # allow to choose the seed ?
       
   849     _('[-r] revs'))
       
   850 def fold(ui, repo, *revs, **opts):
       
   851     """Fold multiple revision into a single one"""
       
   852     revs = list(revs)
       
   853     revs.extend(opts['rev'])
       
   854     if not revs:
       
   855         revs = ['.']
       
   856     revs = scmutil.revrange(repo, revs)
       
   857     if not revs:
       
   858         ui.write_err('no revision to fold\n')
       
   859         return 1
       
   860     roots = repo.revs('roots(%ld)', revs)
       
   861     if len(roots) > 1:
       
   862         raise util.Abort("set have multiple roots")
       
   863     root = repo[roots[0]]
       
   864     if root.phase() <= phases.public:
       
   865         raise util.Abort("can't touch public revision")
       
   866     heads = repo.revs('heads(%ld)', revs)
       
   867     if len(heads) > 1:
       
   868         raise util.Abort("set have multiple heads")
       
   869     head = repo[heads[0]]
       
   870     obsolete = extensions.find('obsolete')
       
   871     wlock = repo.wlock()
       
   872     try:
       
   873         lock = repo.lock()
       
   874         try:
       
   875             tr = repo.transaction('touch')
       
   876             try:
       
   877                 allctx = [repo[r] for r in revs]
       
   878                 targetphase = max(c.phase() for c in allctx)
       
   879                 msg = '\n\n***\n\n'.join(c.description() for c in allctx)
       
   880                 newid, _ = rewrite(repo, root, allctx, head,
       
   881                                  [root.p1().node(), root.p2().node()],
       
   882                                  commitopts={'message': msg})
       
   883                 phases.retractboundary(repo, targetphase, [newid])
       
   884                 obsolete.createmarkers(repo, [(ctx, (repo[newid],))
       
   885                                                for ctx in allctx])
       
   886                 tr.close()
       
   887             finally:
       
   888                 tr.release()
       
   889         finally:
       
   890             lock.release()
       
   891         ui.status('%i changesets folded\n' % len(revs))
       
   892         if repo.revs('. and %ld', revs):
       
   893             repo.dirstate.setparents(newid, node.nullid)
       
   894     finally:
       
   895         wlock.release()
       
   896 
   846 
   897 
   847 def graftwrapper(orig, ui, repo, *revs, **kwargs):
   898 def graftwrapper(orig, ui, repo, *revs, **kwargs):
   848     kwargs = dict(kwargs)
   899     kwargs = dict(kwargs)
   849     revs = list(revs) + kwargs.get('rev', [])
   900     revs = list(revs) + kwargs.get('rev', [])
   850     kwargs['rev'] = []
   901     kwargs['rev'] = []