Mercurial > public > mercurial-scm > hg
diff mercurial/obsolete.py @ 43076:2372284d9457
formatting: blacken the codebase
This is using my patch to black
(https://github.com/psf/black/pull/826) so we don't un-wrap collection
literals.
Done with:
hg files 'set:**.py - mercurial/thirdparty/** - "contrib/python-zstandard/**"' | xargs black -S
# skip-blame mass-reformatting only
# no-check-commit reformats foo_bar functions
Differential Revision: https://phab.mercurial-scm.org/D6971
author | Augie Fackler <augie@google.com> |
---|---|
date | Sun, 06 Oct 2019 09:45:02 -0400 |
parents | ca762c2bbe6b |
children | 687b865b95ad |
line wrap: on
line diff
--- a/mercurial/obsolete.py Sat Oct 05 10:29:34 2019 -0400 +++ b/mercurial/obsolete.py Sun Oct 06 09:45:02 2019 -0400 @@ -98,6 +98,7 @@ allowunstableopt = 'allowunstable' exchangeopt = 'exchange' + def _getoptionvalue(repo, option): """Returns True if the given repository has the given obsolete option enabled. @@ -127,6 +128,7 @@ return option in result + def getoptions(repo): """Returns dicts showing state of obsolescence features.""" @@ -135,9 +137,13 @@ exchangevalue = _getoptionvalue(repo, exchangeopt) # createmarkers must be enabled if other options are enabled - if ((unstablevalue or exchangevalue) and not createmarkersvalue): - raise error.Abort(_("'createmarkers' obsolete option must be enabled " - "if other obsolete options are enabled")) + if (unstablevalue or exchangevalue) and not createmarkersvalue: + raise error.Abort( + _( + "'createmarkers' obsolete option must be enabled " + "if other obsolete options are enabled" + ) + ) return { createmarkersopt: createmarkersvalue, @@ -145,12 +151,14 @@ exchangeopt: exchangevalue, } + def isenabled(repo, option): """Returns True if the given repository has the given obsolete option enabled. """ return getoptions(repo)[option] + # Creating aliases for marker flags because evolve extension looks for # bumpedfix in obsolete.py bumpedfix = obsutil.bumpedfix @@ -177,39 +185,44 @@ # additional encoding. Keys cannot contain '\0' or ':' and values # cannot contain '\0'. _fm0version = 0 -_fm0fixed = '>BIB20s' +_fm0fixed = '>BIB20s' _fm0node = '20s' _fm0fsize = _calcsize(_fm0fixed) _fm0fnodesize = _calcsize(_fm0node) + def _fm0readmarkers(data, off, stop): # Loop on markers while off < stop: # read fixed part - cur = data[off:off + _fm0fsize] + cur = data[off : off + _fm0fsize] off += _fm0fsize numsuc, mdsize, flags, pre = _unpack(_fm0fixed, cur) # read replacement sucs = () if numsuc: - s = (_fm0fnodesize * numsuc) - cur = data[off:off + s] + s = _fm0fnodesize * numsuc + cur = data[off : off + s] sucs = _unpack(_fm0node * numsuc, cur) off += s # read metadata # (metadata will be decoded on demand) - metadata = data[off:off + mdsize] + metadata = data[off : off + mdsize] if len(metadata) != mdsize: - raise error.Abort(_('parsing obsolete marker: metadata is too ' - 'short, %d bytes expected, got %d') - % (mdsize, len(metadata))) + raise error.Abort( + _( + 'parsing obsolete marker: metadata is too ' + 'short, %d bytes expected, got %d' + ) + % (mdsize, len(metadata)) + ) off += mdsize metadata = _fm0decodemeta(metadata) try: when, offset = metadata.pop('date', '0 0').split(' ') date = float(when), int(offset) except ValueError: - date = (0., 0) + date = (0.0, 0) parents = None if 'p2' in metadata: parents = (metadata.pop('p1', None), metadata.pop('p2', None)) @@ -233,6 +246,7 @@ yield (pre, sucs, flags, metadata, date, parents) + def _fm0encodeonemarker(marker): pre, sucs, flags, metadata, date, parents = marker if flags & usingsha256: @@ -253,6 +267,7 @@ data.extend(sucs) return _pack(format, *data) + metadata + def _fm0encodemeta(meta): """Return encoded metadata string to string mapping. @@ -264,6 +279,7 @@ raise ValueError("':' is forbidden in metadata value'") return '\0'.join(['%s:%s' % (k, meta[k]) for k in sorted(meta)]) + def _fm0decodemeta(data): """Return string to string dictionary from encoded version.""" d = {} @@ -273,6 +289,7 @@ d[key] = value return d + ## Parsing and writing of version "1" # # The header is followed by the markers. Each marker is made of: @@ -316,10 +333,11 @@ _fm1fsize = _calcsize(_fm1fixed) _fm1parentnone = 3 _fm1parentshift = 14 -_fm1parentmask = (_fm1parentnone << _fm1parentshift) +_fm1parentmask = _fm1parentnone << _fm1parentshift _fm1metapair = 'BB' _fm1metapairsize = _calcsize(_fm1metapair) + def _fm1purereadmarkers(data, off, stop): # make some global constants local for performance noneflag = _fm1parentnone @@ -394,6 +412,7 @@ yield (prec, sucs, flags, tuple(metadata), (secs, tz * 60), parents) + def _fm1encodeonemarker(marker): pre, sucs, flags, metadata, date, parents = marker # determine node size @@ -411,7 +430,7 @@ formatmeta = _fm1metapair * len(metadata) format = _fm1fixed + formatnodes + formatmeta # tz is stored in minutes so we divide by 60 - tz = date[1]//60 + tz = date[1] // 60 data = [None, date[0], tz, flags, numsuc, numpar, len(metadata), pre] data.extend(sucs) if parents is not None: @@ -421,12 +440,16 @@ lk = len(key) lv = len(value) if lk > 255: - msg = ('obsstore metadata key cannot be longer than 255 bytes' - ' (key "%s" is %u bytes)') % (key, lk) + msg = ( + 'obsstore metadata key cannot be longer than 255 bytes' + ' (key "%s" is %u bytes)' + ) % (key, lk) raise error.ProgrammingError(msg) if lv > 255: - msg = ('obsstore metadata value cannot be longer than 255 bytes' - ' (value "%s" for key "%s" is %u bytes)') % (value, key, lv) + msg = ( + 'obsstore metadata value cannot be longer than 255 bytes' + ' (value "%s" for key "%s" is %u bytes)' + ) % (value, key, lv) raise error.ProgrammingError(msg) data.append(lk) data.append(lv) @@ -438,20 +461,26 @@ data.append(value) return ''.join(data) + def _fm1readmarkers(data, off, stop): native = getattr(parsers, 'fm1readmarkers', None) if not native: return _fm1purereadmarkers(data, off, stop) return native(data, off, stop) + # mapping to read/write various marker formats # <version> -> (decoder, encoder) -formats = {_fm0version: (_fm0readmarkers, _fm0encodeonemarker), - _fm1version: (_fm1readmarkers, _fm1encodeonemarker)} +formats = { + _fm0version: (_fm0readmarkers, _fm0encodeonemarker), + _fm1version: (_fm1readmarkers, _fm1encodeonemarker), +} + def _readmarkerversion(data): return _unpack('>B', data[0:1])[0] + @util.nogc def _readmarkers(data, off=None, stop=None): """Read and enumerate markers from raw data""" @@ -465,9 +494,11 @@ raise error.UnknownVersion(msg, version=diskversion) return diskversion, formats[diskversion][0](data, off, stop) + def encodeheader(version=_fm0version): return _pack('>B', version) + def encodemarkers(markers, addheader=False, version=_fm0version): # Kept separate from flushmarkers(), it will be reused for # markers exchange. @@ -477,17 +508,20 @@ for marker in markers: yield encodeone(marker) + @util.nogc def _addsuccessors(successors, markers): for mark in markers: successors.setdefault(mark[0], set()).add(mark) + @util.nogc def _addpredecessors(predecessors, markers): for mark in markers: for suc in mark[1]: predecessors.setdefault(suc, set()).add(mark) + @util.nogc def _addchildren(children, markers): for mark in markers: @@ -496,6 +530,7 @@ for p in parents: children.setdefault(p, set()).add(mark) + def _checkinvalidmarkers(markers): """search for marker with invalid data and raise error if needed @@ -504,8 +539,13 @@ """ for mark in markers: if node.nullid in mark[1]: - raise error.Abort(_('bad obsolescence marker detected: ' - 'invalid successors nullid')) + raise error.Abort( + _( + 'bad obsolescence marker detected: ' + 'invalid successors nullid' + ) + ) + class obsstore(object): """Store obsolete markers @@ -558,8 +598,17 @@ Remove me in the future when obsolete marker is always on.""" return self._readonly - def create(self, transaction, prec, succs=(), flag=0, parents=None, - date=None, metadata=None, ui=None): + def create( + self, + transaction, + prec, + succs=(), + flag=0, + parents=None, + date=None, + metadata=None, + ui=None, + ): """obsolete: add a new obsolete marker * ensuring it is hashable @@ -591,7 +640,8 @@ raise ValueError(succ) if prec in succs: raise ValueError( - r'in-marker cycle with %s' % pycompat.sysstr(node.hex(prec))) + r'in-marker cycle with %s' % pycompat.sysstr(node.hex(prec)) + ) metadata = tuple(sorted(metadata.iteritems())) for k, v in metadata: @@ -603,7 +653,8 @@ raise error.ProgrammingError( 'obsstore metadata must be valid UTF-8 sequence ' '(key = %r, value = %r)' - % (pycompat.bytestr(k), pycompat.bytestr(v))) + % (pycompat.bytestr(k), pycompat.bytestr(v)) + ) marker = (bytes(prec), tuple(succs), int(flag), metadata, date, parents) return bool(self.add(transaction, [marker])) @@ -614,8 +665,9 @@ Take care of filtering duplicate. Return the number of new marker.""" if self._readonly: - raise error.Abort(_('creating obsolete markers is not enabled on ' - 'this repo')) + raise error.Abort( + _('creating obsolete markers is not enabled on ' 'this repo') + ) known = set() getsuccessors = self.successors.get new = [] @@ -696,7 +748,7 @@ return attr in self.__dict__ def _addmarkers(self, markers, rawdata): - markers = list(markers) # to allow repeated iteration + markers = list(markers) # to allow repeated iteration self._data = self._data + rawdata self._all.extend(markers) if self._cached(r'successors'): @@ -740,6 +792,7 @@ seennodes |= pendingnodes return seenmarkers + def makestore(ui, repo): """Create an obsstore instance from a repo.""" # read default format for new obsstore. @@ -752,10 +805,13 @@ readonly = not isenabled(repo, createmarkersopt) store = obsstore(repo.svfs, readonly=readonly, **kwargs) if store and readonly: - ui.warn(_('obsolete feature not enabled but %i markers found!\n') - % len(list(store))) + ui.warn( + _('obsolete feature not enabled but %i markers found!\n') + % len(list(store)) + ) return store + def commonversion(versions): """Return the newest version listed in both versions and our local formats. @@ -768,12 +824,14 @@ return v return None + # arbitrary picked to fit into 8K limit from HTTP server # you have to take in account: # - the version header # - the base85 encoding _maxpayload = 5300 + def _pushkeyescape(markers): """encode markers into a dict suitable for pushkey exchange @@ -784,7 +842,7 @@ currentlen = _maxpayload * 2 # ensure we create a new part for marker in markers: nextdata = _fm0encodeonemarker(marker) - if (len(nextdata) + currentlen > _maxpayload): + if len(nextdata) + currentlen > _maxpayload: currentpart = [] currentlen = 0 parts.append(currentpart) @@ -795,12 +853,14 @@ keys['dump%i' % idx] = util.b85encode(data) return keys + def listmarkers(repo): """List markers over pushkey""" if not repo.obsstore: return {} return _pushkeyescape(sorted(repo.obsstore)) + def pushmarker(repo, key, old, new): """Push markers over pushkey""" if not key.startswith('dump'): @@ -815,18 +875,24 @@ repo.invalidatevolatilesets() return True + # mapping of 'set-name' -> <function to compute this set> cachefuncs = {} + + def cachefor(name): """Decorator to register a function as computing the cache for a set""" + def decorator(func): if name in cachefuncs: msg = "duplicated registration for volatileset '%s' (existing: %r)" raise error.ProgrammingError(msg % (name, cachefuncs[name])) cachefuncs[name] = func return func + return decorator + def getrevs(repo, name): """Return the set of revision that belong to the <name> set @@ -838,6 +904,7 @@ repo.obsstore.caches[name] = cachefuncs[name](repo) return repo.obsstore.caches[name] + # To be simple we need to invalidate obsolescence cache when: # # - new changeset is added: @@ -856,10 +923,12 @@ if 'obsstore' in repo._filecache: repo.obsstore.caches.clear() + def _mutablerevs(repo): """the set of mutable revision in the repository""" return repo._phasecache.getrevset(repo, phases.mutablephases) + @cachefor('obsolete') def _computeobsoleteset(repo): """the set of obsolete revisions""" @@ -869,6 +938,7 @@ obs = set(r for r in notpublic if isobs(getnode(r))) return obs + @cachefor('orphan') def _computeorphanset(repo): """the set of non obsolete revisions with obsolete parents""" @@ -886,23 +956,26 @@ break return unstable + @cachefor('suspended') def _computesuspendedset(repo): """the set of obsolete parents with non obsolete descendants""" suspended = repo.changelog.ancestors(getrevs(repo, 'orphan')) return set(r for r in getrevs(repo, 'obsolete') if r in suspended) + @cachefor('extinct') def _computeextinctset(repo): """the set of obsolete parents without non obsolete descendants""" return getrevs(repo, 'obsolete') - getrevs(repo, 'suspended') + @cachefor('phasedivergent') def _computephasedivergentset(repo): """the set of revs trying to obsolete public revisions""" bumped = set() # util function (avoid attribute lookup in the loop) - phase = repo._phasecache.phase # would be faster to grab the full list + phase = repo._phasecache.phase # would be faster to grab the full list public = phases.public cl = repo.changelog torev = cl.nodemap.get @@ -912,15 +985,17 @@ # We only evaluate mutable, non-obsolete revision node = tonode(rev) # (future) A cache of predecessors may worth if split is very common - for pnode in obsutil.allpredecessors(obsstore, [node], - ignoreflags=bumpedfix): - prev = torev(pnode) # unfiltered! but so is phasecache + for pnode in obsutil.allpredecessors( + obsstore, [node], ignoreflags=bumpedfix + ): + prev = torev(pnode) # unfiltered! but so is phasecache if (prev is not None) and (phase(repo, prev) <= public): # we have a public predecessor bumped.add(rev) - break # Next draft! + break # Next draft! return bumped + @cachefor('contentdivergent') def _computecontentdivergentset(repo): """the set of rev that compete to be the final successors of some revision. @@ -937,7 +1012,7 @@ while toprocess: prec = toprocess.pop()[0] if prec in seen: - continue # emergency cycle hanging prevention + continue # emergency cycle hanging prevention seen.add(prec) if prec not in newermap: obsutil.successorssets(repo, prec, cache=newermap) @@ -948,6 +1023,7 @@ toprocess.update(obsstore.predecessors.get(prec, ())) return divergent + def makefoldid(relation, user): folddigest = hashlib.sha1(user) @@ -958,8 +1034,10 @@ # seems fine to use a small ID. Smaller ID save space. return node.hex(folddigest.digest())[:8] -def createmarkers(repo, relations, flag=0, date=None, metadata=None, - operation=None): + +def createmarkers( + repo, relations, flag=0, date=None, metadata=None, operation=None +): """Add obsolete markers between changesets in a repo <relations> must be an iterable of ((<old>,...), (<new>, ...)[,{metadata}]) @@ -984,14 +1062,16 @@ metadata['user'] = encoding.fromlocal(luser) # Operation metadata handling - useoperation = repo.ui.configbool('experimental', - 'evolution.track-operation') + useoperation = repo.ui.configbool( + 'experimental', 'evolution.track-operation' + ) if useoperation and operation: metadata['operation'] = operation # Effect flag metadata handling - saveeffectflag = repo.ui.configbool('experimental', - 'evolution.effect-flags') + saveeffectflag = repo.ui.configbool( + 'experimental', 'evolution.effect-flags' + ) with repo.transaction('add-obsolescence-marker') as tr: markerargs = [] @@ -1018,17 +1098,19 @@ localmetadata['fold-size'] = '%d' % foldsize if not prec.mutable(): - raise error.Abort(_("cannot obsolete public changeset: %s") - % prec, - hint="see 'hg help phases' for details") + raise error.Abort( + _("cannot obsolete public changeset: %s") % prec, + hint="see 'hg help phases' for details", + ) nprec = prec.node() nsucs = tuple(s.node() for s in sucs) npare = None if not nsucs: npare = tuple(p.node() for p in prec.parents()) if nprec in nsucs: - raise error.Abort(_("changeset %s cannot obsolete itself") - % prec) + raise error.Abort( + _("changeset %s cannot obsolete itself") % prec + ) # Effect flag can be different by relation if saveeffectflag: @@ -1045,7 +1127,14 @@ for args in markerargs: nprec, nsucs, npare, localmetadata = args - repo.obsstore.create(tr, nprec, nsucs, flag, parents=npare, - date=date, metadata=localmetadata, - ui=repo.ui) + repo.obsstore.create( + tr, + nprec, + nsucs, + flag, + parents=npare, + date=date, + metadata=localmetadata, + ui=repo.ui, + ) repo.filteredrevcache.clear()