comparison hgext/rebase.py @ 28685:6c4d23fe611c

rebase: refactor of error handling code path for rebaseskipobsolete This patch extracts the error handling code path to go in a separate function. In the next patch we will able to reuse this logic and avoid duplicated code.
author Laurent Charignon <lcharignon@fb.com>
date Tue, 29 Mar 2016 11:49:45 -0700
parents a47881680402
children b212e01fead0
comparison
equal deleted inserted replaced
28684:1ace17e1e160 28685:6c4d23fe611c
303 rebaseobsrevs = _filterobsoleterevs(repo, rebasesetrevs) 303 rebaseobsrevs = _filterobsoleterevs(repo, rebasesetrevs)
304 obsoletenotrebased = _computeobsoletenotrebased(repo, 304 obsoletenotrebased = _computeobsoletenotrebased(repo,
305 rebaseobsrevs, 305 rebaseobsrevs,
306 dest) 306 dest)
307 rebaseobsskipped = set(obsoletenotrebased) 307 rebaseobsskipped = set(obsoletenotrebased)
308 308 _checkobsrebase(repo, ui, rebaseobsrevs,
309 # Obsolete node with successors not in dest leads to divergence 309 rebasesetrevs,
310 divergenceok = ui.configbool('experimental', 310 rebaseobsskipped)
311 'allowdivergence')
312 divergencebasecandidates = rebaseobsrevs - rebaseobsskipped
313
314 if divergencebasecandidates and not divergenceok:
315 divhashes = (str(repo[r])
316 for r in divergencebasecandidates)
317 msg = _("this rebase will cause "
318 "divergences from: %s")
319 h = _("to force the rebase please set "
320 "experimental.allowdivergence=True")
321 raise error.Abort(msg % (",".join(divhashes),), hint=h)
322
323 # - plain prune (no successor) changesets are rebased
324 # - split changesets are not rebased if at least one of the
325 # changeset resulting from the split is an ancestor of dest
326 rebaseset = rebasesetrevs - rebaseobsskipped
327 if rebasesetrevs and not rebaseset:
328 msg = _('all requested changesets have equivalents '
329 'or were marked as obsolete')
330 hint = _('to force the rebase, set the config '
331 'experimental.rebaseskipobsolete to False')
332 raise error.Abort(msg, hint=hint)
333 311
334 result = buildstate(repo, dest, rebaseset, collapsef, 312 result = buildstate(repo, dest, rebaseset, collapsef,
335 obsoletenotrebased) 313 obsoletenotrebased)
336 314
337 if not result: 315 if not result:
707 if candidates: 685 if candidates:
708 return state[candidates.first()] 686 return state[candidates.first()]
709 else: 687 else:
710 return None 688 return None
711 689
690 def _checkobsrebase(repo, ui,
691 rebaseobsrevs,
692 rebasesetrevs,
693 rebaseobsskipped):
694 """
695 Abort if rebase will create divergence or rebase is noop because of markers
696
697 `rebaseobsrevs`: set of obsolete revision in source
698 `rebasesetrevs`: set of revisions to be rebased from source
699 `rebaseobsskipped`: set of revisions from source skipped because they have
700 successors in destination
701 """
702 # Obsolete node with successors not in dest leads to divergence
703 divergenceok = ui.configbool('experimental',
704 'allowdivergence')
705 divergencebasecandidates = rebaseobsrevs - rebaseobsskipped
706
707 if divergencebasecandidates and not divergenceok:
708 divhashes = (str(repo[r])
709 for r in divergencebasecandidates)
710 msg = _("this rebase will cause "
711 "divergences from: %s")
712 h = _("to force the rebase please set "
713 "experimental.allowdivergence=True")
714 raise error.Abort(msg % (",".join(divhashes),), hint=h)
715
716 # - plain prune (no successor) changesets are rebased
717 # - split changesets are not rebased if at least one of the
718 # changeset resulting from the split is an ancestor of dest
719 rebaseset = rebasesetrevs - rebaseobsskipped
720 if rebasesetrevs and not rebaseset:
721 msg = _('all requested changesets have equivalents '
722 'or were marked as obsolete')
723 hint = _('to force the rebase, set the config '
724 'experimental.rebaseskipobsolete to False')
725 raise error.Abort(msg, hint=hint)
726
712 def defineparents(repo, rev, target, state, targetancestors): 727 def defineparents(repo, rev, target, state, targetancestors):
713 'Return the new parent relationship of the revision that will be rebased' 728 'Return the new parent relationship of the revision that will be rebased'
714 parents = repo[rev].parents() 729 parents = repo[rev].parents()
715 p1 = p2 = nullrev 730 p1 = p2 = nullrev
716 731