Mercurial > public > mercurial-scm > hg
comparison mercurial/sparse.py @ 33551:1d1779734c99
sparse: require [section] in sparse config files (BC)
Previously, [include] was implicit and pattern lines before a
[section] were added to includes.
Because the format may change in the future and explicit behavior,
well, more explicit, this commit changes the config parser to
reject pattern lines that don't occur in a [section].
Differential Revision: https://phab.mercurial-scm.org/D96
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Sat, 15 Jul 2017 13:21:23 -0700 |
parents | 32f348d741e5 |
children | 6755b719048c |
comparison
equal
deleted
inserted
replaced
33550:32f348d741e5 | 33551:1d1779734c99 |
---|---|
31 | 31 |
32 Returns a tuple of includes, excludes, and profiles. | 32 Returns a tuple of includes, excludes, and profiles. |
33 """ | 33 """ |
34 includes = set() | 34 includes = set() |
35 excludes = set() | 35 excludes = set() |
36 current = includes | |
37 profiles = set() | 36 profiles = set() |
37 current = None | |
38 havesection = False | |
39 | |
38 for line in raw.split('\n'): | 40 for line in raw.split('\n'): |
39 line = line.strip() | 41 line = line.strip() |
40 if not line or line.startswith('#'): | 42 if not line or line.startswith('#'): |
41 # empty or comment line, skip | 43 # empty or comment line, skip |
42 continue | 44 continue |
43 elif line.startswith('%include '): | 45 elif line.startswith('%include '): |
44 line = line[9:].strip() | 46 line = line[9:].strip() |
45 if line: | 47 if line: |
46 profiles.add(line) | 48 profiles.add(line) |
47 elif line == '[include]': | 49 elif line == '[include]': |
48 if current != includes: | 50 if havesection and current != includes: |
49 # TODO pass filename into this API so we can report it. | 51 # TODO pass filename into this API so we can report it. |
50 raise error.Abort(_('sparse config cannot have includes ' + | 52 raise error.Abort(_('sparse config cannot have includes ' + |
51 'after excludes')) | 53 'after excludes')) |
54 havesection = True | |
55 current = includes | |
52 continue | 56 continue |
53 elif line == '[exclude]': | 57 elif line == '[exclude]': |
58 havesection = True | |
54 current = excludes | 59 current = excludes |
55 elif line: | 60 elif line: |
61 if current is None: | |
62 raise error.Abort(_('sparse config entry outside of ' | |
63 'section: %s') % line, | |
64 hint=_('add an [include] or [exclude] line ' | |
65 'to declare the entry type')) | |
66 | |
56 if line.strip().startswith('/'): | 67 if line.strip().startswith('/'): |
57 ui.warn(_('warning: sparse profile cannot use' + | 68 ui.warn(_('warning: sparse profile cannot use' + |
58 ' paths starting with /, ignoring %s\n') % line) | 69 ' paths starting with /, ignoring %s\n') % line) |
59 continue | 70 continue |
60 current.add(line) | 71 current.add(line) |