hgext/rebase.py
changeset 46801 32399d0813e0
parent 46677 7ed7b13fc00a
child 46831 7d80622fc212
equal deleted inserted replaced
46800:186c0f6fbc16 46801:32399d0813e0
   359             return
   359             return
   360         obsoleteset = set(obsoleterevs)
   360         obsoleteset = set(obsoleterevs)
   361         (
   361         (
   362             self.obsoletenotrebased,
   362             self.obsoletenotrebased,
   363             self.obsoletewithoutsuccessorindestination,
   363             self.obsoletewithoutsuccessorindestination,
   364             obsoleteextinctsuccessors,
       
   365         ) = _computeobsoletenotrebased(self.repo, obsoleteset, destmap)
   364         ) = _computeobsoletenotrebased(self.repo, obsoleteset, destmap)
   366         skippedset = set(self.obsoletenotrebased)
   365         skippedset = set(self.obsoletenotrebased)
   367         skippedset.update(self.obsoletewithoutsuccessorindestination)
   366         skippedset.update(self.obsoletewithoutsuccessorindestination)
   368         skippedset.update(obsoleteextinctsuccessors)
       
   369         _checkobsrebase(self.repo, self.ui, obsoleteset, skippedset)
   367         _checkobsrebase(self.repo, self.ui, obsoleteset, skippedset)
   370 
   368 
   371     def _prepareabortorcontinue(
   369     def _prepareabortorcontinue(
   372         self, isabort, backup=True, suppwarns=False, dryrun=False, confirm=False
   370         self, isabort, backup=True, suppwarns=False, dryrun=False, confirm=False
   373     ):
   371     ):
  2190     `obsoletenotrebased` is a mapping mapping obsolete => successor for all
  2188     `obsoletenotrebased` is a mapping mapping obsolete => successor for all
  2191     obsolete nodes to be rebased given in `rebaseobsrevs`.
  2189     obsolete nodes to be rebased given in `rebaseobsrevs`.
  2192 
  2190 
  2193     `obsoletewithoutsuccessorindestination` is a set with obsolete revisions
  2191     `obsoletewithoutsuccessorindestination` is a set with obsolete revisions
  2194     without a successor in destination.
  2192     without a successor in destination.
  2195 
       
  2196     `obsoleteextinctsuccessors` is a set of obsolete revisions with only
       
  2197     obsolete successors.
       
  2198     """
  2193     """
  2199     obsoletenotrebased = {}
  2194     obsoletenotrebased = {}
  2200     obsoletewithoutsuccessorindestination = set()
  2195     obsoletewithoutsuccessorindestination = set()
  2201     obsoleteextinctsuccessors = set()
       
  2202 
  2196 
  2203     assert repo.filtername is None
  2197     assert repo.filtername is None
  2204     cl = repo.changelog
  2198     cl = repo.changelog
  2205     get_rev = cl.index.get_rev
  2199     get_rev = cl.index.get_rev
  2206     extinctrevs = set(repo.revs(b'extinct()'))
  2200     extinctrevs = set(repo.revs(b'extinct()'))
  2210         successors = set(obsutil.allsuccessors(repo.obsstore, [srcnode]))
  2204         successors = set(obsutil.allsuccessors(repo.obsstore, [srcnode]))
  2211         # obsutil.allsuccessors includes node itself
  2205         # obsutil.allsuccessors includes node itself
  2212         successors.remove(srcnode)
  2206         successors.remove(srcnode)
  2213         succrevs = {get_rev(s) for s in successors}
  2207         succrevs = {get_rev(s) for s in successors}
  2214         succrevs.discard(None)
  2208         succrevs.discard(None)
  2215         if succrevs.issubset(extinctrevs):
  2209         if not successors or succrevs.issubset(extinctrevs):
  2216             # all successors are extinct
  2210             # no successor, or all successors are extinct
  2217             obsoleteextinctsuccessors.add(srcrev)
       
  2218         if not successors:
       
  2219             # no successor
       
  2220             obsoletenotrebased[srcrev] = None
  2211             obsoletenotrebased[srcrev] = None
  2221         else:
  2212         else:
  2222             dstrev = destmap[srcrev]
  2213             dstrev = destmap[srcrev]
  2223             for succrev in succrevs:
  2214             for succrev in succrevs:
  2224                 if cl.isancestorrev(succrev, dstrev):
  2215                 if cl.isancestorrev(succrev, dstrev):
  2229                 # destination (which would be catched above), we shall skip it
  2220                 # destination (which would be catched above), we shall skip it
  2230                 # and its descendants to avoid divergence.
  2221                 # and its descendants to avoid divergence.
  2231                 if srcrev in extinctrevs or any(s in destmap for s in succrevs):
  2222                 if srcrev in extinctrevs or any(s in destmap for s in succrevs):
  2232                     obsoletewithoutsuccessorindestination.add(srcrev)
  2223                     obsoletewithoutsuccessorindestination.add(srcrev)
  2233 
  2224 
  2234     return (
  2225     return obsoletenotrebased, obsoletewithoutsuccessorindestination
  2235         obsoletenotrebased,
       
  2236         obsoletewithoutsuccessorindestination,
       
  2237         obsoleteextinctsuccessors,
       
  2238     )
       
  2239 
  2226 
  2240 
  2227 
  2241 def abortrebase(ui, repo):
  2228 def abortrebase(ui, repo):
  2242     with repo.wlock(), repo.lock():
  2229     with repo.wlock(), repo.lock():
  2243         rbsrt = rebaseruntime(repo, ui)
  2230         rbsrt = rebaseruntime(repo, ui)