Mercurial > hg
diff hgext/fastannotate/context.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 | 0152a907f714 |
children | 687b865b95ad |
line wrap: on
line diff
--- a/hgext/fastannotate/context.py Sat Oct 05 10:29:34 2019 -0400 +++ b/hgext/fastannotate/context.py Sun Oct 06 09:45:02 2019 -0400 @@ -23,9 +23,7 @@ scmutil, util, ) -from mercurial.utils import ( - stringutil, -) +from mercurial.utils import stringutil from . import ( error as faerror, @@ -37,6 +35,7 @@ def _getflog(repo, path): return repo.file(path) + # extracted from mercurial.context.basefilectx.annotate def _parents(f, follow=True): # Cut _descendantrev here to mitigate the penalty of lazy linkrev @@ -58,6 +57,7 @@ return pl + # extracted from mercurial.context.basefilectx.annotate. slightly modified # so it takes a fctx instead of a pair of text and fctx. def _decorate(fctx): @@ -67,6 +67,7 @@ linecount += 1 return ([(fctx, i) for i in pycompat.xrange(linecount)], text) + # extracted from mercurial.context.basefilectx.annotate. slightly modified # so it takes an extra "blocks" parameter calculated elsewhere, instead of # calculating diff here. @@ -78,10 +79,12 @@ child[0][b1:b2] = parent[0][a1:a2] return child + # like scmutil.revsingle, but with lru cache, so their states (like manifests) # could be reused _revsingle = util.lrucachefunc(scmutil.revsingle) + def resolvefctx(repo, rev, path, resolverev=False, adjustctx=None): """(repo, str, str) -> fctx @@ -125,23 +128,27 @@ fctx._changectx = repo[introrev] return fctx + # like mercurial.store.encodedir, but use linelog suffixes: .m, .l, .lock def encodedir(path): - return (path - .replace('.hg/', '.hg.hg/') - .replace('.l/', '.l.hg/') - .replace('.m/', '.m.hg/') - .replace('.lock/', '.lock.hg/')) + return ( + path.replace('.hg/', '.hg.hg/') + .replace('.l/', '.l.hg/') + .replace('.m/', '.m.hg/') + .replace('.lock/', '.lock.hg/') + ) + def hashdiffopts(diffopts): - diffoptstr = stringutil.pprint(sorted( - (k, getattr(diffopts, k)) - for k in mdiff.diffopts.defaults - )) + diffoptstr = stringutil.pprint( + sorted((k, getattr(diffopts, k)) for k in mdiff.diffopts.defaults) + ) return node.hex(hashlib.sha1(diffoptstr).digest())[:6] + _defaultdiffopthash = hashdiffopts(mdiff.defaultopts) + class annotateopts(object): """like mercurial.mdiff.diffopts, but is for annotate @@ -175,8 +182,10 @@ result += 'i' + diffopthash return result or 'default' + defaultopts = annotateopts() + class _annotatecontext(object): """do not use this class directly as it does not use lock to protect writes. use "with annotatecontext(...)" instead. @@ -191,7 +200,7 @@ self.revmappath = revmappath self._linelog = None self._revmap = None - self._node2path = {} # {str: str} + self._node2path = {} # {str: str} @property def linelog(self): @@ -298,23 +307,27 @@ directly, revfctx = self.canannotatedirectly(rev) if directly: if self.ui.debugflag: - self.ui.debug('fastannotate: %s: using fast path ' - '(resolved fctx: %s)\n' - % (self.path, - stringutil.pprint(util.safehasattr(revfctx, - 'node')))) + self.ui.debug( + 'fastannotate: %s: using fast path ' + '(resolved fctx: %s)\n' + % ( + self.path, + stringutil.pprint(util.safehasattr(revfctx, 'node')), + ) + ) return self.annotatedirectly(revfctx, showpath, showlines) # resolve master masterfctx = None if master: try: - masterfctx = self._resolvefctx(master, resolverev=True, - adjustctx=True) - except LookupError: # master does not have the file + masterfctx = self._resolvefctx( + master, resolverev=True, adjustctx=True + ) + except LookupError: # master does not have the file pass else: - if masterfctx in self.revmap: # no need to update linelog + if masterfctx in self.revmap: # no need to update linelog masterfctx = None # ... - @ <- rev (can be an arbitrary changeset, @@ -342,18 +355,20 @@ initvisit = [revfctx] if masterfctx: if masterfctx.rev() is None: - raise error.Abort(_('cannot update linelog to wdir()'), - hint=_('set fastannotate.mainbranch')) + raise error.Abort( + _('cannot update linelog to wdir()'), + hint=_('set fastannotate.mainbranch'), + ) initvisit.append(masterfctx) visit = initvisit[:] pcache = {} needed = {revfctx: 1} - hist = {} # {fctx: ([(llrev or fctx, linenum)], text)} + hist = {} # {fctx: ([(llrev or fctx, linenum)], text)} while visit: f = visit.pop() if f in pcache or f in hist: continue - if f in self.revmap: # in the old main branch, it's a joint + if f in self.revmap: # in the old main branch, it's a joint llrev = self.revmap.hsh2rev(f.node()) self.linelog.annotate(llrev) result = self.linelog.annotateresult @@ -387,19 +402,24 @@ if self.ui.debugflag: if newmainbranch: - self.ui.debug('fastannotate: %s: %d new changesets in the main' - ' branch\n' % (self.path, len(newmainbranch))) - elif not hist: # no joints, no updates - self.ui.debug('fastannotate: %s: linelog cannot help in ' - 'annotating this revision\n' % self.path) + self.ui.debug( + 'fastannotate: %s: %d new changesets in the main' + ' branch\n' % (self.path, len(newmainbranch)) + ) + elif not hist: # no joints, no updates + self.ui.debug( + 'fastannotate: %s: linelog cannot help in ' + 'annotating this revision\n' % self.path + ) # prepare annotateresult so we can update linelog incrementally self.linelog.annotate(self.linelog.maxrev) # 3rd DFS does the actual annotate visit = initvisit[:] - progress = self.ui.makeprogress(('building cache'), - total=len(newmainbranch)) + progress = self.ui.makeprogress( + 'building cache', total=len(newmainbranch) + ) while visit: f = visit[-1] if f in hist: @@ -416,8 +436,8 @@ continue visit.pop() - blocks = None # mdiff blocks, used for appending linelog - ismainbranch = (f in newmainbranch) + blocks = None # mdiff blocks, used for appending linelog + ismainbranch = f in newmainbranch # curr is the same as the traditional annotate algorithm, # if we only care about linear history (do not follow merge), # then curr is not actually used. @@ -437,22 +457,23 @@ hist[f] = curr del pcache[f] - if ismainbranch: # need to write to linelog + if ismainbranch: # need to write to linelog progress.increment() bannotated = None - if len(pl) == 2 and self.opts.followmerge: # merge + if len(pl) == 2 and self.opts.followmerge: # merge bannotated = curr[0] - if blocks is None: # no parents, add an empty one + if blocks is None: # no parents, add an empty one blocks = list(self._diffblocks('', curr[1])) self._appendrev(f, blocks, bannotated) - elif showpath: # not append linelog, but we need to record path + elif showpath: # not append linelog, but we need to record path self._node2path[f.node()] = f.path() progress.complete() result = [ ((self.revmap.rev2hsh(fr) if isinstance(fr, int) else fr.node()), l) - for fr, l in hist[revfctx][0]] # [(node, linenumber)] + for fr, l in hist[revfctx][0] + ] # [(node, linenumber)] return self._refineannotateresult(result, revfctx, showpath, showlines) def canannotatedirectly(self, rev): @@ -557,7 +578,7 @@ continue hsh = annotateresult[idxs[0]][0] break - except StopIteration: # no more unresolved lines + except StopIteration: # no more unresolved lines return result if hsh is None: # the remaining key2idxs are not in main branch, resolving them @@ -567,9 +588,11 @@ if rev not in revlines: hsh = annotateresult[idxs[0]][0] if self.ui.debugflag: - self.ui.debug('fastannotate: reading %s line #%d ' - 'to resolve lines %r\n' - % (node.short(hsh), linenum, idxs)) + self.ui.debug( + 'fastannotate: reading %s line #%d ' + 'to resolve lines %r\n' + % (node.short(hsh), linenum, idxs) + ) fctx = self._resolvefctx(hsh, revmap.rev2path(rev)) lines = mdiff.splitnewlines(fctx.data()) revlines[rev] = lines @@ -579,8 +602,9 @@ return result # run the annotate and the lines should match to the file content - self.ui.debug('fastannotate: annotate %s to resolve lines\n' - % node.short(hsh)) + self.ui.debug( + 'fastannotate: annotate %s to resolve lines\n' % node.short(hsh) + ) linelog.annotate(rev) fctx = self._resolvefctx(hsh, revmap.rev2path(rev)) annotated = linelog.annotateresult @@ -608,14 +632,17 @@ hsh = f.node() llrev = self.revmap.hsh2rev(hsh) if not llrev: - raise faerror.CorruptedFileError('%s is not in revmap' - % node.hex(hsh)) + raise faerror.CorruptedFileError( + '%s is not in revmap' % node.hex(hsh) + ) if (self.revmap.rev2flag(llrev) & revmapmod.sidebranchflag) != 0: - raise faerror.CorruptedFileError('%s is not in revmap mainbranch' - % node.hex(hsh)) + raise faerror.CorruptedFileError( + '%s is not in revmap mainbranch' % node.hex(hsh) + ) self.linelog.annotate(llrev) - result = [(self.revmap.rev2hsh(r), l) - for r, l in self.linelog.annotateresult] + result = [ + (self.revmap.rev2hsh(r), l) for r, l in self.linelog.annotateresult + ] return self._refineannotateresult(result, f, showpath, showlines) def _refineannotateresult(self, result, f, showpath, showlines): @@ -625,13 +652,13 @@ if showpath: result = self._addpathtoresult(result) if showlines: - if isinstance(f, bytes): # f: node or fctx + if isinstance(f, bytes): # f: node or fctx llrev = self.revmap.hsh2rev(f) fctx = self._resolvefctx(f, self.revmap.rev2path(llrev)) else: fctx = f lines = mdiff.splitnewlines(fctx.data()) - if len(lines) != len(result): # linelog is probably corrupted + if len(lines) != len(result): # linelog is probably corrupted raise faerror.CorruptedFileError() result = (result, lines) return result @@ -660,15 +687,18 @@ # append sidebranch revisions to revmap siderevs = [] - siderevmap = {} # node: int + siderevmap = {} # node: int if bannotated is not None: for (a1, a2, b1, b2), op in blocks: if op != '=': # f could be either linelong rev, or fctx. - siderevs += [f for f, l in bannotated[b1:b2] - if not isinstance(f, int)] + siderevs += [ + f + for f, l in bannotated[b1:b2] + if not isinstance(f, int) + ] siderevs = set(siderevs) - if fctx in siderevs: # mainnode must be appended seperately + if fctx in siderevs: # mainnode must be appended seperately siderevs.remove(fctx) for f in siderevs: siderevmap[f] = getllrev(f) @@ -683,8 +713,10 @@ if bannotated is None: linelog.replacelines(llrev, a1, a2, b1, b2) else: - blines = [((r if isinstance(r, int) else siderevmap[r]), l) - for r, l in bannotated[b1:b2]] + blines = [ + ((r if isinstance(r, int) else siderevmap[r]), l) + for r, l in bannotated[b1:b2] + ] linelog.replacelines_vec(llrev, a1, a2, blines) def _addpathtoresult(self, annotateresult, revmap=None): @@ -717,11 +749,13 @@ """-> (fctx) -> [fctx]""" followrename = self.opts.followrename followmerge = self.opts.followmerge + def parents(f): pl = _parents(f, follow=followrename) if not followmerge: pl = pl[:1] return pl + return parents @util.propertycache @@ -731,6 +765,7 @@ def _resolvefctx(self, rev, path=None, **kwds): return resolvefctx(self.repo, rev, (path or self.path), **kwds) + def _unlinkpaths(paths): """silent, best-effort unlink""" for path in paths: @@ -739,13 +774,15 @@ except OSError: pass + class pathhelper(object): """helper for getting paths for lockfile, linelog and revmap""" def __init__(self, repo, path, opts=defaultopts): # different options use different directories - self._vfspath = os.path.join('fastannotate', - opts.shortstr, encodedir(path)) + self._vfspath = os.path.join( + 'fastannotate', opts.shortstr, encodedir(path) + ) self._repo = repo @property @@ -763,6 +800,7 @@ def revmappath(self): return self._repo.vfs.join(self._vfspath + '.m') + @contextlib.contextmanager def annotatecontext(repo, path, opts=defaultopts, rebuild=False): """context needed to perform (fast) annotate on a file @@ -799,6 +837,7 @@ if actx is not None: actx.close() + def fctxannotatecontext(fctx, follow=True, diffopts=None, rebuild=False): """like annotatecontext but get the context from a fctx. convenient when used in fctx.annotate