Ejemplo n.º 1
0
    def _get_repo_id(self, project):
        # The ID or URL-encoded path of the project
        # https://docs.gitlab.com/ce/api/README.html#namespaced-path-encoding
        try:
            repo_id = json.loads(project.remote_repository.json).get('id')
        except Project.remote_repository.RelatedObjectDoesNotExist:
            # Handle "Manual Import" when there is no RemoteRepository
            # associated with the project. It only works with gitlab.com at the
            # moment (doesn't support custom gitlab installations)
            username, repo = get_gitlab_username_repo(project.repo)
            if (username, repo) == (None, None):
                return None

            repo_id = '{username}%2F{repo}'.format(
                username=username,
                repo=repo,
            )
        return repo_id
Ejemplo n.º 2
0
    def _get_repo_id(self, project):
        """
        Get the ID or URL-encoded path of the project.

        See https://docs.gitlab.com/ce/api/README.html#namespaced-path-encoding.
        """
        if project.remote_repository:
            repo_id = project.remote_repository.remote_id
        else:
            # Handle "Manual Import" when there is no RemoteRepository
            # associated with the project. It only works with gitlab.com at the
            # moment (doesn't support custom gitlab installations)
            username, repo = build_utils.get_gitlab_username_repo(project.repo)
            if (username, repo) == (None, None):
                return None

            repo_id = quote_plus(f'{username}/{repo}')
        return repo_id
Ejemplo n.º 3
0
    def _get_repo_id(self, project):
        # The ID or URL-encoded path of the project
        # https://docs.gitlab.com/ce/api/README.html#namespaced-path-encoding
        try:
            repo_id = json.loads(project.remote_repository.json).get('id')
        except Exception:
            # Handle "Manual Import" when there is no RemoteRepository
            # associated with the project. It only works with gitlab.com at the
            # moment (doesn't support custom gitlab installations)
            username, repo = build_utils.get_gitlab_username_repo(project.repo)
            if (username, repo) == (None, None):
                return None

            repo_id = '{username}%2F{repo}'.format(
                username=username,
                repo=repo,
            )
        return repo_id
Ejemplo n.º 4
0
    def vcs_url(self):
        """
        Generate VCS (github, gitlab, bitbucket) URL for this version.

        Example: https://github.com/rtfd/readthedocs.org/tree/3.4.2/.
        External Version Example: https://github.com/rtfd/readthedocs.org/pull/99/.
        """
        if self.type == EXTERNAL:
            if 'github' in self.project.repo:
                user, repo = get_github_username_repo(self.project.repo)
                return GITHUB_PULL_REQUEST_URL.format(
                    user=user,
                    repo=repo,
                    number=self.verbose_name,
                )
            if 'gitlab' in self.project.repo:
                user, repo = get_gitlab_username_repo(self.project.repo)
                return GITLAB_MERGE_REQUEST_URL.format(
                    user=user,
                    repo=repo,
                    number=self.verbose_name,
                )
            # TODO: Add VCS URL for BitBucket.
            return ''

        url = ''
        if self.slug == STABLE:
            slug_url = self.ref
        elif self.slug == LATEST:
            slug_url = self.project.default_branch or self.project.vcs_repo(
            ).fallback_branch
        else:
            slug_url = self.slug

        if ('github' in self.project.repo) or ('gitlab' in self.project.repo):
            url = f'/tree/{slug_url}/'

        if 'bitbucket' in self.project.repo:
            slug_url = self.identifier
            url = f'/src/{slug_url}'

        # TODO: improve this replacing
        return self.project.repo.replace('git://', 'https://').replace(
            '.git', '') + url
Ejemplo n.º 5
0
    def get_gitlab_url(
        self,
        docroot,
        filename,
        source_suffix='.rst',
        action='view',
    ):
        repo_url = self.project.repo
        if 'gitlab' not in repo_url:
            return ''

        if not docroot:
            return ''

        # Normalize /docroot/
        docroot = '/' + docroot.strip('/') + '/'

        if action == 'view':
            action_string = 'blob'
        elif action == 'edit':
            action_string = 'edit'

        user, repo = get_gitlab_username_repo(repo_url)
        if not user and not repo:
            return ''
        repo = repo.rstrip('/')

        if not filename:
            # If there isn't a filename, we don't need a suffix
            source_suffix = ''

        return GITLAB_URL.format(
            user=user,
            repo=repo,
            version=self.commit_name,
            docroot=docroot,
            path=filename,
            source_suffix=source_suffix,
            action=action_string,
        )
