예제 #1
0
    async def validate_path(self, path: str, **kwargs) -> BitbucketPath:
        commit_sha = kwargs.get('commitSha')
        branch_name = kwargs.get('branch')

        # revision query param could be commit sha OR branch
        # take a guess which one it will be.
        revision = kwargs.get('revision', None)
        if revision is not None:
            try:
                int(revision, 16)  # is revision valid hex?
            except (TypeError, ValueError):
                branch_name = revision
            else:
                commit_sha = revision

        if not commit_sha and not branch_name:
            branch_name = await self._fetch_default_branch()

        if path == '/':
            return BitbucketPath(path, _ids=[(commit_sha, branch_name)])

        path_obj = BitbucketPath(path)
        for part in path_obj.parts:
            part._id = (commit_sha, branch_name)

        return path_obj
예제 #2
0
    async def validate_v1_path(self, path: str, **kwargs) -> BitbucketPath:
        commit_sha = kwargs.get('commitSha')
        branch_name = kwargs.get('branch')

        # revision query param could be commit sha OR branch
        # take a guess which one it will be.
        revision = kwargs.get('revision', None)
        if revision is not None:
            try:
                int(revision, 16)  # is revision valid hex?
            except (TypeError, ValueError):
                branch_name = revision
            else:
                commit_sha = revision

        if not commit_sha and not branch_name:
            branch_name = await self._fetch_default_branch()

        if path == '/':
            return BitbucketPath(path, _ids=[(commit_sha, branch_name)])

        path_obj = BitbucketPath(path)
        for part in path_obj.parts:
            part._id = (commit_sha, branch_name)

        # Cache parent directory listing (a WB API V1 feature)
        # Note: Property ``_parent_dir`` has been re-structured for Bitbucket API 2.0.  Please refer
        #       to ``_fetch_path_metadata()`` and ``_fetch_dir_listing()`` for detailed information.
        self._parent_dir = {
            'metadata': await self._fetch_path_metadata(path_obj.parent),
            'contents': await self._fetch_dir_listing(path_obj.parent)
        }

        # Tweak dir_commit_sha and dir_path for Bitbucket API 2.0
        parent_dir_commit_sha = self._parent_dir['metadata']['commit']['hash'][:12]
        parent_dir_path = '{}/'.format(self._parent_dir['metadata']['path'])

        # Check file or folder existence
        path_obj_type = 'commit_directory' if path_obj.is_dir else 'commit_file'
        if path_obj.name not in [
                self.bitbucket_path_to_name(x['path'], parent_dir_path)
                for x in self._parent_dir['contents'] if x['type'] == path_obj_type
        ]:
            raise exceptions.NotFoundError(str(path))

        # _fetch_dir_listing() will tell us the commit sha used to look up the listing
        # if not set in path_obj or if the lookup sha is shorter than the returned sha, update it
        if not commit_sha or (len(commit_sha) < len(parent_dir_commit_sha)):
            path_obj.set_commit_sha(parent_dir_commit_sha)

        return path_obj
예제 #3
0
    def test_build_file_metadata(self, file_metadata, owner, repo):

        name = 'file0002.20bytes.txt'
        subdir = 'folder2-lvl1/folder1-lvl2/folder1-lvl3'
        full_path = '/{}/{}'.format(subdir, name)
        # Note: When building Bitbucket Path, the length of ``_ids`` array must be equal to the
        #       number of path segments, including the root.
        path = BitbucketPath(full_path,
                             _ids=[(COMMIT_SHA, BRANCH)
                                   for _ in full_path.split('/')])

        try:
            metadata = BitbucketFileMetadata(file_metadata,
                                             path,
                                             owner=owner,
                                             repo=repo)
        except Exception as exc:
            pytest.fail(str(exc))
            return

        assert metadata.name == name
        assert metadata.path == full_path
        assert metadata.kind == 'file'
        assert metadata.modified == '2019-04-26T15:13:12+00:00'
        assert metadata.modified_utc == '2019-04-26T15:13:12+00:00'
        assert metadata.created_utc == '2019-04-25T06:18:21+00:00'
        assert metadata.content_type is None
        assert metadata.size == 20
        assert metadata.size_as_int == 20
        assert metadata.etag == '{}::{}'.format(full_path, COMMIT_SHA)
        assert metadata.provider == 'bitbucket'
        assert metadata.last_commit_sha == 'dd8c7b642e32'
        assert metadata.commit_sha == COMMIT_SHA
        assert metadata.branch_name == BRANCH

        web_view = ('https://bitbucket.org/{}/{}/src/{}{}?'
                    'fileviewer=file-view-default'.format(
                        owner, repo, COMMIT_SHA, full_path))
        assert metadata.web_view == web_view

        assert metadata.extra == {
            'commitSha': COMMIT_SHA,
            'branch': BRANCH,
            'webView': web_view,
            'lastCommitSha': 'dd8c7b642e32',
        }

        resource = 'mst3k'
        assert metadata._json_api_links(resource) == {
            'delete':
            None,
            'upload':
            None,
            'move':
            'http://localhost:7777/v1/resources/{}/providers/bitbucket{}?'
            'commitSha={}'.format(resource, full_path, COMMIT_SHA),
            'download':
            'http://localhost:7777/v1/resources/{}/providers/bitbucket{}?'
            'commitSha={}'.format(resource, full_path, COMMIT_SHA),
        }
