hgext/evolve.py
changeset 1589 d6630a6bff86
parent 1580 b915e0d54db0
child 1592 f157ef7b1741
equal deleted inserted replaced
1588:983f2e4dbe5d 1589:d6630a6bff86
  2822     return cmdprune(ui, repo, *revs, **kwargs)
  2822     return cmdprune(ui, repo, *revs, **kwargs)
  2823 
  2823 
  2824 @command('^touch',
  2824 @command('^touch',
  2825     [('r', 'rev', [], 'revision to update'),
  2825     [('r', 'rev', [], 'revision to update'),
  2826      ('D', 'duplicate', False,
  2826      ('D', 'duplicate', False,
  2827       'do not mark the new revision as successor of the old one')],
  2827       'do not mark the new revision as successor of the old one'),
       
  2828      ('A', 'allowdivergence', False,
       
  2829       'mark the new revision as successor of the old one potentially creating '
       
  2830       'divergence')],
  2828     # allow to choose the seed ?
  2831     # allow to choose the seed ?
  2829     _('[-r] revs'))
  2832     _('[-r] revs'))
  2830 def touch(ui, repo, *revs, **opts):
  2833 def touch(ui, repo, *revs, **opts):
  2831     """create successors that are identical to their predecessors except
  2834     """create successors that are identical to their predecessors except
  2832     for the changeset ID
  2835     for the changeset ID
  2833 
  2836 
  2834     This is used to "resurrect" changesets
  2837     This is used to "resurrect" changesets
  2835     """
  2838     """
  2836     duplicate = opts['duplicate']
  2839     duplicate = opts['duplicate']
       
  2840     allowdivergence = opts['allowdivergence']
  2837     revs = list(revs)
  2841     revs = list(revs)
  2838     revs.extend(opts['rev'])
  2842     revs.extend(opts['rev'])
  2839     if not revs:
  2843     if not revs:
  2840         revs = ['.']
  2844         revs = ['.']
  2841     revs = scmutil.revrange(repo, revs)
  2845     revs = scmutil.revrange(repo, revs)
  2842     if not revs:
  2846     if not revs:
  2843         ui.write_err('no revision to touch\n')
  2847         ui.write_err('no revision to touch\n')
  2844         return 1
  2848         return 1
  2845     if not duplicate and repo.revs('public() and %ld', revs):
  2849     if not duplicate and repo.revs('public() and %ld', revs):
  2846         raise error.Abort("can't touch public revision")
  2850         raise error.Abort("can't touch public revision")
       
  2851     displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate})
  2847     wlock = lock = tr = None
  2852     wlock = lock = tr = None
  2848     try:
  2853     try:
  2849         wlock = repo.wlock()
  2854         wlock = repo.wlock()
  2850         lock = repo.lock()
  2855         lock = repo.lock()
  2851         tr = repo.transaction('touch')
  2856         tr = repo.transaction('touch')
  2858             # search for touched parent
  2863             # search for touched parent
  2859             p1 = ctx.p1().node()
  2864             p1 = ctx.p1().node()
  2860             p2 = ctx.p2().node()
  2865             p2 = ctx.p2().node()
  2861             p1 = newmapping.get(p1, p1)
  2866             p1 = newmapping.get(p1, p1)
  2862             p2 = newmapping.get(p2, p2)
  2867             p2 = newmapping.get(p2, p2)
       
  2868 
       
  2869             if not (duplicate or allowdivergence):
       
  2870                 # The user hasn't yet decided what to do with the revived
       
  2871                 # cset, let's ask
       
  2872                 sset = obsolete.successorssets(repo, ctx.node())
       
  2873                 nodivergencerisk = len(sset) == 0 or (
       
  2874                                     len(sset) == 1 and
       
  2875                                     len(sset[0]) == 1 and
       
  2876                                     repo[sset[0][0]].rev() == ctx.rev()
       
  2877                                    )
       
  2878                 if nodivergencerisk:
       
  2879                     duplicate = False
       
  2880                 else:
       
  2881                     displayer.show(ctx)
       
  2882                     index = ui.promptchoice(
       
  2883                         _("reviving this changeset will create divergence"
       
  2884                         " unless you make a duplicate.\n(a)llow divergence or"
       
  2885                         " (d)uplicate the changeset? $$ &Allowdivergence $$ "
       
  2886                         "&Duplicate"), 0)
       
  2887                     choice = ['allowdivergence', 'duplicate'][index]
       
  2888                     if choice == 'allowdivergence':
       
  2889                         duplicate = False
       
  2890                     else:
       
  2891                         duplicate = True
       
  2892 
  2863             new, unusedvariable = rewrite(repo, ctx, [], ctx,
  2893             new, unusedvariable = rewrite(repo, ctx, [], ctx,
  2864                                           [p1, p2],
  2894                                           [p1, p2],
  2865                                           commitopts={'extra': extra})
  2895                                           commitopts={'extra': extra})
  2866             # store touched version to help potential children
  2896             # store touched version to help potential children
  2867             newmapping[ctx.node()] = new
  2897             newmapping[ctx.node()] = new
       
  2898 
  2868             if not duplicate:
  2899             if not duplicate:
  2869                 obsolete.createmarkers(repo, [(ctx, (repo[new],))])
  2900                 obsolete.createmarkers(repo, [(ctx, (repo[new],))])
  2870             phases.retractboundary(repo, tr, ctx.phase(), [new])
  2901             phases.retractboundary(repo, tr, ctx.phase(), [new])
  2871             if ctx in repo[None].parents():
  2902             if ctx in repo[None].parents():
  2872                 repo.dirstate.beginparentchange()
  2903                 repo.dirstate.beginparentchange()