Pārlūkot izejas kodu

Raise error when adding paths that are not under repo.

Jelmer Vernooij 7 gadi atpakaļ
vecāks
revīzija
3be30ce59f
3 mainītis faili ar 22 papildinājumiem un 7 dzēšanām
  1. 3 0
      NEWS
  2. 2 0
      dulwich/porcelain.py
  3. 17 7
      dulwich/tests/test_porcelain.py

+ 3 - 0
NEWS

@@ -5,6 +5,9 @@
   * Fix handling of empty repositories in ``porcelain.clone``.
    (#570, Jelmer Vernooij)
 
+  * Raise an error when attempting to add paths that are not under the
+    repository. (Jelmer Vernooij)
+
 0.18.5	2017-10-29
 
  BUG FIXES

+ 2 - 0
dulwich/porcelain.py

@@ -361,6 +361,8 @@ def add(repo=".", paths=None):
             paths = [paths]
         for p in paths:
             relpath = os.path.relpath(p, r.path)
+            if relpath.startswith('../'):
+                raise ValueError('path %r is not in repo' % relpath)
             # FIXME: Support patterns, directories.
             if ignore_manager.is_ignored(relpath):
                 ignored.add(relpath)

+ 17 - 7
dulwich/tests/test_porcelain.py

@@ -54,13 +54,10 @@ class PorcelainTestCase(TestCase):
 
     def setUp(self):
         super(PorcelainTestCase, self).setUp()
-        repo_dir = tempfile.mkdtemp()
-        self.addCleanup(shutil.rmtree, repo_dir)
-        self.repo = Repo.init(repo_dir)
-
-    def tearDown(self):
-        super(PorcelainTestCase, self).tearDown()
-        self.repo.close()
+        self.test_dir = tempfile.mkdtemp()
+        self.addCleanup(shutil.rmtree, self.test_dir)
+        self.repo = Repo.init(os.path.join(self.test_dir, 'repo'), mkdir=True)
+        self.addCleanup(self.repo.close)
 
 
 class ArchiveTests(PorcelainTestCase):
@@ -300,6 +297,19 @@ class AddTests(PorcelainTestCase):
         porcelain.add(self.repo, paths=[os.path.join(self.repo.path, "foo")])
         self.assertIn(b"foo", self.repo.open_index())
 
+    def test_add_not_in_repo(self):
+        with open(os.path.join(self.test_dir, 'foo'), 'w') as f:
+            f.write("BAR")
+        self.assertRaises(
+            ValueError,
+            porcelain.add, self.repo,
+            paths=[os.path.join(self.test_dir, "foo")])
+        self.assertRaises(
+            ValueError,
+            porcelain.add, self.repo,
+            paths=["../foo"])
+        self.assertEqual([], list(self.repo.open_index()))
+
 
 class RemoveTests(PorcelainTestCase):