Пример #1
0
    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')
Пример #2
0
    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'
Пример #3
0
 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)
Пример #4
0
 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)
Пример #5
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': [],
     })
Пример #6
0
 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
Пример #7
0
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()
Пример #8
0
 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))
Пример #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)
Пример #10
0
    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
Пример #11
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'),
             ],
         },
     ]
Пример #12
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)
Пример #13
0
 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')],
         },
     ]
Пример #14
0
    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')
Пример #15
0
    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'
Пример #16
0
    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)
Пример #17
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')
Пример #18
0
    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
Пример #19
0
 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)))
Пример #20
0
    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))
Пример #21
0
    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)
Пример #22
0
 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'
         ),
     ]
Пример #23
0
 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))
Пример #24
0
    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
Пример #25
0
    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'])
Пример #26
0
    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')
Пример #27
0
 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
Пример #28
0
 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
Пример #29
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')
Пример #30
0
    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')
Пример #31
0
    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))
Пример #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])