Ejemplo n.º 6
0
    def get_config_params(self):
        """Get configuration parameters to be rendered into the conf file."""
        # TODO this should be handled better in the theme
        conf_py_path = os.path.join(
            os.path.sep,
            os.path.dirname(
                os.path.relpath(
                    self.config_file,
                    self.project.checkout_path(self.version.slug),
                ), ),
            '',
        )
        remote_version = self.version.commit_name

        github_user, github_repo = version_utils.get_github_username_repo(
            url=self.project.repo, )
        github_version_is_editable = (self.version.type == 'branch')
        display_github = github_user is not None

        bitbucket_user, bitbucket_repo = version_utils.get_bitbucket_username_repo(  # noqa
            url=self.project.repo, )
        bitbucket_version_is_editable = (self.version.type == 'branch')
        display_bitbucket = bitbucket_user is not None

        gitlab_user, gitlab_repo = version_utils.get_gitlab_username_repo(
            url=self.project.repo, )
        gitlab_version_is_editable = (self.version.type == 'branch')
        display_gitlab = gitlab_user is not None

        versions = []
        downloads = []
        subproject_urls = []
        # Avoid hitting database and API if using Docker build environment
        if settings.DONT_HIT_API:
            if self.project.has_feature(Feature.ALL_VERSIONS_IN_HTML_CONTEXT):
                versions = self.project.active_versions()
            else:
                versions = self.project.active_versions().filter(
                    privacy_level=PUBLIC, )
            downloads = self.version.get_downloads(pretty=True)
            subproject_urls = self.project.get_subproject_urls()
        else:
            try:
                versions = self.project.api_versions()
                if not self.project.has_feature(
                        Feature.ALL_VERSIONS_IN_HTML_CONTEXT):
                    versions = [
                        v for v in versions if v.privacy_level == PUBLIC
                    ]
                downloads = api.version(self.version.pk).get()['downloads']
                subproject_urls = self.project.get_subproject_urls()
            except ConnectionError:
                log.exception(
                    'Timeout while fetching versions/downloads/subproject_urls for Sphinx context. '
                    'project: %s version: %s',
                    self.project.slug,
                    self.version.slug,
                )

        data = {
            'html_theme':
            'sphinx_rtd_theme',
            'html_theme_import':
            'sphinx_rtd_theme',
            'current_version':
            self.version.verbose_name,
            'project':
            self.project,
            'version':
            self.version,
            'settings':
            settings,
            'conf_py_path':
            conf_py_path,
            'api_host':
            settings.PUBLIC_API_URL,
            'commit':
            self.project.vcs_repo(self.version.slug).commit,
            'versions':
            versions,
            'downloads':
            downloads,
            'subproject_urls':
            subproject_urls,

            # GitHub
            'github_user':
            github_user,
            'github_repo':
            github_repo,
            'github_version':
            remote_version,
            'github_version_is_editable':
            github_version_is_editable,
            'display_github':
            display_github,

            # BitBucket
            'bitbucket_user':
            bitbucket_user,
            'bitbucket_repo':
            bitbucket_repo,
            'bitbucket_version':
            remote_version,
            'bitbucket_version_is_editable':
            bitbucket_version_is_editable,
            'display_bitbucket':
            display_bitbucket,

            # GitLab
            'gitlab_user':
            gitlab_user,
            'gitlab_repo':
            gitlab_repo,
            'gitlab_version':
            remote_version,
            'gitlab_version_is_editable':
            gitlab_version_is_editable,
            'display_gitlab':
            display_gitlab,

            # Features
            'dont_overwrite_sphinx_context':
            self.project.has_feature(Feature.DONT_OVERWRITE_SPHINX_CONTEXT, ),
        }

        finalize_sphinx_context_data.send(
            sender=self.__class__,
            build_env=self.build_env,
            data=data,
        )

        return data
