manifest_xml: allow src=. with symlinks

Some Android/Nest manifests are using <linkfile> with src="." to
create stable paths to specific projects.  Allow that specific
use case as it seems reasonable to support.

Bug: https://crbug.com/gerrit/11218
Change-Id: I5eadec257cd58ba0f8687c590ddc250a7a414a85
Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/254276
Reviewed-by: Michael Mortensen <mmortensen@google.com>
Reviewed-by: Mike Frysinger <vapier@google.com>
Tested-by: Mike Frysinger <vapier@google.com>
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 @@
     # 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 @@
     # 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."""