# HG changeset patch # User Gregory Szorc # Date 2017-07-15 20:21:23 # Node ID 1d1779734c9900ed4f15abf4bd8c903ff0d9820b # Parent 32f348d741e5b8766646512558a02c49c36307e2 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 diff --git a/hgext/sparse.py b/hgext/sparse.py --- a/hgext/sparse.py +++ b/hgext/sparse.py @@ -35,8 +35,7 @@ to the repository root. The special lines ``[include]`` and ``[exclude]`` denote the section for includes and excludes that follow, respectively. It is illegal to -have ``[include]`` after ``[exclude]``. If no sections are defined, -entries are assumed to be in the ``[include]`` section. +have ``[include]`` after ``[exclude]``. Non-special lines resemble file patterns to be added to either includes or excludes. The syntax of these lines is documented by :hg:`help patterns`. diff --git a/mercurial/sparse.py b/mercurial/sparse.py --- a/mercurial/sparse.py +++ b/mercurial/sparse.py @@ -33,8 +33,10 @@ def parseconfig(ui, raw): """ includes = set() excludes = set() - current = includes profiles = set() + current = None + havesection = False + for line in raw.split('\n'): line = line.strip() if not line or line.startswith('#'): @@ -45,14 +47,23 @@ def parseconfig(ui, raw): if line: profiles.add(line) elif line == '[include]': - if current != includes: + if havesection and current != includes: # TODO pass filename into this API so we can report it. raise error.Abort(_('sparse config cannot have includes ' + 'after excludes')) + havesection = True + current = includes continue elif line == '[exclude]': + havesection = True current = excludes elif line: + if current is None: + raise error.Abort(_('sparse config entry outside of ' + 'section: %s') % line, + hint=_('add an [include] or [exclude] line ' + 'to declare the entry type')) + if line.strip().startswith('/'): ui.warn(_('warning: sparse profile cannot use' + ' paths starting with /, ignoring %s\n') % line) diff --git a/tests/test-sparse-profiles.t b/tests/test-sparse-profiles.t --- a/tests/test-sparse-profiles.t +++ b/tests/test-sparse-profiles.t @@ -10,6 +10,18 @@ test sparse > rebase= > EOF +Config file without [section] is rejected + + $ cat > bad.sparse < *.html + > EOF + + $ hg debugsparse --import-rules bad.sparse + abort: sparse config entry outside of section: *.html + (add an [include] or [exclude] line to declare the entry type) + [255] + $ rm bad.sparse + $ echo a > index.html $ echo x > data.py $ echo z > readme.txt @@ -257,6 +269,7 @@ Test file permissions changing across a > EOF $ touch a b $ cat > .hgsparse < [include] > a > EOF $ hg commit -Aqm 'initial'