# HG changeset patch # User Gregory Szorc # Date 1570399155 14400 # Node ID 74802979dd9d92250f5cdf0fd6994c6257025084 # Parent c95b2f40db7c67c91bca88bea545ed5564e0b295 py3: define and use pycompat.itervalues() .itervalues() only exists on Python 2. Python 3's equivalent is .values(). But we don't want to blindly use .values() everywhere because on Python 2, it will create a list, which will have performance implications. This commit introduces pycompat.itervalues() which will call the appropriate method on the passed object. We update all callers of obj.itervalues() to pycompat.itervalues(obj) instead. With this commit, the only source tranforming remaining is for iteritems(). Victory is near... Differential Revision: https://phab.mercurial-scm.org/D7013 diff -r c95b2f40db7c -r 74802979dd9d contrib/synthrepo.py --- a/contrib/synthrepo.py Sun Oct 06 17:45:05 2019 -0400 +++ b/contrib/synthrepo.py Sun Oct 06 17:59:15 2019 -0400 @@ -213,7 +213,7 @@ for filename, mar, lineadd, lineremove, isbin in parsegitdiff(diff): if isbin: continue - added = sum(lineadd.itervalues(), 0) + added = sum(pycompat.itervalues(lineadd), 0) if mar == 'm': if added and lineremove: lineschanged[ diff -r c95b2f40db7c -r 74802979dd9d hgext/journal.py --- a/hgext/journal.py Sun Oct 06 17:45:05 2019 -0400 +++ b/hgext/journal.py Sun Oct 06 17:59:15 2019 -0400 @@ -164,7 +164,7 @@ pass while iterable_map: - value, key, it = order(iterable_map.itervalues()) + value, key, it = order(pycompat.itervalues(iterable_map)) yield value try: iterable_map[key][0] = next(it) diff -r c95b2f40db7c -r 74802979dd9d hgext/rebase.py --- a/hgext/rebase.py Sun Oct 06 17:45:05 2019 -0400 +++ b/hgext/rebase.py Sun Oct 06 17:59:15 2019 -0400 @@ -2288,7 +2288,7 @@ msg = _(b'rebase: (use "hg rebase --abort" to clear broken state)\n') ui.write(msg) return - numrebased = len([i for i in state.itervalues() if i >= 0]) + numrebased = len([i for i in pycompat.itervalues(state) if i >= 0]) # i18n: column positioning for "hg summary" ui.write( _(b'rebase: %s, %s (rebase --continue)\n') diff -r c95b2f40db7c -r 74802979dd9d hgext/remotefilelog/connectionpool.py --- a/hgext/remotefilelog/connectionpool.py Sun Oct 06 17:45:05 2019 -0400 +++ b/hgext/remotefilelog/connectionpool.py Sun Oct 06 17:59:15 2019 -0400 @@ -10,6 +10,7 @@ from mercurial import ( extensions, hg, + pycompat, sshpeer, util, ) @@ -59,7 +60,7 @@ return conn def close(self): - for pathpool in self._pool.itervalues(): + for pathpool in pycompat.itervalues(self._pool): for conn in pathpool: conn.close() del pathpool[:] diff -r c95b2f40db7c -r 74802979dd9d hgext/remotefilelog/debugcommands.py --- a/hgext/remotefilelog/debugcommands.py Sun Oct 06 17:45:05 2019 -0400 +++ b/hgext/remotefilelog/debugcommands.py Sun Oct 06 17:59:15 2019 -0400 @@ -207,7 +207,7 @@ continue filepath = os.path.join(root, file) size, firstnode, mapping = parsefileblob(filepath, decompress) - for p1, p2, linknode, copyfrom in mapping.itervalues(): + for p1, p2, linknode, copyfrom in pycompat.itervalues(mapping): if linknode == nullid: actualpath = os.path.relpath(root, path) key = fileserverclient.getcachekey( diff -r c95b2f40db7c -r 74802979dd9d hgext/remotefilelog/repack.py --- a/hgext/remotefilelog/repack.py Sun Oct 06 17:45:05 2019 -0400 +++ b/hgext/remotefilelog/repack.py Sun Oct 06 17:59:15 2019 -0400 @@ -598,7 +598,7 @@ maxchainlen = ui.configint(b'packs', b'maxchainlen', 1000) byfile = {} - for entry in ledger.entries.itervalues(): + for entry in pycompat.itervalues(ledger.entries): if entry.datasource: byfile.setdefault(entry.filename, {})[entry.node] = entry @@ -753,7 +753,7 @@ ui = self.repo.ui byfile = {} - for entry in ledger.entries.itervalues(): + for entry in pycompat.itervalues(ledger.entries): if entry.historysource: byfile.setdefault(entry.filename, {})[entry.node] = entry diff -r c95b2f40db7c -r 74802979dd9d hgext/transplant.py --- a/hgext/transplant.py Sun Oct 06 17:45:05 2019 -0400 +++ b/hgext/transplant.py Sun Oct 06 17:59:15 2019 -0400 @@ -100,7 +100,7 @@ if not os.path.isdir(self.path): os.mkdir(self.path) fp = self.opener(self.transplantfile, b'w') - for list in self.transplants.itervalues(): + for list in pycompat.itervalues(self.transplants): for t in list: l, r = map(nodemod.hex, (t.lnode, t.rnode)) fp.write(l + b':' + r + b'\n') diff -r c95b2f40db7c -r 74802979dd9d mercurial/__init__.py --- a/mercurial/__init__.py Sun Oct 06 17:45:05 2019 -0400 +++ b/mercurial/__init__.py Sun Oct 06 17:59:15 2019 -0400 @@ -117,7 +117,7 @@ # It changes iteritems/values to items/values as they are not # present in Python 3 world. - if fn in ('iteritems', 'itervalues') and not ( + if fn == 'iteritems' and not ( tokens[i - 1].type == token.NAME and tokens[i - 1].string == 'def' ): @@ -131,7 +131,7 @@ # ``replacetoken`` or any mechanism that changes semantics of module # loading is changed. Otherwise cached bytecode may get loaded without # the new transformation mechanisms applied. - BYTECODEHEADER = b'HG\x00\x14' + BYTECODEHEADER = b'HG\x00\x15' class hgloader(importlib.machinery.SourceFileLoader): """Custom module loader that transforms source code. diff -r c95b2f40db7c -r 74802979dd9d mercurial/branchmap.py --- a/mercurial/branchmap.py Sun Oct 06 17:45:05 2019 -0400 +++ b/mercurial/branchmap.py Sun Oct 06 17:59:15 2019 -0400 @@ -91,7 +91,7 @@ clbranchinfo = cl.branchinfo rbheads = [] closed = [] - for bheads in remotebranchmap.itervalues(): + for bheads in pycompat.itervalues(remotebranchmap): rbheads += bheads for h in bheads: r = clrev(h) @@ -350,7 +350,7 @@ def iterheads(self): """ returns all the heads """ self._verifyall() - return self._entries.itervalues() + return pycompat.itervalues(self._entries) def copy(self): """return an deep copy of the branchcache object""" diff -r c95b2f40db7c -r 74802979dd9d mercurial/exchangev2.py --- a/mercurial/exchangev2.py Sun Oct 06 17:45:05 2019 -0400 +++ b/mercurial/exchangev2.py Sun Oct 06 17:59:15 2019 -0400 @@ -607,7 +607,7 @@ progress = repo.ui.makeprogress( _(b'files'), unit=_(b'chunks'), - total=sum(len(v) for v in fnodes.itervalues()), + total=sum(len(v) for v in pycompat.itervalues(fnodes)), ) # TODO make batch size configurable @@ -706,7 +706,7 @@ progress = repo.ui.makeprogress( _(b'files'), unit=_(b'chunks'), - total=sum(len(v) for v in fnodes.itervalues()), + total=sum(len(v) for v in pycompat.itervalues(fnodes)), ) commandmeta = remote.apidescriptor[b'commands'][b'filesdata'] diff -r c95b2f40db7c -r 74802979dd9d mercurial/localrepo.py --- a/mercurial/localrepo.py Sun Oct 06 17:45:05 2019 -0400 +++ b/mercurial/localrepo.py Sun Oct 06 17:59:15 2019 -0400 @@ -1763,7 +1763,7 @@ nodetagscache = {} for t, n in self._tagscache.tags.iteritems(): nodetagscache.setdefault(n, []).append(t) - for tags in nodetagscache.itervalues(): + for tags in pycompat.itervalues(nodetagscache): tags.sort() self._tagscache.nodetagscache = nodetagscache return self._tagscache.nodetagscache.get(node, []) diff -r c95b2f40db7c -r 74802979dd9d mercurial/merge.py --- a/mercurial/merge.py Sun Oct 06 17:45:05 2019 -0400 +++ b/mercurial/merge.py Sun Oct 06 17:59:15 2019 -0400 @@ -702,7 +702,7 @@ """return counts for updated, merged and removed files in this session""" updated, merged, removed = 0, 0, 0 - for r, action in self._results.itervalues(): + for r, action in pycompat.itervalues(self._results): if r is None: updated += 1 elif r == 0: diff -r c95b2f40db7c -r 74802979dd9d mercurial/patch.py --- a/mercurial/patch.py Sun Oct 06 17:45:05 2019 -0400 +++ b/mercurial/patch.py Sun Oct 06 17:59:15 2019 -0400 @@ -1331,7 +1331,11 @@ fixoffset += chunk.removed - chunk.added return ( sum( - [h for h in applied.itervalues() if h[0].special() or len(h) > 1], + [ + h + for h in pycompat.itervalues(applied) + if h[0].special() or len(h) > 1 + ], [], ), {}, diff -r c95b2f40db7c -r 74802979dd9d mercurial/pycompat.py --- a/mercurial/pycompat.py Sun Oct 06 17:45:05 2019 -0400 +++ b/mercurial/pycompat.py Sun Oct 06 17:59:15 2019 -0400 @@ -337,6 +337,7 @@ ret = shlex.split(s.decode('latin-1'), comments, posix) return [a.encode('latin-1') for a in ret] + itervalues = lambda x: x.values() else: import cStringIO @@ -413,6 +414,7 @@ ziplist = zip rawinput = raw_input getargspec = inspect.getargspec + itervalues = lambda x: x.itervalues() isjython = sysplatform.startswith(b'java') diff -r c95b2f40db7c -r 74802979dd9d mercurial/statprof.py --- a/mercurial/statprof.py Sun Oct 06 17:45:05 2019 -0400 +++ b/mercurial/statprof.py Sun Oct 06 17:59:15 2019 -0400 @@ -475,7 +475,7 @@ if i == 0: sitestat.addself() - return [s for s in stats.itervalues()] + return [s for s in pycompat.itervalues(stats)] class DisplayFormats: @@ -744,7 +744,7 @@ site = node.site visiblechildren = [ c - for c in node.children.itervalues() + for c in pycompat.itervalues(node.children) if c.count >= (limit * root.count) ] if site: @@ -752,7 +752,7 @@ filename = b'' function = b'' if len(node.children) > 0: - childsite = list(node.children.itervalues())[0].site + childsite = list(pycompat.itervalues(node.children))[0].site filename = (childsite.filename() + b':').ljust(15) function = childsite.function @@ -777,7 +777,9 @@ ) finalstring = liststring + codestring - childrensamples = sum([c.count for c in node.children.itervalues()]) + childrensamples = sum( + [c.count for c in pycompat.itervalues(node.children)] + ) # Make frames that performed more than 10% of the operation red if node.count - childrensamples > (0.1 * root.count): finalstring = b'\033[91m' + finalstring + b'\033[0m' diff -r c95b2f40db7c -r 74802979dd9d mercurial/ui.py --- a/mercurial/ui.py Sun Oct 06 17:45:05 2019 -0400 +++ b/mercurial/ui.py Sun Oct 06 17:59:15 2019 -0400 @@ -1966,7 +1966,7 @@ if not self._loggers: return activeloggers = [ - l for l in self._loggers.itervalues() if l.tracked(event) + l for l in pycompat.itervalues(self._loggers) if l.tracked(event) ] if not activeloggers: return diff -r c95b2f40db7c -r 74802979dd9d tests/test-pathencode.py --- a/tests/test-pathencode.py Sun Oct 06 17:45:05 2019 -0400 +++ b/tests/test-pathencode.py Sun Oct 06 17:59:15 2019 -0400 @@ -67,7 +67,7 @@ counts[c] += 1 for c in '\r/\n': counts.pop(c, None) - t = sum(counts.itervalues()) / 100.0 + t = sum(pycompat.itervalues(counts)) / 100.0 fp.write('probtable = (') for i, (k, v) in enumerate( sorted(counts.items(), key=lambda x: x[1], reverse=True)