def test_change_non_ascii(self): to_add = [ FileNode('żółwik/zwierzątko', content='ćććć'), FileNode(u'żółwik/zwierzątko_uni', content=u'ćććć'), ] for node in to_add: self.imc.add(node) tip = self.imc.commit(u'Initial', u'*****@*****.**') # Change node's content node = FileNode('żółwik/zwierzątko', content='My **changed** content') self.imc.change(node) self.imc.commit(u'Changed %s' % safe_unicode(node.path), u'*****@*****.**') node = FileNode(u'żółwik/zwierzątko_uni', content=u'My **changed** content') self.imc.change(node) self.imc.commit(u'Changed %s' % safe_unicode(node.path), u'*****@*****.**') newtip = self.repo.get_changeset() self.assertNotEqual(tip, newtip) self.assertNotEqual(tip.id, newtip.id) self.assertEqual( newtip.get_node('żółwik/zwierzątko').content, 'My **changed** content') self.assertEqual( newtip.get_node('żółwik/zwierzątko_uni').content, 'My **changed** content')
def test_change_non_ascii(self): to_add = [ FileNode('żółwik/zwierzątko', content='ćććć'), FileNode('żółwik/zwierzątko_uni', content='ćććć'), ] for node in to_add: self.imc.add(node) tip = self.imc.commit('Initial', '*****@*****.**') # Change node's content node = FileNode('żółwik/zwierzątko', content='My **changed** content') self.imc.change(node) self.imc.commit('Changed %s' % node.path, '*****@*****.**') node = FileNode('żółwik/zwierzątko_uni', content='My **changed** content') self.imc.change(node) self.imc.commit('Changed %s' % node.path, '*****@*****.**') newtip = self.repo.get_changeset() assert tip != newtip assert tip.raw_id != newtip.raw_id assert newtip.get_node( 'żółwik/zwierzątko').content == b'My **changed** content' assert newtip.get_node( 'żółwik/zwierzątko_uni').content == b'My **changed** content'
def test_change_raise_node_already_removed(self): node = FileNode('foobar', content='baz') self.imc.add(node) self.imc.commit(message='Added foobar', author=str(self)) self.imc.remove(FileNode('foobar')) with pytest.raises(NodeAlreadyRemovedError): self.imc.change(node)
def test_change_raise_node_already_changed(self): node = FileNode('foobar', content='baz') self.imc.add(node) self.imc.commit(message=u'Added foobar', author=unicode(self)) node = FileNode('foobar', content='more baz') self.imc.change(node) self.assertRaises(NodeAlreadyChangedError, self.imc.change, node)
def test_as_dict(self): changeset = BaseChangeset() changeset.id = 'ID' changeset.raw_id = 'RAW_ID' changeset.short_id = 'SHORT_ID' changeset.revision = 1009 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.changed = [] changeset.removed = [] self.assertEqual(changeset.as_dict(), { 'id': 'ID', 'raw_id': 'RAW_ID', 'short_id': 'SHORT_ID', 'revision': 1009, 'date': datetime.datetime(2011, 1, 30, 1, 45), 'message': 'Message of a commit', 'author': { 'name': 'Joe Doe', 'email': '*****@*****.**', }, 'added': ['foo/bar/baz', 'foobar'], 'changed': [], 'removed': [], })
def _get_commits(cls): commits = [ { 'message': 'Initial commit', 'author': 'Joe Doe <*****@*****.**>', 'date': datetime.datetime(2010, 1, 1, 20), 'added': [ FileNode('foobar', content='Foobar'), FileNode('foobar2', content='Foobar II'), FileNode('foo/bar/baz', content='baz here!'), ], }, { 'message': 'Changes...', 'author': 'Jane Doe <*****@*****.**>', 'date': datetime.datetime(2010, 1, 1, 21), 'added': [ FileNode('some/new.txt', content='news...'), ], 'changed': [ FileNode('foobar', 'Foobar I'), ], 'removed': [], }, ] return commits
class BackendBaseTestCase(unittest.TestCase): """ Base test class for tests which requires repository. """ backend_alias = 'hg' commits = [ { 'message': 'Initial commit', 'author': 'Joe Doe <*****@*****.**>', 'date': datetime.datetime(2010, 1, 1, 20), 'added': [ FileNode('foobar', content='Foobar'), FileNode('foobar2', content='Foobar II'), FileNode('foo/bar/baz', content='baz here!'), ], }, ] def get_backend(self): return vcs.get_backend(self.backend_alias) def get_commits(self): """ Returns list of commits which builds repository for each tests. """ if hasattr(self, 'commits'): return self.commits def get_new_repo_path(self): """ Returns newly created repository's directory. """ backend = self.get_backend() key = '%s-%s' % (backend.alias, str(time.time())) repo_path = get_new_dir(key) return repo_path def setUp(self): Backend = self.get_backend() self.backend_class = Backend self.repo_path = self.get_new_repo_path() self.repo = Backend(self.repo_path, create=True) self.imc = self.repo.in_memory_changeset for commit in self.get_commits(): for node in commit.get('added', []): self.imc.add(FileNode(node.path, content=node.content)) for node in commit.get('changed', []): self.imc.change(FileNode(node.path, content=node.content)) for node in commit.get('removed', []): self.imc.remove(FileNode(node.path)) self.imc.commit(message=unicode(commit['message']), author=unicode(commit['author']), date=commit['date']) self.tip = self.repo.get_changeset()
def test_check_integrity_change_raise_node_does_not_exist(self): node = FileNode('foobar', content='baz') self.imc.add(node) self.imc.commit(message='Added foobar', author=str(self)) node = FileNode('not-foobar', content='') self.imc.change(node) with pytest.raises(NodeDoesNotExistError): self.imc.commit(message='Changed not existing node', author=str(self))
def test_file_node_is_executable(self): node = FileNode('foobar', 'empty... almost', mode=0100755) self.assertTrue(node.is_executable) node = FileNode('foobar', 'empty... almost', mode=0100500) self.assertTrue(node.is_executable) node = FileNode('foobar', 'empty... almost', mode=0100644) self.assertFalse(node.is_executable)
def test_file_node_is_executable(self): node = FileNode('foobar', 'empty... almost', mode=0o100755) assert node.is_executable node = FileNode('foobar', 'empty... almost', mode=0o100500) assert node.is_executable node = FileNode('foobar', 'empty... almost', mode=0o100644) assert not node.is_executable
def _get_commits(cls): return [ { 'message': 'Initial', 'author': 'Joe Doe <*****@*****.**>', 'date': datetime.datetime(2010, 1, 1, 20), 'added': [ FileNode('bot/__init__.py', content='base'), FileNode('bot/templates/404.html', content='base'), FileNode('bot/templates/500.html', content='base'), ], }, { 'message': 'Second', 'author': 'Joe Doe <*****@*****.**>', 'date': datetime.datetime(2010, 1, 1, 22), 'added': [ FileNode('bot/build/migrations/1.py', content='foo2'), FileNode('bot/build/migrations/2.py', content='foo2'), FileNode('bot/build/static/templates/f.html', content='foo2'), FileNode('bot/build/static/templates/f1.html', content='foo2'), FileNode('bot/build/templates/err.html', content='foo2'), FileNode('bot/build/templates/err2.html', content='foo2'), ], }, ]
def test_dir_node_iter(self): nodes = [ DirNode('docs'), DirNode('tests'), FileNode('bar'), FileNode('foo'), FileNode('readme.txt'), FileNode('setup.py'), ] dirnode = DirNode('', nodes=nodes) for node in dirnode: node == dirnode.get_node(node.path)
def _get_commits(cls): return [ { 'message': u'Initial', 'author': u'Joe Doe <*****@*****.**>', 'date': datetime.datetime(2010, 1, 1, 20), 'added': [ FileNode('foo/bar', content='foo'), FileNode('foo/bał', content='foo'), FileNode('foobar', content='foo'), FileNode('qwe', content='foo'), ], }, { 'message': u'Massive changes', 'author': u'Joe Doe <*****@*****.**>', 'date': datetime.datetime(2010, 1, 1, 22), 'added': [FileNode('fallout', content='War never changes')], 'changed': [ FileNode('foo/bar', content='baz'), FileNode('foobar', content='baz'), ], 'removed': [FileNode('qwe')], }, ]
def test_change(self): self.imc.add(FileNode('foo/bar/baz', content='foo')) self.imc.add(FileNode('foo/fbar', content='foobar')) tip = self.imc.commit(u'Initial', u'*****@*****.**') # Change node's content node = FileNode('foo/bar/baz', content='My **changed** content') self.imc.change(node) self.imc.commit(u'Changed %s' % node.path, u'*****@*****.**') newtip = self.repo.get_changeset() self.assertNotEqual(tip, newtip) self.assertNotEqual(tip.id, newtip.id) self.assertEqual( newtip.get_node('foo/bar/baz').content, 'My **changed** content')
def test_change(self): self.imc.add(FileNode('foo/bar/baz', content='foo')) self.imc.add(FileNode('foo/fbar', content='foobar')) tip = self.imc.commit('Initial', '*****@*****.**') # Change node's content node = FileNode('foo/bar/baz', content='My **changed** content') self.imc.change(node) self.imc.commit('Changed %s' % node.path, '*****@*****.**') newtip = self.repo.get_changeset() assert tip != newtip assert tip.raw_id != newtip.raw_id assert newtip.get_node( 'foo/bar/baz').content == b'My **changed** content'
def test_remove_raise_node_already_removed(self): self.test_add() # Performs first commit node = FileNode(self.nodes[0].path) self.imc.remove(node) with pytest.raises(NodeAlreadyRemovedError): self.imc.remove(node)
def test_is_file(self): node = Node('any', NodeKind.FILE) self.assertTrue(node.is_file()) node = FileNode('any') self.assertTrue(node.is_file()) self.assertRaises(AttributeError, getattr, node, 'nodes')
def get_nodes(self, path): """ Returns combined ``DirNode`` and ``FileNode`` objects list representing state of changeset at the given ``path``. If node at the given ``path`` is not instance of ``DirNode``, ChangesetError would be raised. """ if self._get_kind(path) != NodeKind.DIR: raise ChangesetError("Directory does not exist for revision %s at " " '%s'" % (self.revision, path)) path = self._fix_path(path) filenodes = [FileNode(f, changeset=self) for f in self._file_paths if os.path.dirname(f) == path] dirs = path == '' and '' or [d for d in self._dir_paths if d and posixpath.dirname(d) == path] dirnodes = [DirNode(d, changeset=self) for d in dirs if os.path.dirname(d) == path] als = self.repository.alias for k, vals in self._extract_submodules().iteritems(): #vals = url,rev,type loc = vals[0] cs = vals[1] dirnodes.append(SubModuleNode(k, url=loc, changeset=cs, alias=als)) nodes = dirnodes + filenodes # cache nodes for node in nodes: self.nodes[node.path] = node nodes.sort() return nodes
def test_reset(self): self.imc.add(FileNode('foo', content='bar')) #self.imc.change(FileNode('baz', content='new')) #self.imc.remove(FileNode('qwe')) self.imc.reset() self.assertTrue(not any((self.imc.added, self.imc.changed, self.imc.removed)))
def commit_change(self, repo, repo_name, cs, user, author, message, content, f_path): """ Commits changes :param repo: SCM instance """ user = self._get_user(user) IMC = self._get_IMC_module(repo.alias) # decoding here will force that we have proper encoded values # in any other case this will throw exceptions and deny commit content = safe_str(content) path = safe_str(f_path) # message and author needs to be unicode # proper backend should then translate that into required type message = safe_unicode(message) author = safe_unicode(author) imc = IMC(repo) imc.change(FileNode(path, content, mode=cs.get_file_mode(f_path))) try: tip = imc.commit(message=message, author=author, parents=[cs], branch=cs.branch) except Exception, e: log.error(traceback.format_exc()) raise IMCCommitError(str(e))
def test_remove_raise_node_already_changed(self): self.test_add() # Performs first commit node = FileNode(self.nodes[0].path, content='Bending time') self.imc.change(node) with pytest.raises(NodeAlreadyChangedError): self.imc.remove(node)
def setUp(self): Backend = self.get_backend() self.repo_path = get_new_dir(str(time.time())) self.repo = Backend(self.repo_path, create=True) self.imc = self.repo.in_memory_changeset self.nodes = [ FileNode('foobar', content='Foo & bar'), FileNode('foobar2', content='Foo & bar, doubled!'), FileNode('foo bar with spaces', content=''), FileNode('foo/bar/baz', content='Inside'), FileNode( 'foo/bar/file.bin', content= '\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00;\x00\x03\x00\xfe\xff\t\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x18\x00\x00\x00\x01\x00\x00\x00\xfe\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff' ), ]
def test_check_integrity_raise_already_exist(self): node = FileNode('foobar', content='baz') self.imc.add(node) self.imc.commit(message='Added foobar', author=str(self)) self.imc.add(node) with pytest.raises(NodeAlreadyExistsError): self.imc.commit(message='new message', author=str(self))
def commit_change(self, repo, repo_name, cs, user, ip_addr, author, message, content, f_path): """ Commit a change to a single file :param repo: a db_repo.scm_instance """ user = User.guess_instance(user) IMC = self._get_IMC_module(repo.alias) imc = IMC(repo) imc.change(FileNode(f_path, content, mode=cs.get_file_mode(f_path))) try: tip = imc.commit(message=message, author=author, parents=[cs], branch=cs.branch) except Exception as e: log.error(traceback.format_exc()) # clear caches - we also want a fresh object if commit fails self.mark_for_invalidation(repo_name) raise IMCCommitError(str(e)) self._handle_push(repo, username=user.username, ip_addr=ip_addr, action='push_local', repo_name=repo_name, revisions=[tip.raw_id]) return tip
def setup_repo(cls, backend): cls.repo = cls.setup_empty_repo(backend) cls.imc = cls.repo.in_memory_changeset cls.default_branch = cls.repo.DEFAULT_BRANCH_NAME for commit in cls._get_commits(): for node in commit.get('added', []): cls.imc.add(FileNode(node.path, content=node.content)) for node in commit.get('changed', []): cls.imc.change(FileNode(node.path, content=node.content)) for node in commit.get('removed', []): cls.imc.remove(FileNode(node.path)) cls.tip = cls.imc.commit(message=commit['message'], author=commit['author'], date=commit['date'])
def diff_2way(self, repo_name, f_path): diff1 = request.GET.get('diff1', '') diff2 = request.GET.get('diff2', '') try: if diff1 not in ['', None, 'None', '0' * 12, '0' * 40]: c.changeset_1 = c.db_repo_scm_instance.get_changeset(diff1) try: node1 = c.changeset_1.get_node(f_path) if node1.is_dir(): raise NodeError('%s path is a %s not a file' % (node1, type(node1))) except NodeDoesNotExistError: c.changeset_1 = EmptyChangeset( cs=diff1, revision=c.changeset_1.revision, repo=c.db_repo_scm_instance) node1 = FileNode(f_path, '', changeset=c.changeset_1) else: c.changeset_1 = EmptyChangeset(repo=c.db_repo_scm_instance) node1 = FileNode(f_path, '', changeset=c.changeset_1) if diff2 not in ['', None, 'None', '0' * 12, '0' * 40]: c.changeset_2 = c.db_repo_scm_instance.get_changeset(diff2) try: node2 = c.changeset_2.get_node(f_path) if node2.is_dir(): raise NodeError('%s path is a %s not a file' % (node2, type(node2))) except NodeDoesNotExistError: c.changeset_2 = EmptyChangeset( cs=diff2, revision=c.changeset_2.revision, repo=c.db_repo_scm_instance) node2 = FileNode(f_path, '', changeset=c.changeset_2) else: c.changeset_2 = EmptyChangeset(repo=c.db_repo_scm_instance) node2 = FileNode(f_path, '', changeset=c.changeset_2) except ChangesetDoesNotExistError as e: msg = _('Such revision does not exist for this repository') h.flash(msg, category='error') raise HTTPNotFound() c.node1 = node1 c.node2 = node2 c.cs1 = c.changeset_1 c.cs2 = c.changeset_2 return render('files/diff_2way.html')
def test_get_branch_after_adding_one(self): self.imc.add(FileNode('docs/index.txt', content='Documentation\n')) self.imc.commit( message='New branch: foobar', author='joe', branch='foobar', ) assert self.repo.workdir.get_branch() == self.default_branch
def _get_commits(cls): # Note: this is slightly different than the regular _get_commits methods # as we don't actually return any commits. The creation of commits is # handled in the tests themselves. cls.nodes = [ FileNode('foobar', content='Foo & bar'), FileNode('foobar2', content='Foo & bar, doubled!'), FileNode('foo bar with spaces', content=''), FileNode('foo/bar/baz', content='Inside'), FileNode( 'foo/bar/file.bin', content= '\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00;\x00\x03\x00\xfe\xff\t\x00\x06\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x18\x00\x00\x00\x01\x00\x00\x00\xfe\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff' ), ] commits = [] return commits
def test_node_state(self): """ Without link to changeset nodes should raise NodeError. """ node = FileNode('anything') self.assertRaises(NodeError, getattr, node, 'state') node = DirNode('anything') self.assertRaises(NodeError, getattr, node, 'state')
def test_is_file(self): node = Node('any', NodeKind.FILE) assert node.is_file() node = FileNode('any') assert node.is_file() with pytest.raises(AttributeError): getattr(node, 'nodes')
def test_mimetype(self): py_node = FileNode('test.py') tar_node = FileNode('test.tar.gz') my_node2 = FileNode('myfile2') my_node2._content = 'foobar' my_node3 = FileNode('myfile3') my_node3._content = '\0foobar' self.assertEqual(py_node.mimetype, mimetypes.guess_type(py_node.name)[0]) self.assertEqual(py_node.get_mimetype(), mimetypes.guess_type(py_node.name)) self.assertEqual(tar_node.mimetype, mimetypes.guess_type(tar_node.name)[0]) self.assertEqual(tar_node.get_mimetype(), mimetypes.guess_type(tar_node.name)) self.assertEqual(my_node2.mimetype, 'text/plain') self.assertEqual(my_node2.get_mimetype(), ('text/plain', None)) self.assertEqual(my_node3.mimetype, 'application/octet-stream') self.assertEqual(my_node3.get_mimetype(), ('application/octet-stream', None))
def test_mimetype(self): py_node = FileNode('test.py') tar_node = FileNode('test.tar.gz') ext = 'CustomExtension' my_node2 = FileNode('myfile2') my_node2._mimetype = [ext] my_node3 = FileNode('myfile3') my_node3._mimetype = [ext,ext] self.assertEqual(py_node.mimetype,'text/x-python') self.assertEqual(py_node.get_mimetype(),('text/x-python',None)) self.assertEqual(tar_node.mimetype,'application/x-tar') self.assertEqual(tar_node.get_mimetype(),('application/x-tar','gzip')) self.assertRaises(NodeError,my_node2.get_mimetype) self.assertEqual(my_node3.mimetype,ext) self.assertEqual(my_node3.get_mimetype(),[ext,ext])