Browse Source

project: 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: I16dbe8d9fe42ea45440afcb61404c753bff1930d
Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/254330
Reviewed-by: Chanho Park <parkch98@gmail.com>
Reviewed-by: Mike Frysinger <vapier@google.com>
Tested-by: Mike Frysinger <vapier@google.com>
Mike Frysinger 6 năm trước cách đây
mục cha
commit
be784238fa
2 tập tin đã thay đổi với 29 bổ sung1 xóa
  1. 6 1
      project.py
  2. 23 0
      tests/test_project.py

+ 6 - 1
project.py

@@ -382,7 +382,12 @@ class _LinkFile(object):
     Handles wild cards on the src linking all of the files in the source in to
     the destination directory.
     """
-    src = _SafeExpandPath(self.git_worktree, self.src)
+    # Some people use src="." to create stable links to projects.  Lets allow
+    # that but reject all other uses of "." to keep things simple.
+    if self.src == '.':
+      src = self.git_worktree
+    else:
+      src = _SafeExpandPath(self.git_worktree, self.src)
 
     if os.path.exists(src):
       # Entity exists so just a simple one to one link operation.

+ 23 - 0
tests/test_project.py

@@ -314,6 +314,14 @@ class LinkFile(CopyLinkTestCase):
     lf._Link()
     self.assertExists(os.path.join(self.topdir, 'foo'))
 
+  def test_src_self(self):
+    """Link to the project itself."""
+    dest = os.path.join(self.topdir, 'foo', 'bar')
+    lf = self.LinkFile('.', 'foo/bar')
+    lf._Link()
+    self.assertExists(dest)
+    self.assertEqual('../git-project', os.readlink(dest))
+
   def test_dest_subdir(self):
     """Link a file to a subdir of a checkout."""
     src = os.path.join(self.worktree, 'foo.txt')
@@ -323,6 +331,21 @@ class LinkFile(CopyLinkTestCase):
     lf._Link()
     self.assertExists(os.path.join(self.topdir, 'sub', 'dir', 'foo', 'bar'))
 
+  def test_src_block_relative(self):
+    """Do not allow relative symlinks."""
+    BAD_SOURCES = (
+        './',
+        '..',
+        '../',
+        'foo/.',
+        'foo/./bar',
+        'foo/..',
+        'foo/../foo',
+    )
+    for src in BAD_SOURCES:
+      lf = self.LinkFile(src, 'foo')
+      self.assertRaises(error.ManifestInvalidPathError, lf._Link)
+
   def test_update(self):
     """Make sure changed targets get updated."""
     dest = os.path.join(self.topdir, 'sym')