Mercurial > hg
diff mercurial/sparse.py @ 33300:f7a106b3f089
sparse: move resolving of sparse patterns for rev into core
This method is reasonably well-contained and simple to move.
As part of the move, some light formatting was performed.
A "working copy" reference in an error message was changed to
"working directory."
The biggest change was to _refreshoncommit() in sparse.py. It
was previously checking for the existence of an attribute on
the repo instance. Since the moved function now returns empty
data if sparse isn't enabled, we unconditionally call the
new function. However, we do have to protect another method
call in that function. This will all be unhacked eventually.
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Thu, 06 Jul 2017 12:15:14 -0700 |
parents | 41448fc51510 |
children | ca4b78eb11e7 |
line wrap: on
line diff
--- a/mercurial/sparse.py Thu Jul 06 12:06:37 2017 -0700 +++ b/mercurial/sparse.py Thu Jul 06 12:15:14 2017 -0700 @@ -58,3 +58,60 @@ # TODO add some kind of cache here because this incurs a manifest # resolve and can be slow. return repo.filectx(profile, changeid=changeid).data() + +def patternsforrev(repo, rev): + """Obtain sparse checkout patterns for the given rev. + + Returns a tuple of iterables representing includes, excludes, and + patterns. + """ + # Feature isn't enabled. No-op. + if not enabled: + return set(), set(), [] + + raw = repo.vfs.tryread('sparse') + if not raw: + return set(), set(), [] + + if rev is None: + raise error.Abort(_('cannot parse sparse patterns from working ' + 'directory')) + + includes, excludes, profiles = parseconfig(repo.ui, raw) + ctx = repo[rev] + + if profiles: + visited = set() + while profiles: + profile = profiles.pop() + if profile in visited: + continue + + visited.add(profile) + + try: + raw = readprofile(repo, profile, rev) + except error.ManifestLookupError: + msg = ( + "warning: sparse profile '%s' not found " + "in rev %s - ignoring it\n" % (profile, ctx)) + # experimental config: sparse.missingwarning + if repo.ui.configbool( + 'sparse', 'missingwarning', True): + repo.ui.warn(msg) + else: + repo.ui.debug(msg) + continue + + pincludes, pexcludes, subprofs = parseconfig(repo.ui, raw) + includes.update(pincludes) + excludes.update(pexcludes) + for subprofile in subprofs: + profiles.append(subprofile) + + profiles = visited + + if includes: + includes.add('.hg*') + + return includes, excludes, profiles