Beispiel #1
0
 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)
Beispiel #3
0
 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': [],
     })
Beispiel #4
0
 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))
Beispiel #7
0
 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'),
             ],
         },
     ]
Beispiel #8
0
 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)
Beispiel #9
0
    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())
Beispiel #10
0
 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)))
Beispiel #14
0
    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')
Beispiel #15
0
 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
Beispiel #16
0
    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]
Beispiel #17
0
 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)
Beispiel #18
0
 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))
Beispiel #26
0
    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()
Beispiel #28
0
 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),
             ],
         }
Beispiel #29
0
    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)
Beispiel #30
0
 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)
Beispiel #31
0
    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())
Beispiel #32
0
    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])