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'] = [] |