diff --git a/manifest_xml.py b/manifest_xml.py index 035cc61..b92b267 100644 --- a/manifest_xml.py +++ b/manifest_xml.py @@ -985,11 +985,13 @@ class XmlManifest(object): # Assume paths might be used on case-insensitive filesystems. path = path.lower() - # We don't really need to reject '.' here, but there shouldn't really be a - # need to ever use it, so no need to accept it either. - for part in set(path.split(os.path.sep)): - if part in {'.', '..', '.git'} or part.startswith('.repo'): - return 'bad component: %s' % (part,) + # Some people use src="." to create stable links to projects. Lets allow + # that but reject all other uses of "." to keep things simple. + parts = path.split(os.path.sep) + if parts != ['.']: + for part in set(parts): + if part in {'.', '..', '.git'} or part.startswith('.repo'): + return 'bad component: %s' % (part,) if not symlink and path.endswith(os.path.sep): return 'dirs not allowed' diff --git a/tests/test_manifest_xml.py b/tests/test_manifest_xml.py index ecc84ad..b6ec5b8 100644 --- a/tests/test_manifest_xml.py +++ b/tests/test_manifest_xml.py @@ -49,6 +49,8 @@ class ManifestValidateFilePaths(unittest.TestCase): # We allow symlinks to end in a slash since we allow them to point to dirs # in general. Technically the slash isn't necessary. check('foo/', 'bar') + # We allow a single '.' to get a reference to the project itself. + check('.', 'bar') def test_bad_paths(self): """Make sure bad paths (src & dest) are rejected."""