Mercurial > evolve
view hgext3rd/evolve/compat.py @ 3283:039c4b8dc3ed
obsnote: warn if user try to store a note in obsmarker on an older hg
Support to store a note in obsmarker is from hg>=4.4. We have added notes
support to all the evolve commands but we do support versions which don't
support storing note in obsmarker. Warn if user tries to store a note in older
hg.
author | Pulkit Goyal <7895pulkit@gmail.com> |
---|---|
date | Tue, 12 Dec 2017 00:27:08 +0530 |
parents | 8d57acde165d |
children | f4b06f44d274 |
line wrap: on
line source
# Copyright 2017 Octobus <contact@octobus.net> # # This software may be used and distributed according to the terms of the # GNU General Public License version 2 or any later version. """ Compatibility module """ from mercurial import ( copies, context, hg, obsolete, revset, util, ) try: from mercurial import obsutil obsutil.closestpredecessors except ImportError: obsutil = None from . import ( exthelper, ) eh = exthelper.exthelper() if not util.safehasattr(hg, '_copycache'): # exact copy of relevantmarkers as in Mercurial-176d1a0ce385 # this fixes relevant markers computation for version < hg-4.3 @eh.wrapfunction(obsolete.obsstore, 'relevantmarkers') def relevantmarkers(orig, self, nodes): """return a set of all obsolescence markers relevant to a set of nodes. "relevant" to a set of nodes mean: - marker that use this changeset as successor - prune marker of direct children on this changeset - recursive application of the two rules on precursors of these markers It is a set so you cannot rely on order. Backport of mercurial changeset 176d1a0ce385 for version < 4.3 """ pendingnodes = set(nodes) seenmarkers = set() seennodes = set(pendingnodes) precursorsmarkers = self.predecessors succsmarkers = self.successors children = self.children while pendingnodes: direct = set() for current in pendingnodes: direct.update(precursorsmarkers.get(current, ())) pruned = [m for m in children.get(current, ()) if not m[1]] direct.update(pruned) pruned = [m for m in succsmarkers.get(current, ()) if not m[1]] direct.update(pruned) direct -= seenmarkers pendingnodes = set([m[0] for m in direct]) seenmarkers |= direct pendingnodes -= seennodes seennodes |= pendingnodes return seenmarkers # successors set move from mercurial.obsolete to mercurial.obsutil in 4.3 def successorssets(*args, **kwargs): func = getattr(obsutil, 'successorssets', None) if func is None: func = obsolete.successorssets return func(*args, **kwargs) # allprecursors set move from mercurial.obsolete to mercurial.obsutil in 4.3 # allprecursors was renamed into allpredecessors in 4.4 def allprecursors(*args, **kwargs): func = getattr(obsutil, 'allpredecessors', None) if func is None: func = getattr(obsutil, 'allprecursors', None) if func is None: func = obsolete.allprecursors return func(*args, **kwargs) # compatibility layer for mercurial < 4.3 def bookmarkapplychanges(repo, tr, changes): """Apply a list of changes to bookmarks """ bookmarks = repo._bookmarks if util.safehasattr(bookmarks, 'applychanges'): return bookmarks.applychanges(repo, tr, changes) for name, node in changes: if node is None: del bookmarks[name] else: bookmarks[name] = node bookmarks.recordchange(tr) def isobsnotesupported(): # hack to know obsnote is supported. The patches for obsnote support was # pushed before the obsfateprinter patches, so this will serve as a good # check if not obsutil: return False return util.safehasattr(obsutil, 'obsfateprinter') # Evolution renaming compat TROUBLES = {} if not util.safehasattr(context.basectx, 'orphan'): TROUBLES['ORPHAN'] = 'unstable' context.basectx.orphan = context.basectx.unstable else: TROUBLES['ORPHAN'] = 'orphan' if not util.safehasattr(context.basectx, 'contentdivergent'): TROUBLES['CONTENTDIVERGENT'] = 'divergent' context.basectx.contentdivergent = context.basectx.divergent else: TROUBLES['CONTENTDIVERGENT'] = 'content-divergent' if not util.safehasattr(context.basectx, 'phasedivergent'): TROUBLES['PHASEDIVERGENT'] = 'bumped' context.basectx.phasedivergent = context.basectx.bumped else: TROUBLES['PHASEDIVERGENT'] = 'phase-divergent' if not util.safehasattr(context.basectx, 'isunstable'): context.basectx.isunstable = context.basectx.troubled if not util.safehasattr(revset, 'orphan'): @eh.revset('orphan') def oprhanrevset(*args, **kwargs): return revset.unstable(*args, **kwargs) if not util.safehasattr(revset, 'contentdivergent'): @eh.revset('contentdivergent') def contentdivergentrevset(*args, **kwargs): return revset.divergent(*args, **kwargs) if not util.safehasattr(revset, 'phasedivergent'): @eh.revset('phasedivergent') def phasedivergentrevset(*args, **kwargs): return revset.bumped(*args, **kwargs) if not util.safehasattr(context.basectx, 'instabilities'): def instabilities(self): """return the list of instabilities affecting this changeset. Instabilities are returned as strings. possible values are: - orphan, - phase-divergent, - content-divergent. """ instabilities = [] if self.orphan(): instabilities.append('orphan') if self.phasedivergent(): instabilities.append('phase-divergent') if self.contentdivergent(): instabilities.append('content-divergent') return instabilities context.basectx.instabilities = instabilities # XXX: Better detection of property cache if 'predecessors' not in dir(obsolete.obsstore): @property def predecessors(self): return self.precursors obsolete.obsstore.predecessors = predecessors if not util.safehasattr(obsolete, '_computeorphanset'): obsolete._computeorphanset = obsolete.cachefor('orphan')(obsolete._computeunstableset) if not util.safehasattr(obsolete, '_computecontentdivergentset'): obsolete._computecontentdivergentset = obsolete.cachefor('contentdivergent')(obsolete._computedivergentset) if not util.safehasattr(obsolete, '_computephasedivergentset'): obsolete._computephasedivergentset = obsolete.cachefor('phasedivergent')(obsolete._computebumpedset) def startpager(ui, cmd): """function to start a pager in case ui.pager() exists""" if util.safehasattr(ui, 'pager'): ui.pager(cmd) def duplicatecopies(repo, wctx, rev, fromrev, skiprev=None): # cannot use anything else until 4.3 support is dropped. assert wctx.rev() is None if copies.duplicatecopies.__code__.co_argcount < 5: # pre 4.4 duplicatecopies compat copies.duplicatecopies(repo, rev, fromrev, skiprev=skiprev) else: copies.duplicatecopies(repo, wctx, rev, fromrev, skiprev=skiprev)