# HG changeset patch # User domruf # Date 2017-10-17 17:27:10 # Node ID 3725f86e8514b4576f5123b9071d961d054ef1da # Parent 64ee7afabaaadfe4a656177aa4c2784bf572cb2a api: wrap changeset file paths with safe_unicode Fixes error in get_changesets if path contains non ascii character. diff --git a/kallithea/lib/vcs/backends/base.py b/kallithea/lib/vcs/backends/base.py --- a/kallithea/lib/vcs/backends/base.py +++ b/kallithea/lib/vcs/backends/base.py @@ -393,9 +393,9 @@ class BaseChangeset(object): message=self.message, date=self.date, author=self.author, - added=[el.path for el in self.added], - changed=[el.path for el in self.changed], - removed=[el.path for el in self.removed], + added=[safe_unicode(el.path) for el in self.added], + changed=[safe_unicode(el.path) for el in self.changed], + removed=[safe_unicode(el.path) for el in self.removed], ) else: return dict( @@ -667,9 +667,9 @@ class BaseChangeset(object): data = get_dict_for_attrs(self, ['id', 'raw_id', 'short_id', 'revision', 'date', 'message']) data['author'] = {'name': self.author_name, 'email': self.author_email} - data['added'] = [node.path for node in self.added] - data['changed'] = [node.path for node in self.changed] - data['removed'] = [node.path for node in self.removed] + data['added'] = [safe_unicode(node.path) for node in self.added] + data['changed'] = [safe_unicode(node.path) for node in self.changed] + data['removed'] = [safe_unicode(node.path) for node in self.removed] return data @LazyProperty diff --git a/kallithea/tests/vcs/test_changesets.py b/kallithea/tests/vcs/test_changesets.py --- a/kallithea/tests/vcs/test_changesets.py +++ b/kallithea/tests/vcs/test_changesets.py @@ -30,7 +30,7 @@ class TestBaseChangeset(unittest.TestCas changeset.date = datetime.datetime(2011, 1, 30, 1, 45) changeset.message = 'Message of a commit' changeset.author = 'Joe Doe ' - changeset.added = [FileNode('foo/bar/baz'), FileNode('foobar')] + changeset.added = [FileNode('foo/bar/baz'), FileNode(u'foobar'), FileNode(u'blåbærgrød')] changeset.changed = [] changeset.removed = [] self.assertEqual(changeset.as_dict(), { @@ -44,7 +44,7 @@ class TestBaseChangeset(unittest.TestCas 'name': 'Joe Doe', 'email': 'joe.doe@example.com', }, - 'added': ['foo/bar/baz', 'foobar'], + 'added': ['foo/bar/baz', 'foobar', u'bl\xe5b\xe6rgr\xf8d'], 'changed': [], 'removed': [], }) @@ -341,6 +341,8 @@ class _ChangesetsChangesTestCaseMixin(_B ]) self.assertItemsEqual(changeset.changed, []) self.assertItemsEqual(changeset.removed, []) + assert u'foo/ba\u0142' in changeset.as_dict()['added'] + assert u'foo/ba\u0142' in changeset.__json__(with_file_list=True)['added'] def test_head_added(self): changeset = self.repo.get_changeset() @@ -373,17 +375,17 @@ for alias in SCM_TESTS: 'backend_alias': alias, } # tests with additional commits - cls_name = ''.join(('%s changesets with commits test' % alias).title().split()) + cls_name = alias.title() + 'ChangesetsWithCommitsTest' bases = (_ChangesetsWithCommitsTestCaseixin, unittest.TestCase) globals()[cls_name] = type(cls_name, bases, attrs) # tests without additional commits - cls_name = ''.join(('%s changesets test' % alias).title().split()) + cls_name = alias.title() + 'ChangesetsTest' bases = (_ChangesetsTestCaseMixin, unittest.TestCase) globals()[cls_name] = type(cls_name, bases, attrs) # tests changes - cls_name = ''.join(('%s changesets changes test' % alias).title().split()) + cls_name = alias.title() + 'ChangesetsChangesTest' bases = (_ChangesetsChangesTestCaseMixin, unittest.TestCase) globals()[cls_name] = type(cls_name, bases, attrs)