예제 #4
0
 def test_id_accessors(self):
     bb_path = BitbucketPath('/foo',
                             _ids=[(COMMIT_SHA, BRANCH),
                                   (COMMIT_SHA, BRANCH)])
     assert bb_path.commit_sha == COMMIT_SHA
     assert bb_path.branch_name == BRANCH
     assert bb_path.ref == COMMIT_SHA
예제 #5
0
 def test_child_inherits_id(self):
     bb_parent = BitbucketPath('/foo/',
                               _ids=[(COMMIT_SHA, BRANCH),
                                     (COMMIT_SHA, BRANCH)])
     bb_child = bb_parent.child('foo')
     assert bb_child.commit_sha == COMMIT_SHA
     assert bb_child.branch_name == BRANCH
     assert bb_child.ref == COMMIT_SHA
예제 #6
0
    def test_build_file_metadata(self, file_metadata, owner, repo):
        name = 'aaa-01-2.txt'
        subdir = 'plaster'
        full_path = '/{}/{}'.format(subdir, name)
        branch = 'master'

        path = BitbucketPath(full_path,
                             _ids=[(COMMIT_SHA, branch), (COMMIT_SHA, branch),
                                   (COMMIT_SHA, branch)])

        try:
            metadata = BitbucketFileMetadata(file_metadata,
                                             path,
                                             owner=owner,
                                             repo=repo)
        except Exception as exc:
            pytest.fail(str(exc))

        assert metadata.name == name
        assert metadata.path == full_path
        assert metadata.kind == 'file'
        assert metadata.modified == '2016-10-14T00:37:55Z'
        assert metadata.modified_utc == '2016-10-14T00:37:55+00:00'
        assert metadata.created_utc is None
        assert metadata.content_type is None
        assert metadata.size == 13
        assert metadata.size_as_int == 13
        assert metadata.etag == '{}::{}'.format(full_path, COMMIT_SHA)
        assert metadata.provider == 'bitbucket'
        assert metadata.last_commit_sha == '90c8f7eef948'
        assert metadata.commit_sha == COMMIT_SHA
        assert metadata.branch_name == branch

        web_view = ('https://bitbucket.org/{}/{}/src/{}{}?'
                    'fileviewer=file-view-default'.format(
                        owner, repo, COMMIT_SHA, full_path))
        assert metadata.web_view == web_view

        assert metadata.extra == {
            'commitSha': COMMIT_SHA,
            'branch': 'master',
            'webView': web_view,
            'lastCommitSha': '90c8f7eef948',
        }

        resource = 'mst3k'
        assert metadata._json_api_links(resource) == {
            'delete':
            None,
            'upload':
            None,
            'move':
            'http://localhost:7777/v1/resources/{}/providers/bitbucket{}?commitSha={}'
            .format(resource, full_path, COMMIT_SHA),
            'download':
            'http://localhost:7777/v1/resources/{}/providers/bitbucket{}?commitSha={}'
            .format(resource, full_path, COMMIT_SHA),
        }
예제 #7
0
    async def validate_v1_path(self, path: str, **kwargs) -> BitbucketPath:
        commit_sha = kwargs.get('commitSha')
        branch_name = kwargs.get('branch')

        # revision query param could be commit sha OR branch
        # take a guess which one it will be.
        revision = kwargs.get('revision', None)
        if revision is not None:
            try:
                int(revision, 16)  # is revision valid hex?
            except (TypeError, ValueError):
                branch_name = revision
            else:
                commit_sha = revision

        if not commit_sha and not branch_name:
            branch_name = await self._fetch_default_branch()

        if path == '/':
            return BitbucketPath(path, _ids=[(commit_sha, branch_name)])

        path_obj = BitbucketPath(path)
        for part in path_obj.parts:
            part._id = (commit_sha, branch_name)

        self._parent_dir = await self._fetch_dir_listing(path_obj.parent)

        if path_obj.is_dir:
            if path_obj.name not in self._parent_dir['directories']:
                raise exceptions.NotFoundError(str(path))
        else:
            if path_obj.name not in [
                    self.bitbucket_path_to_name(x['path'],
                                                self._parent_dir['path'])
                    for x in self._parent_dir['files']
            ]:
                raise exceptions.NotFoundError(str(path))

        # _fetch_dir_listing will tell us the commit sha used to look up the listing
        # if not set in path_obj or if the lookup sha is shorter than the returned sha, update it
        if not commit_sha or (len(commit_sha) < len(self._parent_dir['node'])):
            path_obj.set_commit_sha(self._parent_dir['node'])

        return path_obj
