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 |