Ejemplo n.º 7
0
    def get_config_params(self):
        """Get configuration parameters to be rendered into the conf file."""
        # TODO this should be handled better in the theme
        conf_py_path = os.path.join(
            os.path.sep,
            os.path.dirname(
                os.path.relpath(
                    self.config_file,
                    self.project.checkout_path(self.version.slug),
                ), ),
            '',
        )
        remote_version = self.version.commit_name

        github_user, github_repo = version_utils.get_github_username_repo(
            url=self.project.repo, )
        github_version_is_editable = (self.version.type == 'branch')
        display_github = github_user is not None

        bitbucket_user, bitbucket_repo = version_utils.get_bitbucket_username_repo(  # noqa
            url=self.project.repo, )
        bitbucket_version_is_editable = (self.version.type == 'branch')
        display_bitbucket = bitbucket_user is not None

        gitlab_user, gitlab_repo = version_utils.get_gitlab_username_repo(
            url=self.project.repo, )
        gitlab_version_is_editable = (self.version.type == 'branch')
        display_gitlab = gitlab_user is not None

        # Avoid hitting database and API if using Docker build environment
        if getattr(settings, 'DONT_HIT_API', False):
            versions = self.project.active_versions()
            downloads = self.version.get_downloads(pretty=True)
        else:
            versions = self.project.api_versions()
            downloads = api.version(self.version.pk).get()['downloads']

        data = {
            'html_theme':
            'sphinx_rtd_theme',
            'html_theme_import':
            'sphinx_rtd_theme',
            'current_version':
            self.version.verbose_name,
            'project':
            self.project,
            'version':
            self.version,
            'settings':
            settings,
            'conf_py_path':
            conf_py_path,
            'api_host':
            getattr(
                settings,
                'PUBLIC_API_URL',
                'https://readthedocs.org',
            ),
            'commit':
            self.project.vcs_repo(self.version.slug).commit,
            'versions':
            versions,
            'downloads':
            downloads,

            # GitHub
            'github_user':
            github_user,
            'github_repo':
            github_repo,
            'github_version':
            remote_version,
            'github_version_is_editable':
            github_version_is_editable,
            'display_github':
            display_github,

            # BitBucket
            'bitbucket_user':
            bitbucket_user,
            'bitbucket_repo':
            bitbucket_repo,
            'bitbucket_version':
            remote_version,
            'bitbucket_version_is_editable':
            bitbucket_version_is_editable,
            'display_bitbucket':
            display_bitbucket,

            # GitLab
            'gitlab_user':
            gitlab_user,
            'gitlab_repo':
            gitlab_repo,
            'gitlab_version':
            remote_version,
            'gitlab_version_is_editable':
            gitlab_version_is_editable,
            'display_gitlab':
            display_gitlab,

            # Features
            'dont_overwrite_sphinx_context':
            self.project.has_feature(Feature.DONT_OVERWRITE_SPHINX_CONTEXT, ),
        }

        finalize_sphinx_context_data.send(
            sender=self.__class__,
            build_env=self.build_env,
            data=data,
        )

        return data
Ejemplo n.º 8
0
    def get_config_params(self):
        """Get configuration parameters to be rendered into the conf file."""
        # TODO this should be handled better in the theme
        conf_py_path = os.path.join(
            os.path.sep,
            self.version.get_conf_py_path(),
            '',
        )
        remote_version = self.version.commit_name

        github_user, github_repo = version_utils.get_github_username_repo(
            url=self.project.repo)
        github_version_is_editable = (self.version.type == 'branch')
        display_github = github_user is not None

        bitbucket_user, bitbucket_repo = version_utils.get_bitbucket_username_repo(  # noqa
            url=self.project.repo)
        bitbucket_version_is_editable = (self.version.type == 'branch')
        display_bitbucket = bitbucket_user is not None

        gitlab_user, gitlab_repo = version_utils.get_gitlab_username_repo(
            url=self.project.repo)
        gitlab_version_is_editable = (self.version.type == 'branch')
        display_gitlab = gitlab_user is not None

        # Avoid hitting database and API if using Docker build environment
        if getattr(settings, 'DONT_HIT_API', False):
            versions = self.project.active_versions()
            downloads = self.version.get_downloads(pretty=True)
        else:
            versions = self.project.api_versions()
            downloads = api.version(self.version.pk).get()['downloads']

        data = {
            'current_version': self.version.verbose_name,
            'project': self.project,
            'version': self.version,
            'settings': settings,
            'static_path': SPHINX_STATIC_DIR,
            'template_path': SPHINX_TEMPLATE_DIR,
            'conf_py_path': conf_py_path,
            'api_host': getattr(
                settings,
                'PUBLIC_API_URL',
                'https://readthedocs.org',
            ),
            'commit': self.project.vcs_repo(self.version.slug).commit,
            'versions': versions,
            'downloads': downloads,

            # GitHub
            'github_user': github_user,
            'github_repo': github_repo,
            'github_version': remote_version,
            'github_version_is_editable': github_version_is_editable,
            'display_github': display_github,

            # BitBucket
            'bitbucket_user': bitbucket_user,
            'bitbucket_repo': bitbucket_repo,
            'bitbucket_version': remote_version,
            'bitbucket_version_is_editable': bitbucket_version_is_editable,
            'display_bitbucket': display_bitbucket,

            # GitLab
            'gitlab_user': gitlab_user,
            'gitlab_repo': gitlab_repo,
            'gitlab_version': remote_version,
            'gitlab_version_is_editable': gitlab_version_is_editable,
            'display_gitlab': display_gitlab,
        }

        finalize_sphinx_context_data.send(
            sender=self.__class__,
            build_env=self.build_env,
            data=data,
        )

        return data
