--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/mercurial/sparse.py Thu Jul 06 12:14:03 2017 -0700
@@ -0,0 +1,48 @@
+# sparse.py - functionality for sparse checkouts
+#
+# Copyright 2014 Facebook, Inc.
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+from __future__ import absolute_import
+
+from .i18n import _
+from . import (
+ error,
+)
+
+def parseconfig(ui, raw):
+ """Parse sparse config file content.
+
+ Returns a tuple of includes, excludes, and profiles.
+ """
+ includes = set()
+ excludes = set()
+ current = includes
+ profiles = []
+ for line in raw.split('\n'):
+ line = line.strip()
+ if not line or line.startswith('#'):
+ # empty or comment line, skip
+ continue
+ elif line.startswith('%include '):
+ line = line[9:].strip()
+ if line:
+ profiles.append(line)
+ elif line == '[include]':
+ if current != includes:
+ # TODO pass filename into this API so we can report it.
+ raise error.Abort(_('sparse config cannot have includes ' +
+ 'after excludes'))
+ continue
+ elif line == '[exclude]':
+ current = excludes
+ elif line:
+ if line.strip().startswith('/'):
+ ui.warn(_('warning: sparse profile cannot use' +
+ ' paths starting with /, ignoring %s\n') % line)
+ continue
+ current.add(line)
+
+ return includes, excludes, profiles