##// END OF EJS Templates
sparse: move config parsing into core...
Gregory Szorc -
r33297:ba5d8977 default
parent child Browse files
Show More
@@ -0,0 +1,48 b''
1 # sparse.py - functionality for sparse checkouts
2 #
3 # Copyright 2014 Facebook, Inc.
4 #
5 # This software may be used and distributed according to the terms of the
6 # GNU General Public License version 2 or any later version.
7
8 from __future__ import absolute_import
9
10 from .i18n import _
11 from . import (
12 error,
13 )
14
15 def parseconfig(ui, raw):
16 """Parse sparse config file content.
17
18 Returns a tuple of includes, excludes, and profiles.
19 """
20 includes = set()
21 excludes = set()
22 current = includes
23 profiles = []
24 for line in raw.split('\n'):
25 line = line.strip()
26 if not line or line.startswith('#'):
27 # empty or comment line, skip
28 continue
29 elif line.startswith('%include '):
30 line = line[9:].strip()
31 if line:
32 profiles.append(line)
33 elif line == '[include]':
34 if current != includes:
35 # TODO pass filename into this API so we can report it.
36 raise error.Abort(_('sparse config cannot have includes ' +
37 'after excludes'))
38 continue
39 elif line == '[exclude]':
40 current = excludes
41 elif line:
42 if line.strip().startswith('/'):
43 ui.warn(_('warning: sparse profile cannot use' +
44 ' paths starting with /, ignoring %s\n') % line)
45 continue
46 current.add(line)
47
48 return includes, excludes, profiles
@@ -92,6 +92,7 b' from mercurial import ('
92 92 match as matchmod,
93 93 merge as mergemod,
94 94 registrar,
95 sparse,
95 96 util,
96 97 )
97 98
@@ -407,40 +408,6 b' def _setupdirstate(ui):'
407 408
408 409 def _wraprepo(ui, repo):
409 410 class SparseRepo(repo.__class__):
410 def readsparseconfig(self, raw):
411 """Takes a string sparse config and returns the includes,
412 excludes, and profiles it specified.
413 """
414 includes = set()
415 excludes = set()
416 current = includes
417 profiles = []
418 for line in raw.split('\n'):
419 line = line.strip()
420 if not line or line.startswith('#'):
421 # empty or comment line, skip
422 continue
423 elif line.startswith('%include '):
424 line = line[9:].strip()
425 if line:
426 profiles.append(line)
427 elif line == '[include]':
428 if current != includes:
429 raise error.Abort(_('.hg/sparse cannot have includes ' +
430 'after excludes'))
431 continue
432 elif line == '[exclude]':
433 current = excludes
434 elif line:
435 if line.strip().startswith('/'):
436 self.ui.warn(_('warning: sparse profile cannot use' +
437 ' paths starting with /, ignoring %s\n')
438 % line)
439 continue
440 current.add(line)
441
442 return includes, excludes, profiles
443
444 411 def getsparsepatterns(self, rev):
445 412 """Returns the include/exclude patterns specified by the
446 413 given rev.
@@ -452,7 +419,7 b' def _wraprepo(ui, repo):'
452 419 raise error.Abort(_("cannot parse sparse patterns from " +
453 420 "working copy"))
454 421
455 includes, excludes, profiles = self.readsparseconfig(raw)
422 includes, excludes, profiles = sparse.parseconfig(self.ui, raw)
456 423
457 424 ctx = self[rev]
458 425 if profiles:
@@ -475,8 +442,8 b' def _wraprepo(ui, repo):'
475 442 else:
476 443 self.ui.debug(msg)
477 444 continue
478 pincludes, pexcludes, subprofs = \
479 self.readsparseconfig(raw)
445 pincludes, pexcludes, subprofs = sparse.parseconfig(
446 self.ui, raw)
480 447 includes.update(pincludes)
481 448 excludes.update(pexcludes)
482 449 for subprofile in subprofs:
@@ -787,7 +754,7 b' def _config(ui, repo, pats, opts, includ'
787 754 raw = repo.vfs.tryread('sparse')
788 755 if raw:
789 756 oldinclude, oldexclude, oldprofiles = map(
790 set, repo.readsparseconfig(raw))
757 set, sparse.parseconfig(ui, raw))
791 758 else:
792 759 oldinclude = set()
793 760 oldexclude = set()
@@ -846,7 +813,7 b' def _import(ui, repo, files, opts, force'
846 813
847 814 # read current configuration
848 815 raw = repo.vfs.tryread('sparse')
849 oincludes, oexcludes, oprofiles = repo.readsparseconfig(raw)
816 oincludes, oexcludes, oprofiles = sparse.parseconfig(ui, raw)
850 817 includes, excludes, profiles = map(
851 818 set, (oincludes, oexcludes, oprofiles))
852 819
@@ -863,8 +830,8 b' def _import(ui, repo, files, opts, force'
863 830 changed = False
864 831 for file in files:
865 832 with util.posixfile(util.expandpath(file)) as importfile:
866 iincludes, iexcludes, iprofiles = repo.readsparseconfig(
867 importfile.read())
833 iincludes, iexcludes, iprofiles = sparse.parseconfig(
834 ui, importfile.read())
868 835 oldsize = len(includes) + len(excludes) + len(profiles)
869 836 includes.update(iincludes - aincludes)
870 837 excludes.update(iexcludes - aexcludes)
@@ -897,7 +864,7 b' def _import(ui, repo, files, opts, force'
897 864 def _clear(ui, repo, files, force=False):
898 865 with repo.wlock():
899 866 raw = repo.vfs.tryread('sparse')
900 includes, excludes, profiles = repo.readsparseconfig(raw)
867 includes, excludes, profiles = sparse.parseconfig(ui, raw)
901 868
902 869 if includes or excludes:
903 870 oldstatus = repo.status()
General Comments 0
You need to be logged in to leave comments. Login now