changeset 7167:b4a5632733d9 stable

vcs: Fix internal server error when trying to get diff from Mercurial for paths that include globbing patterns (Issue #308): - Treat passed-in paths as exact matches, dissallowing any type of globbing/regex/pattern matching. - Added accompanying tests.
author Branko Majic <branko@majic.rs>
date Tue, 13 Feb 2018 16:23:55 +0100
parents 55d2b08d9c44
children 8f3469917832 3b36ca511518
files kallithea/lib/vcs/backends/hg/repository.py kallithea/tests/vcs/test_repository.py
diffstat 2 files changed, 37 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/kallithea/lib/vcs/backends/hg/repository.py	Fri Feb 09 18:12:19 2018 +0100
+++ b/kallithea/lib/vcs/backends/hg/repository.py	Tue Feb 13 16:23:55 2018 +0100
@@ -265,7 +265,7 @@
             self.get_changeset(rev1)
         self.get_changeset(rev2)
         if path:
-            file_filter = match(self.path, '', [path])
+            file_filter = match(self.path, '', [path], exact=True)
         else:
             file_filter = None
 
--- a/kallithea/tests/vcs/test_repository.py	Fri Feb 09 18:12:19 2018 +0100
+++ b/kallithea/tests/vcs/test_repository.py	Tue Feb 13 16:23:55 2018 +0100
@@ -79,6 +79,14 @@
                 ],
                 'removed': [FileNode('foobar')],
             },
+            {
+                'message': u'Commit that contains glob pattern in filename',
+                'author': 'Jane Doe <jane.doe@example.com>',
+                'date': datetime.datetime(2010, 1, 1, 22),
+                'added': [
+                    FileNode('README{', content='Strangely-named README file'),
+                ],
+            },
         ]
         return commits
 
@@ -86,6 +94,11 @@
         with self.assertRaises(ChangesetDoesNotExistError):
             self.repo.get_diff('a' * 40, 'b' * 40)
 
+    def test_glob_patterns_in_filename_do_not_raise_exception(self):
+        revs = self.repo.revisions
+
+        diff = self.repo.get_diff(revs[2], revs[3], path='README{') # should not raise
+
 
 class GitRepositoryGetDiffTest(RepositoryGetDiffTest, unittest.TestCase):
     backend_alias = 'git'
@@ -153,6 +166,18 @@
 +FOOBAR
 ''')
 
+    def test_fourth_changeset_diff(self):
+        revs = self.repo.revisions
+        self.assertEqual(self.repo.get_diff(revs[2], revs[3]), '''diff --git a/README{ b/README{
+new file mode 100644
+index 0000000000000000000000000000000000000000..cdc0c1b5d234feedb37bbac19cd1b6442061102d
+--- /dev/null
++++ b/README{
+@@ -0,0 +1 @@
++Strangely-named README file
+\ No newline at end of file
+''')
+
 
 class HgRepositoryGetDiffTest(RepositoryGetDiffTest, unittest.TestCase):
     backend_alias = 'hg'
@@ -214,6 +239,17 @@
 +FOOBAR
 ''')
 
+    def test_fourth_changeset_diff(self):
+        revs = self.repo.revisions
+        self.assertEqual(self.repo.get_diff(revs[2], revs[3]), '''diff --git a/README{ b/README{
+new file mode 100644
+--- /dev/null
++++ b/README{
+@@ -0,0 +1,1 @@
++Strangely-named README file
+\ No newline at end of file
+''')
+
 
 # For each backend create test case class
 for alias in SCM_TESTS: