# HG changeset patch # User Gregory Szorc # Date 1499547692 25200 # Node ID 482320104672770d9dc1b5d47957ba05135ad997 # Parent d36bcba91845b88aedbcc8ec7415dab500d56c63 sparse: refactor activeprofiles into a generic function (API) activeprofiles() is a special case of a more generic function. Furthermore, that generic function is essentially already implemented inline in the sparse extension. So, refactor activeprofiles() to a generic activeconfig(). Change the only consumer of activeprofiles() to use it. And have the inline implementation in the sparse extension use it. diff -r d36bcba91845 -r 482320104672 hgext/sparse.py --- a/hgext/sparse.py Fri Jul 07 15:11:11 2017 -0400 +++ b/hgext/sparse.py Sat Jul 08 14:01:32 2017 -0700 @@ -75,7 +75,6 @@ from __future__ import absolute_import from mercurial.i18n import _ -from mercurial.node import nullid from mercurial import ( cmdutil, commands, @@ -448,23 +447,13 @@ def _import(ui, repo, files, opts, force=False): with repo.wlock(): - # load union of current active profile - revs = [repo.changelog.rev(node) for node in - repo.dirstate.parents() if node != nullid] - # read current configuration raw = repo.vfs.tryread('sparse') oincludes, oexcludes, oprofiles = sparse.parseconfig(ui, raw) includes, excludes, profiles = map( set, (oincludes, oexcludes, oprofiles)) - # all active rules - aincludes, aexcludes, aprofiles = set(), set(), set() - for rev in revs: - rincludes, rexcludes, rprofiles = sparse.patternsforrev(repo, rev) - aincludes.update(rincludes) - aexcludes.update(rexcludes) - aprofiles.update(rprofiles) + aincludes, aexcludes, aprofiles = sparse.activeconfig(repo) # import rules on top; only take in rules that are not yet # part of the active rules. diff -r d36bcba91845 -r 482320104672 mercurial/sparse.py --- a/mercurial/sparse.py Fri Jul 07 15:11:11 2017 -0400 +++ b/mercurial/sparse.py Sat Jul 08 14:01:32 2017 -0700 @@ -124,15 +124,26 @@ return includes, excludes, profiles -def activeprofiles(repo): +def activeconfig(repo): + """Determine the active sparse config rules. + + Rules are constructed by reading the current sparse config and bringing in + referenced profiles from parents of the working directory. + """ revs = [repo.changelog.rev(node) for node in repo.dirstate.parents() if node != nullid] - profiles = set() + allincludes = set() + allexcludes = set() + allprofiles = set() + for rev in revs: - profiles.update(patternsforrev(repo, rev)[2]) + includes, excludes, profiles = patternsforrev(repo, rev) + allincludes |= includes + allexcludes |= excludes + allprofiles |= set(profiles) - return profiles + return allincludes, allexcludes, allprofiles def configsignature(repo, includetemp=True): """Obtain the signature string for the current sparse configuration. @@ -361,7 +372,7 @@ for file, flags, msg in actions: dirstate.normal(file) - profiles = activeprofiles(repo) + profiles = activeconfig(repo)[2] changedprofiles = profiles & files # If an active profile changed during the update, refresh the checkout. # Don't do this during a branch merge, since all incoming changes should