def _get_commits(cls): return [ { 'message': 'Initial', 'author': 'Joe Doe <*****@*****.**>', 'date': datetime.datetime(2010, 1, 1, 20), 'added': [ FileNode('foobar/static/js/admin/base.js', content='base'), FileNode('foobar/static/admin', content='admin', mode=0120000), # this is a link FileNode('foo', content='foo'), ], }, { 'message': 'Second', 'author': 'Joe Doe <*****@*****.**>', 'date': datetime.datetime(2010, 1, 1, 22), 'added': [ FileNode('foo2', content='foo2'), ], }, ]
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': u'Initial commit', 'author': u'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': u'Changes...', 'author': u'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=u'Added foobar', author=unicode(self)) node = FileNode('not-foobar', content='') self.imc.change(node) self.assertRaises(NodeDoesNotExistError, self.imc.commit, message='Changed not existing node', author=str(self))
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 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 commit(self, commits): if isinstance(commits, dict): commits = [commits] for commit in commits: commit = commit.copy() stage = self.repo.in_memory_changeset for name, content in commit.pop('added', {}).items(): stage.add(FileNode(name, content)) for name, content in commit.pop('changed', {}).items(): stage.change(FileNode(name, content)) commit.setdefault('author', "Tim Tester") commit.setdefault('message', "dummy message\n\nwith multiple lines") stage.commit(**commit)
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 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_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 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_commits(cls): commits = [ { 'message': u'Initial commit', 'author': u'Joe Doe <*****@*****.**>', 'date': datetime.datetime(2010, 1, 1, 20), 'added': [FileNode('file1', content='Foobar')], }, { 'message': u'Added a file', 'author': u'Joe Doe <*****@*****.**>', 'date': datetime.datetime(2010, 1, 1, 20), 'added': [FileNode('file2', content='Foobar')], }, ] return commits
def get_node(self, path): if isinstance(path, unicode): path = path.encode('utf-8') path = self._fix_path(path) if not path in self.nodes: try: id_ = self._get_id_for_path(path) except ChangesetError: raise NodeDoesNotExistError("Cannot find one of parents' " "directories for a given path: %s" % path) _GL = lambda m: m and objects.S_ISGITLINK(m) if _GL(self._stat_modes.get(path)): node = SubModuleNode(path, url=None, changeset=id_, alias=self.repository.alias) else: obj = self.repository._repo.get_object(id_) if isinstance(obj, objects.Tree): if path == '': node = RootNode(changeset=self) else: node = DirNode(path, changeset=self) node._tree = obj elif isinstance(obj, objects.Blob): node = FileNode(path, changeset=self) node._blob = obj else: raise NodeDoesNotExistError("There is no file nor directory " "at the given path '%s' at revision %s" % (path, self.short_id)) # cache node self.nodes[path] = node return self.nodes[path]
def test_get_branch_after_adding_one(self): self.imc.add(FileNode('docs/index.txt', content='Documentation\n')) self.imc.commit( message=u'New branch: foobar', author=u'joe', branch='foobar', ) self.assertEqual(self.repo.workdir.get_branch(), self.default_branch)
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 _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('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_add_actually_adds_all_nodes_at_second_commit_too(self): self.imc.add(FileNode('foo/bar/image.png', content='\0')) self.imc.add(FileNode('foo/README.txt', content='readme!')) changeset = self.imc.commit(u'Initial', u'*****@*****.**') self.assertTrue(isinstance(changeset.get_node('foo'), DirNode)) self.assertTrue(isinstance(changeset.get_node('foo/bar'), DirNode)) self.assertEqual(changeset.get_node('foo/bar/image.png').content, '\0') self.assertEqual( changeset.get_node('foo/README.txt').content, 'readme!') # commit some more files again to_add = [ FileNode('foo/bar/foobaz/bar', content='foo'), FileNode('foo/bar/another/bar', content='foo'), FileNode('foo/baz.txt', content='foo'), FileNode('foobar/foobaz/file', content='foo'), FileNode('foobar/barbaz', content='foo'), ] self.imc.add(*to_add) changeset = self.imc.commit(u'Another', u'*****@*****.**') self.assertEqual( changeset.get_node('foo/bar/foobaz/bar').content, 'foo') self.assertEqual( changeset.get_node('foo/bar/another/bar').content, 'foo') self.assertEqual(changeset.get_node('foo/baz.txt').content, 'foo') self.assertEqual( changeset.get_node('foobar/foobaz/file').content, 'foo') self.assertEqual(changeset.get_node('foobar/barbaz').content, 'foo')
def test_check_integrity_raise_already_exist(self): node = FileNode('foobar', content='baz') self.imc.add(node) self.imc.commit(message=u'Added foobar', author=unicode(self)) self.imc.add(node) self.assertRaises(NodeAlreadyExistsError, self.imc.commit, message='new message', author=str(self))
def test_remove_last_file_from_directory(self): node = FileNode('omg/qwe/foo/bar', content='foobar') self.imc.add(node) self.imc.commit(u'added', u'joe doe') self.imc.remove(node) tip = self.imc.commit(u'removed', u'joe doe') self.assertRaises(NodeDoesNotExistError, tip.get_node, 'omg/qwe/foo/bar')
def test_check_integrity_remove_raise_node_does_not_exist(self): self.test_add() # Performs first commit node = FileNode('no-such-file') self.imc.remove(node) self.assertRaises(NodeDoesNotExistError, self.imc.commit, message=u'Trying to remove not existing node', author=unicode(self))
def test_date_attr(self): node = FileNode('foobar.txt', content='Foobared!') self.imc.add(node) date = datetime.datetime(1985, 1, 30, 1, 45) commit = self.imc.commit(u"Committed at time when I was born ;-)", author=u'lb', date=date) self.assertEqual(commit.date, date)
def test_check_integrity_change_raise_node_not_changed(self): self.test_add() # Performs first commit node = FileNode(self.nodes[0].path, content=self.nodes[0].content) self.imc.change(node) self.assertRaises( NodeNotChangedError, self.imc.commit, message=u'Trying to mark node as changed without touching it', author=unicode(self))
def setUpClass(cls): Backend = cls.get_backend() cls.backend_class = Backend cls.repo_path = get_new_dir(str(time.time())) cls.repo = Backend(cls.repo_path, create=True) 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=unicode(commit['message']), author=unicode(commit['author']), date=commit['date'])
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 _get_commits(cls): start_date = datetime.datetime(2010, 1, 1, 20) for x in xrange(5): yield { 'message': 'Commit %d' % x, 'author': 'Joe Doe <*****@*****.**>', 'date': start_date + datetime.timedelta(hours=12 * x), 'added': [ FileNode('file_%d.txt' % x, content='Foobar %d' % x), ], }
def handle_changeset(self, changeset, **options): template = self.get_template(**options) output = template.safe_substitute(**changeset.as_dict()) self.stdout.write(output) self.stdout.write('\n') if options.get('show_patches'): def show_diff(old_node, new_node): diff = get_gitdiff(old_node, new_node) self.stdout.write(u''.join(diff)) for node in changeset.added: show_diff(FileNode('null', content=''), node) for node in changeset.changed: old_node = node.history[0].get_node(node.path) show_diff(old_node, node) for node in changeset.removed: old_node = changeset.parents[0].get_node(node.path) new_node = FileNode(node.path, content='') show_diff(old_node, new_node)
def test_file_node_stat(self): node = FileNode('foobar', 'empty... almost') mode = node.mode # default should be 0100644 self.assertTrue(mode & stat.S_IRUSR) self.assertTrue(mode & stat.S_IWUSR) self.assertTrue(mode & stat.S_IRGRP) self.assertTrue(mode & stat.S_IROTH) self.assertFalse(mode & stat.S_IWGRP) self.assertFalse(mode & stat.S_IWOTH) self.assertFalse(mode & stat.S_IXUSR) self.assertFalse(mode & stat.S_IXGRP) self.assertFalse(mode & stat.S_IXOTH)
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])