# HG changeset patch # User Branko Majic # Date 1518535435 -3600 # Node ID b4a5632733d9ca349f7869201ea4df5fe395a314 # Parent 55d2b08d9c44c4103cae9f1727199bc6f9f7fc3d 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. diff -r 55d2b08d9c44 -r b4a5632733d9 kallithea/lib/vcs/backends/hg/repository.py --- 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 diff -r 55d2b08d9c44 -r b4a5632733d9 kallithea/tests/vcs/test_repository.py --- 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 ', + '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: