diff -r 32f348d741e5 -r 1d1779734c99 mercurial/sparse.py --- a/mercurial/sparse.py Sat Jul 15 13:07:57 2017 -0700 +++ b/mercurial/sparse.py Sat Jul 15 13:21:23 2017 -0700 @@ -33,8 +33,10 @@ """ 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 @@ 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)