hgext/rebase.py
changeset 27012 5eac7ab59b95
parent 27010 f4fec0940278
child 27013 e97132eb841c
equal deleted inserted replaced
27011:53c668dc6b16 27012:5eac7ab59b95
    30 revtodo = -1
    30 revtodo = -1
    31 nullmerge = -2
    31 nullmerge = -2
    32 revignored = -3
    32 revignored = -3
    33 # To do with obsolescence
    33 # To do with obsolescence
    34 revprecursor = -4
    34 revprecursor = -4
       
    35 revpruned = -5
    35 
    36 
    36 cmdtable = {}
    37 cmdtable = {}
    37 command = cmdutil.command(cmdtable)
    38 command = cmdutil.command(cmdtable)
    38 # Note for extension authors: ONLY specify testedwith = 'internal' for
    39 # Note for extension authors: ONLY specify testedwith = 'internal' for
    39 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
    40 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
   485                 targetctx = repo[obsoletenotrebased[rev]]
   486                 targetctx = repo[obsoletenotrebased[rev]]
   486                 desctarget = '%d:%s "%s"' % (targetctx.rev(), targetctx,
   487                 desctarget = '%d:%s "%s"' % (targetctx.rev(), targetctx,
   487                              targetctx.description().split('\n', 1)[0])
   488                              targetctx.description().split('\n', 1)[0])
   488                 msg = _('note: not rebasing %s, already in destination as %s\n')
   489                 msg = _('note: not rebasing %s, already in destination as %s\n')
   489                 ui.status(msg % (desc, desctarget))
   490                 ui.status(msg % (desc, desctarget))
       
   491             elif state[rev] == revpruned:
       
   492                 msg = _('note: not rebasing %s, it has no successor\n')
       
   493                 ui.status(msg % desc)
   490             else:
   494             else:
   491                 ui.status(_('already rebased %s as %s\n') %
   495                 ui.status(_('already rebased %s as %s\n') %
   492                           (desc, repo[state[rev]]))
   496                           (desc, repo[state[rev]]))
   493 
   497 
   494         ui.progress(_('rebasing'), None)
   498         ui.progress(_('rebasing'), None)
   674     if p1n in targetancestors:
   678     if p1n in targetancestors:
   675         p1 = target
   679         p1 = target
   676     elif p1n in state:
   680     elif p1n in state:
   677         if state[p1n] == nullmerge:
   681         if state[p1n] == nullmerge:
   678             p1 = target
   682             p1 = target
   679         elif state[p1n] in (revignored, revprecursor):
   683         elif state[p1n] in (revignored, revprecursor, revpruned):
   680             p1 = nearestrebased(repo, p1n, state)
   684             p1 = nearestrebased(repo, p1n, state)
   681             if p1 is None:
   685             if p1 is None:
   682                 p1 = target
   686                 p1 = target
   683         else:
   687         else:
   684             p1 = state[p1n]
   688             p1 = state[p1n]
   690         p2n = parents[1].rev()
   694         p2n = parents[1].rev()
   691         # interesting second parent
   695         # interesting second parent
   692         if p2n in state:
   696         if p2n in state:
   693             if p1 == target: # p1n in targetancestors or external
   697             if p1 == target: # p1n in targetancestors or external
   694                 p1 = state[p2n]
   698                 p1 = state[p2n]
   695             elif state[p2n] in (revignored, revprecursor):
   699             elif state[p2n] in (revignored, revprecursor, revpruned):
   696                 p2 = nearestrebased(repo, p2n, state)
   700                 p2 = nearestrebased(repo, p2n, state)
   697                 if p2 is None:
   701                 if p2 is None:
   698                     # no ancestors rebased yet, detach
   702                     # no ancestors rebased yet, detach
   699                     p2 = target
   703                     p2 = target
   700             else:
   704             else:
   880                 # check that the line doesn't look like the oldrev:newrev lines
   884                 # check that the line doesn't look like the oldrev:newrev lines
   881                 activebookmark = l
   885                 activebookmark = l
   882             else:
   886             else:
   883                 oldrev, newrev = l.split(':')
   887                 oldrev, newrev = l.split(':')
   884                 if newrev in (str(nullmerge), str(revignored),
   888                 if newrev in (str(nullmerge), str(revignored),
   885                               str(revprecursor)):
   889                               str(revprecursor), str(revpruned)):
   886                     state[repo[oldrev].rev()] = int(newrev)
   890                     state[repo[oldrev].rev()] = int(newrev)
   887                 elif newrev == nullid:
   891                 elif newrev == nullid:
   888                     state[repo[oldrev].rev()] = revtodo
   892                     state[repo[oldrev].rev()] = revtodo
   889                     # Legacy compat special case
   893                     # Legacy compat special case
   890                 else:
   894                 else:
  1064         # a rebase destination that make sense regarding rebased topology.
  1068         # a rebase destination that make sense regarding rebased topology.
  1065         rebasedomain = set(repo.revs('%ld::%ld', rebaseset, rebaseset))
  1069         rebasedomain = set(repo.revs('%ld::%ld', rebaseset, rebaseset))
  1066         for ignored in set(rebasedomain) - set(rebaseset):
  1070         for ignored in set(rebasedomain) - set(rebaseset):
  1067             state[ignored] = revignored
  1071             state[ignored] = revignored
  1068     for r in obsoletenotrebased:
  1072     for r in obsoletenotrebased:
  1069         state[r] = revprecursor
  1073         if obsoletenotrebased[r] is None:
       
  1074             state[r] = revpruned
       
  1075         else:
       
  1076             state[r] = revprecursor
  1070     return repo['.'].rev(), dest.rev(), state
  1077     return repo['.'].rev(), dest.rev(), state
  1071 
  1078 
  1072 def clearrebased(ui, repo, state, skipped, collapsedas=None):
  1079 def clearrebased(ui, repo, state, skipped, collapsedas=None):
  1073     """dispose of rebased revision at the end of the rebase
  1080     """dispose of rebased revision at the end of the rebase
  1074 
  1081 
  1178     blockers.update(getattr(repo, '_rebaseset', ()))
  1185     blockers.update(getattr(repo, '_rebaseset', ()))
  1179     return blockers
  1186     return blockers
  1180 
  1187 
  1181 def _computeobsoletenotrebased(repo, rebasesetrevs, dest):
  1188 def _computeobsoletenotrebased(repo, rebasesetrevs, dest):
  1182     """return a mapping obsolete => successor for all obsolete nodes to be
  1189     """return a mapping obsolete => successor for all obsolete nodes to be
  1183     rebased that have a successors in the destination"""
  1190     rebased that have a successors in the destination
       
  1191 
       
  1192     obsolete => None entries in the mapping indicate nodes with no succesor"""
  1184     obsoletenotrebased = {}
  1193     obsoletenotrebased = {}
  1185 
  1194 
  1186     # Build a mapping successor => obsolete nodes for the obsolete
  1195     # Build a mapping successor => obsolete nodes for the obsolete
  1187     # nodes to be rebased
  1196     # nodes to be rebased
  1188     allsuccessors = {}
  1197     allsuccessors = {}
  1204                             stoprev=min(allsuccessors),
  1213                             stoprev=min(allsuccessors),
  1205                             inclusive=True)
  1214                             inclusive=True)
  1206         for s in allsuccessors:
  1215         for s in allsuccessors:
  1207             if s in ancs:
  1216             if s in ancs:
  1208                 obsoletenotrebased[allsuccessors[s]] = s
  1217                 obsoletenotrebased[allsuccessors[s]] = s
       
  1218             elif (s == allsuccessors[s] and
       
  1219                   allsuccessors.values().count(s) == 1):
       
  1220                 # plain prune
       
  1221                 obsoletenotrebased[s] = None
       
  1222 
  1209     return obsoletenotrebased
  1223     return obsoletenotrebased
  1210 
  1224 
  1211 def summaryhook(ui, repo):
  1225 def summaryhook(ui, repo):
  1212     if not os.path.exists(repo.join('rebasestate')):
  1226     if not os.path.exists(repo.join('rebasestate')):
  1213         return
  1227         return