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
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
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
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
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, )
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
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
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
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
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
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