Ejemplo n.º 9
0
    def get_commit_url(self):
        """Return the commit URL."""
        repo_url = self.project.repo
        if self.is_external:
            if 'github' in repo_url:
                user, repo = get_github_username_repo(repo_url)
                if not user and not repo:
                    return ''

                repo = repo.rstrip('/')
                return GITHUB_PULL_REQUEST_COMMIT_URL.format(
                    user=user,
                    repo=repo,
                    number=self.version.verbose_name,
                    commit=self.commit
                )
            if 'gitlab' in repo_url:
                user, repo = get_gitlab_username_repo(repo_url)
                if not user and not repo:
                    return ''

                repo = repo.rstrip('/')
                return GITLAB_MERGE_REQUEST_COMMIT_URL.format(
                    user=user,
                    repo=repo,
                    number=self.version.verbose_name,
                    commit=self.commit
                )
            # TODO: Add External Version Commit URL for BitBucket.
        else:
            if 'github' in repo_url:
                user, repo = get_github_username_repo(repo_url)
                if not user and not repo:
                    return ''

                repo = repo.rstrip('/')
                return GITHUB_COMMIT_URL.format(
                    user=user,
                    repo=repo,
                    commit=self.commit
                )
            if 'gitlab' in repo_url:
                user, repo = get_gitlab_username_repo(repo_url)
                if not user and not repo:
                    return ''

                repo = repo.rstrip('/')
                return GITLAB_COMMIT_URL.format(
                    user=user,
                    repo=repo,
                    commit=self.commit
                )
            if 'bitbucket' in repo_url:
                user, repo = get_bitbucket_username_repo(repo_url)
                if not user and not repo:
                    return ''

                repo = repo.rstrip('/')
                return BITBUCKET_COMMIT_URL.format(
                    user=user,
                    repo=repo,
                    commit=self.commit
                )

        return None
Ejemplo n.º 10
0
    def get_config_params(self):
        """Get configuration parameters to be rendered into the conf file."""
        # TODO this should be handled better in the theme
        conf_py_path = os.path.join(
            os.path.sep,
            os.path.dirname(
                os.path.relpath(
                    self.config_file,
                    self.project.checkout_path(self.version.slug),
                ),
            ),
            '',
        )
        remote_version = self.version.commit_name

        github_user, github_repo = version_utils.get_github_username_repo(
            url=self.project.repo,
        )
        github_version_is_editable = (self.version.type == 'branch')
        display_github = github_user is not None

        bitbucket_user, bitbucket_repo = version_utils.get_bitbucket_username_repo(  # noqa
            url=self.project.repo,
        )
        bitbucket_version_is_editable = (self.version.type == 'branch')
        display_bitbucket = bitbucket_user is not None

        gitlab_user, gitlab_repo = version_utils.get_gitlab_username_repo(
            url=self.project.repo,
        )
        gitlab_version_is_editable = (self.version.type == 'branch')
        display_gitlab = gitlab_user is not None

        # Avoid hitting database and API if using Docker build environment
        if settings.DONT_HIT_API:
            versions = self.project.active_versions()
            downloads = self.version.get_downloads(pretty=True)
        else:
            versions = self.project.api_versions()
            downloads = api.version(self.version.pk).get()['downloads']

        data = {
            'html_theme': 'sphinx_rtd_theme',
            'html_theme_import': 'sphinx_rtd_theme',
            'current_version': self.version.verbose_name,
            'project': self.project,
            'version': self.version,
            'settings': settings,
            'conf_py_path': conf_py_path,
            'api_host': settings.PUBLIC_API_URL,
            'commit': self.project.vcs_repo(self.version.slug).commit,
            'versions': versions,
            'downloads': downloads,

            # GitHub
            'github_user': github_user,
            'github_repo': github_repo,
            'github_version': remote_version,
            'github_version_is_editable': github_version_is_editable,
            'display_github': display_github,

            # BitBucket
            'bitbucket_user': bitbucket_user,
            'bitbucket_repo': bitbucket_repo,
            'bitbucket_version': remote_version,
            'bitbucket_version_is_editable': bitbucket_version_is_editable,
            'display_bitbucket': display_bitbucket,

            # GitLab
            'gitlab_user': gitlab_user,
            'gitlab_repo': gitlab_repo,
            'gitlab_version': remote_version,
            'gitlab_version_is_editable': gitlab_version_is_editable,
            'display_gitlab': display_gitlab,

            # Features
            'dont_overwrite_sphinx_context': self.project.has_feature(
                Feature.DONT_OVERWRITE_SPHINX_CONTEXT,
            ),
            'use_pdf_latexmk': self.project.has_feature(
                Feature.USE_PDF_LATEXMK,
            ),
        }

        finalize_sphinx_context_data.send(
            sender=self.__class__,
            build_env=self.build_env,
            data=data,
        )

        return data