예제 #8
0
    def test_child_given_explicit_branch(self):
        """This one is weird.  An explicit child id should override the id from the parent,
        but I don't know if this is sensible behavior."""

        bb_parent = BitbucketPath('/foo/',
                                  _ids=[(COMMIT_SHA, BRANCH),
                                        (COMMIT_SHA, BRANCH)])
        bb_child = bb_parent.child('foo', _id=('413006763', 'master'))

        assert bb_child.commit_sha == '413006763'
        assert bb_child.branch_name == 'master'
        assert bb_child.ref == '413006763'

        assert bb_parent.commit_sha == COMMIT_SHA
        assert bb_parent.branch_name == BRANCH
        assert bb_parent.ref == COMMIT_SHA
예제 #9
0
    def test_build_folder_metadata(self, folder_metadata, owner, repo):
        name = 'folder1-lvl3'
        subdir = 'folder2-lvl1/folder1-lvl2'
        full_path = '/{}/{}'.format(subdir, name)
        path = BitbucketPath(full_path,
                             _ids=[(None, BRANCH)
                                   for _ in full_path.split('/')])

        try:
            metadata = BitbucketFolderMetadata(folder_metadata,
                                               path,
                                               owner=owner,
                                               repo=repo)
        except Exception as exc:
            pytest.fail(str(exc))
            return

        assert metadata.name == name
        assert metadata.path == '{}/'.format(full_path)
        assert metadata.kind == 'folder'
        assert metadata.children is None
        assert metadata.extra == {
            'commitSha': None,
            'branch': BRANCH,
        }
        assert metadata.provider == 'bitbucket'

        assert metadata.commit_sha is None
        assert metadata.branch_name == BRANCH

        assert metadata._json_api_links('mst3k') == {
            'delete':
            None,
            'upload':
            None,
            'move':
            'http://localhost:7777/v1/resources/mst3k/providers/bitbucket{}/?'
            'branch={}'.format(full_path, BRANCH),
            'new_folder':
            None,
        }
예제 #10
0
    def test_update_commit_sha(self):
        bb_child = BitbucketPath('/foo/bar',
                                 _ids=[(None, BRANCH), (None, BRANCH),
                                       (None, BRANCH)])
        assert bb_child.commit_sha == None
        assert bb_child.branch_name == BRANCH
        assert bb_child.ref == BRANCH

        bb_child.set_commit_sha(COMMIT_SHA)
        assert bb_child.commit_sha == COMMIT_SHA
        assert bb_child.branch_name == BRANCH
        assert bb_child.ref == COMMIT_SHA

        bb_parent = bb_child.parent
        assert bb_parent.commit_sha == COMMIT_SHA
        assert bb_parent.branch_name == BRANCH
        assert bb_parent.ref == COMMIT_SHA

        bb_grandparent = bb_parent.parent
        assert bb_grandparent.commit_sha == COMMIT_SHA
        assert bb_grandparent.branch_name == BRANCH
        assert bb_grandparent.ref == COMMIT_SHA
예제 #11
0
    def test_build_folder_metadata(self, folder_metadata, owner, repo):
        branch = 'master'
        name = 'plaster'

        path = BitbucketPath('/{}/'.format(name),
                             _ids=[(None, branch), (None, branch)])

        try:
            metadata = BitbucketFolderMetadata(folder_metadata,
                                               path,
                                               owner=owner,
                                               repo=repo)
        except Exception as exc:
            pytest.fail(str(exc))

        assert metadata.name == name
        assert metadata.path == '/{}/'.format(name)
        assert metadata.kind == 'folder'
        assert metadata.children is None
        assert metadata.extra == {
            'commitSha': None,
            'branch': branch,
        }
        assert metadata.provider == 'bitbucket'

        assert metadata.commit_sha is None
        assert metadata.branch_name == branch

        assert metadata._json_api_links('mst3k') == {
            'delete':
            None,
            'upload':
            None,
            'move':
            'http://localhost:7777/v1/resources/mst3k/providers/bitbucket/{}/?branch={}'
            .format(name, branch),
            'new_folder':
            None,
        }
예제 #12
0
 def test_id_accessors_no_branch(self):
     bb_path = BitbucketPath('/foo',
                             _ids=[(COMMIT_SHA, None), (COMMIT_SHA, None)])
     assert bb_path.commit_sha == COMMIT_SHA
     assert bb_path.branch_name == None
     assert bb_path.ref == COMMIT_SHA
예제 #13
0
 def test_id_accessors_no_sha(self):
     bb_path = BitbucketPath('/foo', _ids=[(None, BRANCH), (None, BRANCH)])
     assert bb_path.commit_sha == None
     assert bb_path.branch_name == BRANCH
     assert bb_path.ref == BRANCH