diff --git a/contrib/benchmarks/__init__.py b/contrib/benchmarks/__init__.py --- a/contrib/benchmarks/__init__.py +++ b/contrib/benchmarks/__init__.py @@ -81,7 +81,7 @@ output = ui.popbuffer() match = outputre.search(output) if not match: - raise ValueError("Invalid output {0}".format(output)) + raise ValueError("Invalid output {}".format(output)) return float(match.group(1)) diff --git a/contrib/check-py3-compat.py b/contrib/check-py3-compat.py --- a/contrib/check-py3-compat.py +++ b/contrib/check-py3-compat.py @@ -32,7 +32,7 @@ for node in ast.walk(root): if isinstance(node, ast.ImportFrom): if node.module == '__future__': - futures |= set(n.name for n in node.names) + futures |= {n.name for n in node.names} elif isinstance(node, ast.Print): haveprint = True diff --git a/contrib/perf.py b/contrib/perf.py --- a/contrib/perf.py +++ b/contrib/perf.py @@ -2523,7 +2523,7 @@ } for diffopt in ('', 'w', 'b', 'B', 'wB'): - opts = dict((options[c], b'1') for c in diffopt) + opts = {options[c]: b'1' for c in diffopt} def d(): ui.pushbuffer() @@ -3048,7 +3048,7 @@ # Verify engines argument. if engines: - engines = set(e.strip() for e in engines.split(b',')) + engines = {e.strip() for e in engines.split(b',')} for engine in engines: try: util.compressionengines[engine] diff --git a/hgext/absorb.py b/hgext/absorb.py --- a/hgext/absorb.py +++ b/hgext/absorb.py @@ -407,7 +407,7 @@ involved = [ annotated[i] for i in nearbylinenums if annotated[i][0] != 1 ] - involvedrevs = list(set(r for r, l in involved)) + involvedrevs = list({r for r, l in involved}) newfixups = [] if len(involvedrevs) == 1 and self._iscontinuous(a1, a2 - 1, True): # chunk belongs to a single revision @@ -734,10 +734,10 @@ @property def chunkstats(self): """-> {path: chunkstats}. collect chunkstats from filefixupstates""" - return dict( - (path, state.chunkstats) + return { + path: state.chunkstats for path, state in pycompat.iteritems(self.fixupmap) - ) + } def commit(self): """commit changes. update self.finalnode, self.replacemap""" diff --git a/hgext/closehead.py b/hgext/closehead.py --- a/hgext/closehead.py +++ b/hgext/closehead.py @@ -76,7 +76,7 @@ heads = [] for branch in repo.branchmap(): heads.extend(repo.branchheads(branch)) - heads = set(repo[h].rev() for h in heads) + heads = {repo[h].rev() for h in heads} for rev in revs: if rev not in heads: raise error.Abort(_(b'revision is not an open head: %d') % rev) diff --git a/hgext/convert/hg.py b/hgext/convert/hg.py --- a/hgext/convert/hg.py +++ b/hgext/convert/hg.py @@ -677,13 +677,9 @@ for t in self.repo.tagslist() if self.repo.tagtype(t[0]) == b'global' ] - return dict( - [ - (name, nodemod.hex(node)) - for name, node in tags - if self.keep(node) - ] - ) + return { + name: nodemod.hex(node) for name, node in tags if self.keep(node) + } def getchangedfiles(self, rev, i): ctx = self._changectx(rev) diff --git a/hgext/convert/subversion.py b/hgext/convert/subversion.py --- a/hgext/convert/subversion.py +++ b/hgext/convert/subversion.py @@ -710,11 +710,11 @@ # Here/tags/tag.1 discarded as well as its children. # It happens with tools like cvs2svn. Such tags cannot # be represented in mercurial. - addeds = dict( - (p, e.copyfrom_path) + addeds = { + p: e.copyfrom_path for p, e in pycompat.iteritems(origpaths) if e.action == b'A' and e.copyfrom_path - ) + } badroots = set() for destroot in addeds: for source, sourcerev, dest in pendings: diff --git a/hgext/eol.py b/hgext/eol.py --- a/hgext/eol.py +++ b/hgext/eol.py @@ -221,7 +221,7 @@ self.match = match.match(root, b'', [], include, exclude) def copytoui(self, ui): - newpatterns = set(pattern for pattern, key, m in self.patterns) + newpatterns = {pattern for pattern, key, m in self.patterns} for section in (b'decode', b'encode'): for oldpattern, _filter in ui.configitems(section): if oldpattern not in newpatterns: diff --git a/hgext/fastannotate/commands.py b/hgext/fastannotate/commands.py --- a/hgext/fastannotate/commands.py +++ b/hgext/fastannotate/commands.py @@ -233,7 +233,7 @@ showlines=(showlines and not showdeleted), ) if showdeleted: - existinglines = set((l[0], l[1]) for l in result) + existinglines = {(l[0], l[1]) for l in result} result = a.annotatealllines( rev, showpath=showpath, showlines=showlines ) diff --git a/hgext/fsmonitor/__init__.py b/hgext/fsmonitor/__init__.py --- a/hgext/fsmonitor/__init__.py +++ b/hgext/fsmonitor/__init__.py @@ -397,7 +397,7 @@ # for file paths which require normalization and we encounter a case # collision, we store our own foldmap if normalize: - foldmap = dict((normcase(k), k) for k in results) + foldmap = {normcase(k): k for k in results} switch_slashes = pycompat.ossep == b'\\' # The order of the results is, strictly speaking, undefined. @@ -459,22 +459,16 @@ if normalize: # any notable files that have changed case will already be handled # above, so just check membership in the foldmap - notefiles = set( - ( - normalize(f, True, True) - for f in notefiles - if normcase(f) not in foldmap - ) - ) - visit = set( - ( - f + notefiles = { + normalize(f, True, True) for f in notefiles - if ( - f not in results and matchfn(f) and (f in dmap or not ignore(f)) - ) - ) - ) + if normcase(f) not in foldmap + } + visit = { + f + for f in notefiles + if (f not in results and matchfn(f) and (f in dmap or not ignore(f))) + } if not fresh_instance: if matchalways: diff --git a/hgext/histedit.py b/hgext/histedit.py --- a/hgext/histedit.py +++ b/hgext/histedit.py @@ -835,10 +835,10 @@ return ctx, [(self.node, (parentctxnode,))] parentctx = repo[parentctxnode] - newcommits = set( + newcommits = { c.node() for c in repo.set(b'(%d::. - %d)', parentctx.rev(), parentctx.rev()) - ) + } if not newcommits: repo.ui.warn( _( @@ -2412,7 +2412,7 @@ Will abort if there are to many or too few rules, a malformed rule, or a rule on a changeset outside of the user-given range. """ - expected = set(c.node() for c in ctxs) + expected = {c.node() for c in ctxs} seen = set() prev = None diff --git a/hgext/largefiles/basestore.py b/hgext/largefiles/basestore.py --- a/hgext/largefiles/basestore.py +++ b/hgext/largefiles/basestore.py @@ -67,7 +67,7 @@ ui = self.ui at = 0 - available = self.exists(set(hash for (_filename, hash) in files)) + available = self.exists({hash for (_filename, hash) in files}) with ui.makeprogress( _(b'getting largefiles'), unit=_(b'files'), total=len(files) ) as progress: diff --git a/hgext/largefiles/overrides.py b/hgext/largefiles/overrides.py --- a/hgext/largefiles/overrides.py +++ b/hgext/largefiles/overrides.py @@ -1564,11 +1564,11 @@ def overriderollback(orig, ui, repo, **opts): with repo.wlock(): before = repo.dirstate.parents() - orphans = set( + orphans = { f for f in repo.dirstate if lfutil.isstandin(f) and repo.dirstate[f] != b'r' - ) + } result = orig(ui, repo, **opts) after = repo.dirstate.parents() if before == after: diff --git a/hgext/largefiles/remotestore.py b/hgext/largefiles/remotestore.py --- a/hgext/largefiles/remotestore.py +++ b/hgext/largefiles/remotestore.py @@ -48,12 +48,12 @@ ) def exists(self, hashes): - return dict( - (h, s == 0) + return { + h: s == 0 for (h, s) in pycompat.iteritems( self._stat(hashes) ) # dict-from-generator - ) + } def sendfile(self, filename, hash): self.ui.debug(b'remotestore: sendfile(%s, %s)\n' % (filename, hash)) diff --git a/hgext/mq.py b/hgext/mq.py --- a/hgext/mq.py +++ b/hgext/mq.py @@ -1162,7 +1162,7 @@ if unknown: if numrevs: - rev = dict((entry.name, entry.node) for entry in qfinished) + rev = {entry.name: entry.node for entry in qfinished} for p in unknown: msg = _(b'revision %s refers to unknown patches: %s\n') self.ui.warn(msg % (short(rev[p]), p)) @@ -3361,7 +3361,7 @@ ui.write(b'\n') q = repo.mq - applied = set(p.name for p in q.applied) + applied = {p.name for p in q.applied} patch = None args = list(args) if opts.get('list'): diff --git a/hgext/phabricator.py b/hgext/phabricator.py --- a/hgext/phabricator.py +++ b/hgext/phabricator.py @@ -483,7 +483,7 @@ ] # "precursors" as known by Phabricator - phprecset = set(getnode(d) for d in diffs) + phprecset = {getnode(d) for d in diffs} # Ignore if precursors (Phabricator and local repo) do not overlap, # and force is not set (when commit message says nothing) @@ -1062,7 +1062,7 @@ # username not found is not an error of the API. So check if we have missed # some names here. data = result[b'data'] - resolved = set(entry[b'fields'][b'username'].lower() for entry in data) + resolved = {entry[b'fields'][b'username'].lower() for entry in data} unresolved = set(names) - resolved if unresolved: raise error.Abort( @@ -1635,7 +1635,7 @@ "differential.query". """ # Prefetch hg:meta property for all diffs - diffids = sorted(set(max(int(v) for v in drev[b'diffs']) for drev in drevs)) + diffids = sorted({max(int(v) for v in drev[b'diffs']) for drev in drevs}) diffs = callconduit(ui, b'differential.querydiffs', {b'ids': diffids}) patches = [] @@ -1792,11 +1792,11 @@ """Phabricator differiential status""" revs = repo.revs('sort(_underway(), topo)') drevmap = getdrevmap(repo, revs) - unknownrevs, drevids, revsbydrevid = [], set([]), {} + unknownrevs, drevids, revsbydrevid = [], set(), {} for rev, drevid in pycompat.iteritems(drevmap): if drevid is not None: drevids.add(drevid) - revsbydrevid.setdefault(drevid, set([])).add(rev) + revsbydrevid.setdefault(drevid, set()).add(rev) else: unknownrevs.append(rev) diff --git a/hgext/rebase.py b/hgext/rebase.py --- a/hgext/rebase.py +++ b/hgext/rebase.py @@ -1936,7 +1936,7 @@ # applied patch. But it prevents messing up the working directory when # a partially completed rebase is blocked by mq. if b'qtip' in repo.tags(): - mqapplied = set(repo[s.node].rev() for s in repo.mq.applied) + mqapplied = {repo[s.node].rev() for s in repo.mq.applied} if set(destmap.values()) & mqapplied: raise error.Abort(_(b'cannot rebase onto an applied mq patch')) @@ -2121,7 +2121,7 @@ def _filterobsoleterevs(repo, revs): """returns a set of the obsolete revisions in revs""" - return set(r for r in revs if repo[r].obsolete()) + return {r for r in revs if repo[r].obsolete()} def _computeobsoletenotrebased(repo, rebaseobsrevs, destmap): diff --git a/hgext/remotefilelog/__init__.py b/hgext/remotefilelog/__init__.py --- a/hgext/remotefilelog/__init__.py +++ b/hgext/remotefilelog/__init__.py @@ -737,7 +737,7 @@ # "link" is actually wrong here (it is set to len(changelog)) # if changelog remains unchanged, skip writing file revisions # but still do a sanity check about pending multiple revisions - if len(set(x[3] for x in pendingfilecommits)) > 1: + if len({x[3] for x in pendingfilecommits}) > 1: raise error.ProgrammingError( b'pending multiple integer revisions are not supported' ) diff --git a/hgext/remotefilelog/basepack.py b/hgext/remotefilelog/basepack.py --- a/hgext/remotefilelog/basepack.py +++ b/hgext/remotefilelog/basepack.py @@ -101,7 +101,7 @@ self._lastpack = pack yield pack - cachedpacks = set(pack for pack in self._lrucache) + cachedpacks = {pack for pack in self._lrucache} # Yield for paths not in the cache. for pack in self._packs - cachedpacks: self._lastpack = pack @@ -259,7 +259,7 @@ newpacks = [] if now > self.lastrefresh + REFRESHRATE: self.lastrefresh = now - previous = set(p.path for p in self.packs) + previous = {p.path for p in self.packs} for filepath, __, __ in self._getavailablepackfilessorted(): if filepath not in previous: newpack = self.getpack(filepath) diff --git a/hgext/remotefilelog/contentstore.py b/hgext/remotefilelog/contentstore.py --- a/hgext/remotefilelog/contentstore.py +++ b/hgext/remotefilelog/contentstore.py @@ -300,7 +300,7 @@ rl = self._revlog(name) ancestors = {} - missing = set((node,)) + missing = {node} for ancrev in rl.ancestors([rl.rev(node)], inclusive=True): ancnode = rl.node(ancrev) missing.discard(ancnode) diff --git a/hgext/remotefilelog/datapack.py b/hgext/remotefilelog/datapack.py --- a/hgext/remotefilelog/datapack.py +++ b/hgext/remotefilelog/datapack.py @@ -271,9 +271,9 @@ def cleanup(self, ledger): entries = ledger.sources.get(self, []) allkeys = set(self) - repackedkeys = set( + repackedkeys = { (e.filename, e.node) for e in entries if e.datarepacked or e.gced - ) + } if len(allkeys - repackedkeys) == 0: if self.path not in ledger.created: diff --git a/hgext/remotefilelog/historypack.py b/hgext/remotefilelog/historypack.py --- a/hgext/remotefilelog/historypack.py +++ b/hgext/remotefilelog/historypack.py @@ -132,7 +132,7 @@ known = set() section = self._findsection(name) filename, offset, size, nodeindexoffset, nodeindexsize = section - pending = set((node,)) + pending = {node} o = 0 while o < size: if not pending: @@ -291,9 +291,9 @@ def cleanup(self, ledger): entries = ledger.sources.get(self, []) allkeys = set(self) - repackedkeys = set( + repackedkeys = { (e.filename, e.node) for e in entries if e.historyrepacked - ) + } if len(allkeys - repackedkeys) == 0: if self.path not in ledger.created: @@ -452,7 +452,7 @@ sectionstart = self.packfp.tell() # Write the file section content - entrymap = dict((e[0], e) for e in entries) + entrymap = {e[0]: e for e in entries} def parentfunc(node): x, p1, p2, x, x, x = entrymap[node] diff --git a/hgext/remotefilelog/remotefilelog.py b/hgext/remotefilelog/remotefilelog.py --- a/hgext/remotefilelog/remotefilelog.py +++ b/hgext/remotefilelog/remotefilelog.py @@ -429,7 +429,7 @@ return nullid revmap, parentfunc = self._buildrevgraph(a, b) - nodemap = dict(((v, k) for (k, v) in pycompat.iteritems(revmap))) + nodemap = {v: k for (k, v) in pycompat.iteritems(revmap)} ancs = ancestor.ancestors(parentfunc, revmap[a], revmap[b]) if ancs: @@ -444,7 +444,7 @@ return nullid revmap, parentfunc = self._buildrevgraph(a, b) - nodemap = dict(((v, k) for (k, v) in pycompat.iteritems(revmap))) + nodemap = {v: k for (k, v) in pycompat.iteritems(revmap)} ancs = ancestor.commonancestorsheads(parentfunc, revmap[a], revmap[b]) return map(nodemap.__getitem__, ancs) diff --git a/hgext/remotefilelog/repack.py b/hgext/remotefilelog/repack.py --- a/hgext/remotefilelog/repack.py +++ b/hgext/remotefilelog/repack.py @@ -321,7 +321,7 @@ def _allpackfileswithsuffix(files, packsuffix, indexsuffix): result = [] - fileset = set(fn for fn, mode, stat in files) + fileset = {fn for fn, mode, stat in files} for filename, mode, stat in files: if not filename.endswith(packsuffix): continue diff --git a/hgext/schemes.py b/hgext/schemes.py --- a/hgext/schemes.py +++ b/hgext/schemes.py @@ -97,7 +97,7 @@ parts = parts[:-1] else: tail = b'' - context = dict((b'%d' % (i + 1), v) for i, v in enumerate(parts)) + context = {b'%d' % (i + 1): v for i, v in enumerate(parts)} return b''.join(self.templater.process(self.url, context)) + tail diff --git a/hgext/sparse.py b/hgext/sparse.py --- a/hgext/sparse.py +++ b/hgext/sparse.py @@ -246,7 +246,7 @@ if changedfiles is not None: # In _rebuild, these files will be deleted from the dirstate # when they are not found to be in allfiles - dirstatefilestoremove = set(f for f in self if not matcher(f)) + dirstatefilestoremove = {f for f in self if not matcher(f)} changedfiles = dirstatefilestoremove.union(changedfiles) return orig(self, parent, allfiles, changedfiles) diff --git a/hgext/strip.py b/hgext/strip.py --- a/hgext/strip.py +++ b/hgext/strip.py @@ -228,7 +228,7 @@ for p in repo.dirstate.parents() ) - rootnodes = set(cl.node(r) for r in roots) + rootnodes = {cl.node(r) for r in roots} q = getattr(repo, 'mq', None) if q is not None and q.applied: diff --git a/hgext/transplant.py b/hgext/transplant.py --- a/hgext/transplant.py +++ b/hgext/transplant.py @@ -840,10 +840,10 @@ tf = tp.transplantfilter(repo, source, p1) if opts.get(b'prune'): - prune = set( + prune = { source[r].node() for r in scmutil.revrange(source, opts.get(b'prune')) - ) + } matchfn = lambda x: tf(x) and x not in prune else: matchfn = tf diff --git a/hgext/uncommit.py b/hgext/uncommit.py --- a/hgext/uncommit.py +++ b/hgext/uncommit.py @@ -65,7 +65,7 @@ base = ctx.p1() # ctx initialfiles = set(ctx.files()) - exclude = set(f for f in initialfiles if match(f)) + exclude = {f for f in initialfiles if match(f)} # No files matched commit, so nothing excluded if not exclude: @@ -78,9 +78,9 @@ files = initialfiles - exclude # Filter copies copied = copiesmod.pathcopies(base, ctx) - copied = dict( - (dst, src) for dst, src in pycompat.iteritems(copied) if dst in files - ) + copied = { + dst: src for dst, src in pycompat.iteritems(copied) if dst in files + } def filectxfn(repo, memctx, path, contentctx=ctx, redirect=()): if path not in contentctx: diff --git a/i18n/polib.py b/i18n/polib.py --- a/i18n/polib.py +++ b/i18n/polib.py @@ -722,8 +722,8 @@ object POFile, the reference catalog. """ # Store entries in dict/set for faster access - self_entries = dict((entry.msgid, entry) for entry in self) - refpot_msgids = set(entry.msgid for entry in refpot) + self_entries = {entry.msgid: entry for entry in self} + refpot_msgids = {entry.msgid for entry in refpot} # Merge entries that are in the refpot for entry in refpot: e = self_entries.get(entry.msgid) @@ -1808,9 +1808,9 @@ entry = self._build_entry( msgid=msgid_tokens[0], msgid_plural=msgid_tokens[1], - msgstr_plural=dict( - (k, v) for k, v in enumerate(msgstr.split(b('\0'))) - ), + msgstr_plural={ + k: v for k, v in enumerate(msgstr.split(b('\0'))) + }, ) else: entry = self._build_entry(msgid=msgid, msgstr=msgstr) diff --git a/mercurial/ancestor.py b/mercurial/ancestor.py --- a/mercurial/ancestor.py +++ b/mercurial/ancestor.py @@ -138,7 +138,7 @@ k = 0 for i in interesting: k |= i - return set(n for (i, n) in mapping if k & i) + return {n for (i, n) in mapping if k & i} gca = commonancestorsheads(pfunc, *orignodes) diff --git a/mercurial/branchmap.py b/mercurial/branchmap.py --- a/mercurial/branchmap.py +++ b/mercurial/branchmap.py @@ -446,7 +446,7 @@ # 1 (branch a) -> 2 (branch b) -> 3 (branch a) for branch, newheadrevs in pycompat.iteritems(newbranches): bheads = self._entries.setdefault(branch, []) - bheadset = set(cl.rev(node) for node in bheads) + bheadset = {cl.rev(node) for node in bheads} # This have been tested True on all internal usage of this function. # run it again in case of doubt @@ -582,7 +582,7 @@ @util.propertycache def _namesreverse(self): - return dict((b, r) for r, b in enumerate(self._names)) + return {b: r for r, b in enumerate(self._names)} def branchinfo(self, rev): """Return branch name and close flag for rev, using and updating diff --git a/mercurial/changegroup.py b/mercurial/changegroup.py --- a/mercurial/changegroup.py +++ b/mercurial/changegroup.py @@ -993,7 +993,7 @@ ] manifests.clear() - clrevs = set(cl.rev(x) for x in clnodes) + clrevs = {cl.rev(x) for x in clnodes} it = self.generatefiles( changedfiles, @@ -1282,9 +1282,7 @@ flinkrev = store.linkrev fnode = store.node revs = ((r, flinkrev(r)) for r in store) - return dict( - (fnode(r), cln(lr)) for r, lr in revs if lr in clrevs - ) + return {fnode(r): cln(lr) for r, lr in revs if lr in clrevs} clrevtolocalrev = {} diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py --- a/mercurial/cmdutil.py +++ b/mercurial/cmdutil.py @@ -3125,7 +3125,7 @@ ms = mergemod.mergestate.read(repo) mergeutil.checkunresolved(ms) - filestoamend = set(f for f in wctx.files() if matcher(f)) + filestoamend = {f for f in wctx.files() if matcher(f)} changes = len(filestoamend) > 0 if changes: @@ -3917,7 +3917,7 @@ # Apply changes fp = stringio() # chunks are serialized per file, but files aren't sorted - for f in sorted(set(c.header.filename() for c in chunks if ishunk(c))): + for f in sorted({c.header.filename() for c in chunks if ishunk(c)}): prntstatusmsg(b'revert', f) files = set() for c in chunks: diff --git a/mercurial/commands.py b/mercurial/commands.py --- a/mercurial/commands.py +++ b/mercurial/commands.py @@ -3721,9 +3721,9 @@ heads = [repo[h] for h in heads] if branchrevs: - branches = set( + branches = { repo[r].branch() for r in scmutil.revrange(repo, branchrevs) - ) + } heads = [h for h in heads if h.branch() in branches] if opts.get(b'active') and branchrevs: @@ -3731,7 +3731,7 @@ heads = [h for h in heads if h.node() in dagheads] if branchrevs: - haveheads = set(h.branch() for h in heads) + haveheads = {h.branch() for h in heads} if branches - haveheads: headless = b', '.join(b for b in branches - haveheads) msg = _(b'no open branch heads found on branches %s') diff --git a/mercurial/debugcommands.py b/mercurial/debugcommands.py --- a/mercurial/debugcommands.py +++ b/mercurial/debugcommands.py @@ -584,7 +584,7 @@ dots = opts.get('dots') if file_: rlog = revlog.revlog(vfsmod.vfs(encoding.getcwd(), audit=False), file_) - revs = set((int(r) for r in revs)) + revs = {int(r) for r in revs} def events(): for r in rlog: @@ -1134,7 +1134,7 @@ (b'analyzed', filesetlang.analyze), (b'optimized', filesetlang.optimize), ] - stagenames = set(n for n, f in stages) + stagenames = {n for n, f in stages} showalways = set() if ui.verbose and not opts[b'show_stage']: @@ -2598,7 +2598,7 @@ dirstatefiles = set(dirstate) manifestonly = manifestfiles - dirstatefiles dsonly = dirstatefiles - manifestfiles - dsnotadded = set(f for f in dsonly if dirstate[f] != b'a') + dsnotadded = {f for f in dsonly if dirstate[f] != b'a'} changedfiles = manifestonly | dsnotadded dirstate.rebuild(ctx.node(), ctx.manifest(), changedfiles) @@ -3165,7 +3165,7 @@ raise error.Abort( _(b'cannot use --verify-optimized with --no-optimized') ) - stagenames = set(n for n, f in stages) + stagenames = {n for n, f in stages} showalways = set() showchanged = set() diff --git a/mercurial/discovery.py b/mercurial/discovery.py --- a/mercurial/discovery.py +++ b/mercurial/discovery.py @@ -188,7 +188,7 @@ # ancestors of missing og._computecommonmissing() cl = repo.changelog - missingrevs = set(cl.rev(n) for n in og._missing) + missingrevs = {cl.rev(n) for n in og._missing} og._common = set(cl.ancestors(missingrevs)) - missingrevs commonheads = set(og.commonheads) og.missingheads = [h for h in og.missingheads if h not in commonheads] @@ -264,8 +264,8 @@ # If there are no obsstore, no post processing are needed. if repo.obsstore: torev = repo.changelog.rev - futureheads = set(torev(h) for h in outgoing.missingheads) - futureheads |= set(torev(h) for h in outgoing.commonheads) + futureheads = {torev(h) for h in outgoing.missingheads} + futureheads |= {torev(h) for h in outgoing.commonheads} allfuturecommon = repo.changelog.ancestors(futureheads, inclusive=True) for branch, heads in sorted(pycompat.iteritems(headssum)): remoteheads, newheads, unsyncedheads, placeholder = heads diff --git a/mercurial/dispatch.py b/mercurial/dispatch.py --- a/mercurial/dispatch.py +++ b/mercurial/dispatch.py @@ -514,7 +514,7 @@ ''' # util.interpolate can't deal with "$@" (with quotes) because it's only # built to match prefix + patterns. - replacemap = dict((b'$%d' % (i + 1), arg) for i, arg in enumerate(args)) + replacemap = {b'$%d' % (i + 1): arg for i, arg in enumerate(args)} replacemap[b'$0'] = name replacemap[b'$$'] = b'$' replacemap[b'$@'] = b' '.join(args) diff --git a/mercurial/encoding.py b/mercurial/encoding.py --- a/mercurial/encoding.py +++ b/mercurial/encoding.py @@ -86,10 +86,10 @@ else: # preferred encoding isn't known yet; use utf-8 to avoid unicode error # and recreate it once encoding is settled - environ = dict( - (k.encode('utf-8'), v.encode('utf-8')) + environ = { + k.encode('utf-8'): v.encode('utf-8') for k, v in os.environ.items() # re-exports - ) + } _encodingrewrites = { b'646': b'ascii', @@ -285,10 +285,10 @@ if not _nativeenviron: # now encoding and helper functions are available, recreate the environ # dict to be exported to other modules - environ = dict( - (tolocal(k.encode('utf-8')), tolocal(v.encode('utf-8'))) + environ = { + tolocal(k.encode('utf-8')): tolocal(v.encode('utf-8')) for k, v in os.environ.items() # re-exports - ) + } if pycompat.ispy3: # os.getcwd() on Python 3 returns string, but it has os.getcwdb() which diff --git a/mercurial/exchange.py b/mercurial/exchange.py --- a/mercurial/exchange.py +++ b/mercurial/exchange.py @@ -1679,12 +1679,12 @@ def headsofdiff(h1, h2): """Returns heads(h1 % h2)""" res = unfi.set(b'heads(%ln %% %ln)', h1, h2) - return set(ctx.node() for ctx in res) + return {ctx.node() for ctx in res} def headsofunion(h1, h2): """Returns heads((h1 + h2) - null)""" res = unfi.set(b'heads((%ln + %ln - null))', h1, h2) - return set(ctx.node() for ctx in res) + return {ctx.node() for ctx in res} while True: old_heads = unficl.heads() diff --git a/mercurial/extensions.py b/mercurial/extensions.py --- a/mercurial/extensions.py +++ b/mercurial/extensions.py @@ -787,11 +787,11 @@ try: from hgext import __index__ # pytype: disable=import-error - return dict( - (name, gettext(desc)) + return { + name: gettext(desc) for name, desc in pycompat.iteritems(__index__.docs) if name not in _order - ) + } except (ImportError, AttributeError): pass diff --git a/mercurial/fancyopts.py b/mercurial/fancyopts.py --- a/mercurial/fancyopts.py +++ b/mercurial/fancyopts.py @@ -314,7 +314,7 @@ argmap = {} defmap = {} negations = {} - alllong = set(o[1] for o in options) + alllong = {o[1] for o in options} for option in options: if len(option) == 5: diff --git a/mercurial/graphmod.py b/mercurial/graphmod.py --- a/mercurial/graphmod.py +++ b/mercurial/graphmod.py @@ -58,7 +58,7 @@ # partition into parents in the rev set and missing parents, then # augment the lists with markers, to inform graph drawing code about # what kind of edge to draw between nodes. - pset = set(p.rev() for p in ctx.parents() if p.rev() in revs) + pset = {p.rev() for p in ctx.parents() if p.rev() in revs} mpars = [ p.rev() for p in ctx.parents() @@ -95,9 +95,9 @@ include = set(nodes) for node in nodes: ctx = repo[node] - parents = set( + parents = { (PARENT, p.rev()) for p in ctx.parents() if p.node() in include - ) + } yield (ctx.rev(), CHANGESET, ctx, sorted(parents)) diff --git a/mercurial/hbisect.py b/mercurial/hbisect.py --- a/mercurial/hbisect.py +++ b/mercurial/hbisect.py @@ -137,7 +137,7 @@ side = state[b'bad'] else: side = state[b'good'] - num = len(set(i.node() for i in parents) & set(side)) + num = len({i.node() for i in parents} & set(side)) if num == 1: return parents[0].ancestor(parents[1]) return None diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -1809,7 +1809,7 @@ # map tag name to (node, hist) alltags = tagsmod.findglobaltags(self.ui, self) # map tag name to tag type - tagtypes = dict((tag, b'global') for tag in alltags) + tagtypes = {tag: b'global' for tag in alltags} tagsmod.readlocaltags(self.ui, self, alltags, tagtypes) @@ -1822,12 +1822,10 @@ if node != nullid: tags[encoding.tolocal(name)] = node tags[b'tip'] = self.changelog.tip() - tagtypes = dict( - [ - (encoding.tolocal(name), value) - for (name, value) in pycompat.iteritems(tagtypes) - ] - ) + tagtypes = { + encoding.tolocal(name): value + for (name, value) in pycompat.iteritems(tagtypes) + } return (tags, tagtypes) def tagtype(self, tagname): diff --git a/mercurial/match.py b/mercurial/match.py --- a/mercurial/match.py +++ b/mercurial/match.py @@ -772,7 +772,7 @@ candidates = self._fileset | self._dirs - {b''} if dir != b'': d = dir + b'/' - candidates = set(c[len(d) :] for c in candidates if c.startswith(d)) + candidates = {c[len(d) :] for c in candidates if c.startswith(d)} # self._dirs includes all of the directories, recursively, so if # we're attempting to match foo/bar/baz.txt, it'll have '', 'foo', # 'foo/bar' in it. Thus we can safely ignore a candidate that has a diff --git a/mercurial/mdiff.py b/mercurial/mdiff.py --- a/mercurial/mdiff.py +++ b/mercurial/mdiff.py @@ -91,7 +91,7 @@ ) def copy(self, **kwargs): - opts = dict((k, getattr(self, k)) for k in self.defaults) + opts = {k: getattr(self, k) for k in self.defaults} opts = pycompat.strkwargs(opts) opts.update(kwargs) return diffopts(**opts) diff --git a/mercurial/merge.py b/mercurial/merge.py --- a/mercurial/merge.py +++ b/mercurial/merge.py @@ -1796,8 +1796,8 @@ def emptyactions(): """create an actions dict, to be populated and passed to applyupdates()""" - return dict( - (m, []) + return { + m: [] for m in ( ACTION_ADD, ACTION_ADD_MODIFIED, @@ -1814,7 +1814,7 @@ ACTION_PATH_CONFLICT, ACTION_PATH_CONFLICT_RESOLVE, ) - ) + } def applyupdates( @@ -2070,7 +2070,7 @@ extraactions = ms.actions() if extraactions: - mfiles = set(a[0] for a in actions[ACTION_MERGE]) + mfiles = {a[0] for a in actions[ACTION_MERGE]} for k, acts in pycompat.iteritems(extraactions): actions[k].extend(acts) if k == ACTION_GET and wantfiledata: diff --git a/mercurial/obsolete.py b/mercurial/obsolete.py --- a/mercurial/obsolete.py +++ b/mercurial/obsolete.py @@ -939,7 +939,7 @@ getnode = repo.changelog.node notpublic = _mutablerevs(repo) isobs = repo.obsstore.successors.__contains__ - obs = set(r for r in notpublic if isobs(getnode(r))) + obs = {r for r in notpublic if isobs(getnode(r))} return obs @@ -965,7 +965,7 @@ def _computesuspendedset(repo): """the set of obsolete parents with non obsolete descendants""" suspended = repo.changelog.ancestors(getrevs(repo, b'orphan')) - return set(r for r in getrevs(repo, b'obsolete') if r in suspended) + return {r for r in getrevs(repo, b'obsolete') if r in suspended} @cachefor(b'extinct') diff --git a/mercurial/obsutil.py b/mercurial/obsutil.py --- a/mercurial/obsutil.py +++ b/mercurial/obsutil.py @@ -194,7 +194,7 @@ def _filterprunes(markers): """return a set with no prune markers""" - return set(m for m in markers if m[1]) + return {m for m in markers if m[1]} def exclusivemarkers(repo, nodes): @@ -338,12 +338,12 @@ # compute the whole set of successors or descendants while len(foreground) != plen: plen = len(foreground) - succs = set(c.node() for c in foreground) + succs = {c.node() for c in foreground} mutable = [c.node() for c in foreground if c.mutable()] succs.update(allsuccessors(repo.obsstore, mutable)) known = (n for n in succs if has_node(n)) foreground = set(repo.set(b'%ln::', known)) - return set(c.node() for c in foreground) + return {c.node() for c in foreground} # effectflag field @@ -855,11 +855,11 @@ """ Returns a sorted list of markers users without duplicates """ markersmeta = [dict(m[3]) for m in markers] - users = set( + users = { encoding.tolocal(meta[b'user']) for meta in markersmeta if meta.get(b'user') - ) + } return sorted(users) @@ -868,9 +868,9 @@ """ Returns a sorted list of markers operations without duplicates """ markersmeta = [dict(m[3]) for m in markers] - operations = set( + operations = { meta.get(b'operation') for meta in markersmeta if meta.get(b'operation') - ) + } return sorted(operations) diff --git a/mercurial/patch.py b/mercurial/patch.py --- a/mercurial/patch.py +++ b/mercurial/patch.py @@ -2888,7 +2888,7 @@ or 'rename' (the latter two only if opts.git is set).''' gone = set() - copyto = dict([(v, k) for k, v in copy.items()]) + copyto = {v: k for k, v in copy.items()} addedset, removedset = set(added), set(removed) diff --git a/mercurial/phases.py b/mercurial/phases.py --- a/mercurial/phases.py +++ b/mercurial/phases.py @@ -445,10 +445,10 @@ phasetracking, r, self.phase(repo, r), targetphase ) - roots = set( + roots = { ctx.node() for ctx in repo.set(b'roots((%ln::) - %ld)', olds, affected) - ) + } if olds != roots: self._updateroots(phase, roots, tr) # some roots may need to be declared for lower phases @@ -518,9 +518,7 @@ ] updatedroots = repo.set(b'roots(%ln::)', aboveroots) - finalroots = set( - n for n in currentroots if repo[n].rev() < minnewroot - ) + finalroots = {n for n in currentroots if repo[n].rev() < minnewroot} finalroots.update(ctx.node() for ctx in updatedroots) if finalroots != oldroots: self._updateroots(targetphase, finalroots, tr) @@ -760,7 +758,7 @@ if not heads or heads == [nullid]: return [] # The logic operated on revisions, convert arguments early for convenience - new_heads = set(rev(n) for n in heads if n != nullid) + new_heads = {rev(n) for n in heads if n != nullid} roots = [rev(n) for n in roots] # compute the area we need to remove affected_zone = repo.revs(b"(%ld::%ld)", roots, new_heads) diff --git a/mercurial/pycompat.py b/mercurial/pycompat.py --- a/mercurial/pycompat.py +++ b/mercurial/pycompat.py @@ -334,7 +334,7 @@ they can be passed as keyword arguments as dictonaries with bytes keys can't be passed as keyword arguments to functions on Python 3. """ - dic = dict((k.decode('latin-1'), v) for k, v in dic.items()) + dic = {k.decode('latin-1'): v for k, v in dic.items()} return dic def byteskwargs(dic): @@ -342,7 +342,7 @@ Converts keys of python dictonaries to bytes as they were converted to str to pass that dictonary as a keyword argument on Python 3. """ - dic = dict((k.encode('latin-1'), v) for k, v in dic.items()) + dic = {k.encode('latin-1'): v for k, v in dic.items()} return dic # TODO: handle shlex.shlex(). diff --git a/mercurial/repair.py b/mercurial/repair.py --- a/mercurial/repair.py +++ b/mercurial/repair.py @@ -351,7 +351,7 @@ def safestriproots(ui, repo, nodes): """return list of roots of nodes where descendants are covered by nodes""" torev = repo.unfiltered().changelog.rev - revs = set(torev(n) for n in nodes) + revs = {torev(n) for n in nodes} # tostrip = wanted - unsafe = wanted - ancestors(orphaned) # orphaned = affected - wanted # affected = descendants(roots(wanted)) diff --git a/mercurial/revlog.py b/mercurial/revlog.py --- a/mercurial/revlog.py +++ b/mercurial/revlog.py @@ -1286,7 +1286,7 @@ else: start = self.rev(start) - stoprevs = set(self.rev(n) for n in stop or []) + stoprevs = {self.rev(n) for n in stop or []} revs = dagop.headrevssubset( self.revs, self.parentrevs, startrev=start, stoprevs=stoprevs diff --git a/mercurial/revset.py b/mercurial/revset.py --- a/mercurial/revset.py +++ b/mercurial/revset.py @@ -1875,7 +1875,7 @@ The set of all parents for all changesets in set, or the working directory. """ if x is None: - ps = set(p.rev() for p in repo[x].parents()) + ps = {p.rev() for p in repo[x].parents()} else: ps = set() cl = repo.changelog @@ -2437,7 +2437,7 @@ cl = repo.unfiltered().changelog torev = cl.index.get_rev tonode = cl.node - result = set(torev(n) for n in f(tonode(r) for r in s)) + result = {torev(n) for n in f(tonode(r) for r in s)} result.discard(None) return smartset.baseset(result - repo.changelog.filteredrevs) diff --git a/mercurial/scmutil.py b/mercurial/scmutil.py --- a/mercurial/scmutil.py +++ b/mercurial/scmutil.py @@ -1457,10 +1457,10 @@ # Merge old parent and old working dir copies oldcopies = copiesmod.pathcopies(newctx, oldctx, match) oldcopies.update(copies) - copies = dict( - (dst, oldcopies.get(src, src)) + copies = { + dst: oldcopies.get(src, src) for dst, src in pycompat.iteritems(oldcopies) - ) + } # Adjust the dirstate copies for dst, src in pycompat.iteritems(copies): if src not in newctx or dst in newctx or ds[dst] != b'a': diff --git a/mercurial/store.py b/mercurial/store.py --- a/mercurial/store.py +++ b/mercurial/store.py @@ -137,7 +137,7 @@ asciistr = list(map(xchr, range(127))) capitals = list(range(ord(b"A"), ord(b"Z") + 1)) - cmap = dict((x, x) for x in asciistr) + cmap = {x: x for x in asciistr} for x in _reserved(): cmap[xchr(x)] = b"~%02x" % x for x in capitals + [ord(e)]: @@ -200,7 +200,7 @@ 'the~07quick~adshot' ''' xchr = pycompat.bytechr - cmap = dict([(xchr(x), xchr(x)) for x in pycompat.xrange(127)]) + cmap = {xchr(x): xchr(x) for x in pycompat.xrange(127)} for x in _reserved(): cmap[xchr(x)] = b"~%02x" % x for x in range(ord(b"A"), ord(b"Z") + 1): diff --git a/mercurial/upgrade.py b/mercurial/upgrade.py --- a/mercurial/upgrade.py +++ b/mercurial/upgrade.py @@ -1129,7 +1129,7 @@ """Upgrade a repository in place.""" if optimize is None: optimize = [] - optimize = set(legacy_opts_map.get(o, o) for o in optimize) + optimize = {legacy_opts_map.get(o, o) for o in optimize} repo = repo.unfiltered() revlogs = set(UPGRADE_ALL_REVLOGS) diff --git a/mercurial/url.py b/mercurial/url.py --- a/mercurial/url.py +++ b/mercurial/url.py @@ -224,13 +224,11 @@ def _generic_proxytunnel(self): - proxyheaders = dict( - [ - (x, self.headers[x]) - for x in self.headers - if x.lower().startswith('proxy-') - ] - ) + proxyheaders = { + x: self.headers[x] + for x in self.headers + if x.lower().startswith('proxy-') + } self.send(b'CONNECT %s HTTP/1.0\r\n' % self.realhostport) for header in pycompat.iteritems(proxyheaders): self.send(b'%s: %s\r\n' % header) diff --git a/mercurial/util.py b/mercurial/util.py --- a/mercurial/util.py +++ b/mercurial/util.py @@ -2213,7 +2213,7 @@ ''' def _makefspathcacheentry(dir): - return dict((normcase(n), n) for n in os.listdir(dir)) + return {normcase(n): n for n in os.listdir(dir)} seps = pycompat.ossep if pycompat.osaltsep: diff --git a/mercurial/utils/storageutil.py b/mercurial/utils/storageutil.py --- a/mercurial/utils/storageutil.py +++ b/mercurial/utils/storageutil.py @@ -364,7 +364,7 @@ if nodesorder == b'nodes': revs = [frev(n) for n in nodes] elif nodesorder == b'linear': - revs = set(frev(n) for n in nodes) + revs = {frev(n) for n in nodes} revs = dagop.linearize(revs, store.parentrevs) else: # storage and default revs = sorted(frev(n) for n in nodes) diff --git a/mercurial/windows.py b/mercurial/windows.py --- a/mercurial/windows.py +++ b/mercurial/windows.py @@ -535,13 +535,11 @@ cache = dircache.get(dir, None) if cache is None: try: - dmap = dict( - [ - (normcase(n), s) - for n, k, s in listdir(dir, True) - if getkind(s.st_mode) in _wantedkinds - ] - ) + dmap = { + normcase(n): s + for n, k, s in listdir(dir, True) + if getkind(s.st_mode) in _wantedkinds + } except OSError as err: # Python >= 2.5 returns ENOENT and adds winerror field # EINVAL is raised if dir is not a directory. diff --git a/mercurial/wireprototypes.py b/mercurial/wireprototypes.py --- a/mercurial/wireprototypes.py +++ b/mercurial/wireprototypes.py @@ -383,8 +383,8 @@ # reason for it (like server operators wanting to achieve specific # performance characteristics). So fail fast if the config references # unusable compression engines. - validnames = set(e.name() for e in compengines) - invalidnames = set(e for e in configengines if e not in validnames) + validnames = {e.name() for e in compengines} + invalidnames = {e for e in configengines if e not in validnames} if invalidnames: raise error.Abort( _(b'invalid compression engine defined in %s: %s') diff --git a/setup.py b/setup.py --- a/setup.py +++ b/setup.py @@ -935,11 +935,11 @@ normalizecrlf('doc/%s.html' % root) # This logic is duplicated in doc/Makefile. - sources = set( + sources = { f for f in os.listdir('mercurial/helptext') if re.search(r'[0-9]\.txt$', f) - ) + } # common.txt is a one-off. gentxt('common') @@ -979,7 +979,7 @@ # Screen out egg related commands to prevent egg generation. But allow # mercurial.egg-info generation, since that is part of modern # packaging. - excl = set(['bdist_egg']) + excl = {'bdist_egg'} return filter(lambda x: x not in excl, install.get_sub_commands(self)) diff --git a/tests/run-tests.py b/tests/run-tests.py --- a/tests/run-tests.py +++ b/tests/run-tests.py @@ -1553,7 +1553,7 @@ NEEDESCAPE = re.compile(br'[\x00-\x08\x0b-\x1f\x7f-\xff]').search ESCAPESUB = re.compile(br'[\x00-\x08\x0b-\x1f\\\x7f-\xff]').sub - ESCAPEMAP = dict((bchr(i), br'\x%02x' % i) for i in range(256)) + ESCAPEMAP = {bchr(i): br'\x%02x' % i for i in range(256)} ESCAPEMAP.update({b'\\': b'\\\\', b'\r': br'\r'}) def __init__(self, path, *args, **kwds): @@ -2524,7 +2524,7 @@ def savetimes(outputdir, result): saved = dict(loadtimes(outputdir)) maxruns = 5 - skipped = set([str(t[0]) for t in result.skipped]) + skipped = {str(t[0]) for t in result.skipped} for tdata in result.times: test, real = tdata[0], tdata[3] if test not in skipped: @@ -2737,7 +2737,7 @@ @staticmethod def _writexunit(result, outf): # See http://llg.cubic.org/docs/junit/ for a reference. - timesd = dict((t[0], t[3]) for t in result.times) + timesd = {t[0]: t[3] for t in result.times} doc = minidom.Document() s = doc.createElement('testsuite') s.setAttribute('errors', "0") # TODO @@ -3343,7 +3343,7 @@ tmpdir = os.path.join(self._hgtmp, b'child%d' % count) # extra keyword parameters. 'case' is used by .t tests - kwds = dict((k, testdesc[k]) for k in ['case'] if k in testdesc) + kwds = {k: testdesc[k] for k in ['case'] if k in testdesc} t = testcls( refpath, diff --git a/tests/simplestorerepo.py b/tests/simplestorerepo.py --- a/tests/simplestorerepo.py +++ b/tests/simplestorerepo.py @@ -588,7 +588,7 @@ start = nullid if stop is None: stop = [] - stoprevs = set([self.rev(n) for n in stop]) + stoprevs = {self.rev(n) for n in stop} startrev = self.rev(start) reachable = {startrev} heads = {startrev} diff --git a/tests/test-fastannotate-revmap.py b/tests/test-fastannotate-revmap.py --- a/tests/test-fastannotate-revmap.py +++ b/tests/test-fastannotate-revmap.py @@ -165,7 +165,7 @@ rm2.flush() # two files should be the same - ensure(len(set(util.readfile(p) for p in [path, path2])) == 1) + ensure(len({util.readfile(p) for p in [path, path2]}) == 1) os.unlink(path) os.unlink(path2) diff --git a/tests/test-hgweb-auth.py b/tests/test-hgweb-auth.py --- a/tests/test-hgweb-auth.py +++ b/tests/test-hgweb-auth.py @@ -52,7 +52,7 @@ for name in (b'.username', b'.password'): if (p + name) not in auth: auth[p + name] = p - auth = dict((k, v) for k, v in auth.items() if v is not None) + auth = {k: v for k, v in auth.items() if v is not None} ui = writeauth(auth) diff --git a/tests/test-revlog-raw.py b/tests/test-revlog-raw.py --- a/tests/test-revlog-raw.py +++ b/tests/test-revlog-raw.py @@ -229,7 +229,7 @@ # Gray Code. See https://en.wikipedia.org/wiki/Gray_code gray = lambda x: x ^ (x >> 1) - reversegray = dict((gray(i), i) for i in range(m)) + reversegray = {gray(i): i for i in range(m)} # Generate (n * 2) bit gray code, yield lower n bits as X, and look for # the next unused gray code where higher n bits equal to X. diff --git a/tests/wireprotosimplecache.py b/tests/wireprotosimplecache.py --- a/tests/wireprotosimplecache.py +++ b/tests/wireprotosimplecache.py @@ -116,7 +116,7 @@ redirectable = False else: clienttargets = set(self.redirecttargets) - ourtargets = set(t[b'name'] for t in loadredirecttargets(self.ui)) + ourtargets = {t[b'name'] for t in loadredirecttargets(self.ui)} # We only ever redirect to a single target (for now). So we don't # need to store which target matched.