Ejemplo n.º 11
0
    def get_config_params(self):
        """Get configuration parameters to be rendered into the conf file."""
        # TODO this should be handled better in the theme
        conf_py_path = os.path.join(
            os.path.sep,
            self.version.get_conf_py_path(),
            '',
        )
        remote_version = self.version.commit_name

        github_user, github_repo = version_utils.get_github_username_repo(
            url=self.project.repo)
        github_version_is_editable = (self.version.type == 'branch')
        display_github = github_user is not None

        bitbucket_user, bitbucket_repo = version_utils.get_bitbucket_username_repo(  # noqa
            url=self.project.repo)
        bitbucket_version_is_editable = (self.version.type == 'branch')
        display_bitbucket = bitbucket_user is not None

        gitlab_user, gitlab_repo = version_utils.get_gitlab_username_repo(
            url=self.project.repo)
        gitlab_version_is_editable = (self.version.type == 'branch')
        display_gitlab = gitlab_user is not None

        # Avoid hitting database and API if using Docker build environment
        if getattr(settings, 'DONT_HIT_API', False):
            versions = self.project.active_versions()
            downloads = self.version.get_downloads(pretty=True)
        else:
            versions = self.project.api_versions()
            downloads = api.version(self.version.pk).get()['downloads']

        data = {
            'current_version':
            self.version.verbose_name,
            'project':
            self.project,
            'version':
            self.version,
            'settings':
            settings,
            'static_path':
            SPHINX_STATIC_DIR,
            'template_path':
            SPHINX_TEMPLATE_DIR,
            'conf_py_path':
            conf_py_path,
            'api_host':
            getattr(
                settings,
                'PUBLIC_API_URL',
                'https://readthedocs.org',
            ),
            'commit':
            self.project.vcs_repo(self.version.slug).commit,
            'versions':
            versions,
            'downloads':
            downloads,

            # GitHub
            'github_user':
            github_user,
            'github_repo':
            github_repo,
            'github_version':
            remote_version,
            'github_version_is_editable':
            github_version_is_editable,
            'display_github':
            display_github,

            # BitBucket
            'bitbucket_user':
            bitbucket_user,
            'bitbucket_repo':
            bitbucket_repo,
            'bitbucket_version':
            remote_version,
            'bitbucket_version_is_editable':
            bitbucket_version_is_editable,
            'display_bitbucket':
            display_bitbucket,

            # GitLab
            'gitlab_user':
            gitlab_user,
            'gitlab_repo':
            gitlab_repo,
            'gitlab_version':
            remote_version,
            'gitlab_version_is_editable':
            gitlab_version_is_editable,
            'display_gitlab':
            display_gitlab,

            # Features
            'generate_json_artifacts':
            self.project.has_feature(Feature.BUILD_JSON_ARTIFACTS_WITH_HTML),
        }

        finalize_sphinx_context_data.send(
            sender=self.__class__,
            build_env=self.build_env,
            data=data,
        )

        return data