summaryrefslogtreecommitdiff
path: root/gitlab/v4/objects/projects.py
diff options
context:
space:
mode:
authorNejc Habjan <hab.nejc@gmail.com>2021-12-01 01:04:53 +0100
committerGitHub <noreply@github.com>2021-12-01 01:04:53 +0100
commit8d76826fa64460e504acc5924f859f8dbc246b42 (patch)
tree083fefada982c795e2415092794db429abb0c184 /gitlab/v4/objects/projects.py
parent5a1678f43184bd459132102cc13cf8426fe0449d (diff)
parent86ab04e54ea4175f10053decfad5086cda7aa024 (diff)
downloadgitlab-master.tar.gz
Merge pull request #1723 from python-gitlab/jlvillal/dead_mastermaster
Close-out `master` branch
Diffstat (limited to 'gitlab/v4/objects/projects.py')
-rw-r--r--gitlab/v4/objects/projects.py1047
1 files changed, 0 insertions, 1047 deletions
diff --git a/gitlab/v4/objects/projects.py b/gitlab/v4/objects/projects.py
deleted file mode 100644
index 551079a..0000000
--- a/gitlab/v4/objects/projects.py
+++ /dev/null
@@ -1,1047 +0,0 @@
-from typing import Any, Callable, cast, Dict, List, Optional, TYPE_CHECKING, Union
-
-import requests
-
-from gitlab import cli, client
-from gitlab import exceptions as exc
-from gitlab import types, utils
-from gitlab.base import RequiredOptional, RESTManager, RESTObject
-from gitlab.mixins import (
- CreateMixin,
- CRUDMixin,
- ListMixin,
- ObjectDeleteMixin,
- RefreshMixin,
- SaveMixin,
- UpdateMixin,
-)
-
-from .access_requests import ProjectAccessRequestManager # noqa: F401
-from .audit_events import ProjectAuditEventManager # noqa: F401
-from .badges import ProjectBadgeManager # noqa: F401
-from .boards import ProjectBoardManager # noqa: F401
-from .branches import ProjectBranchManager, ProjectProtectedBranchManager # noqa: F401
-from .clusters import ProjectClusterManager # noqa: F401
-from .commits import ProjectCommitManager # noqa: F401
-from .container_registry import ProjectRegistryRepositoryManager # noqa: F401
-from .custom_attributes import ProjectCustomAttributeManager # noqa: F401
-from .deploy_keys import ProjectKeyManager # noqa: F401
-from .deploy_tokens import ProjectDeployTokenManager # noqa: F401
-from .deployments import ProjectDeploymentManager # noqa: F401
-from .environments import ProjectEnvironmentManager # noqa: F401
-from .events import ProjectEventManager # noqa: F401
-from .export_import import ProjectExportManager, ProjectImportManager # noqa: F401
-from .files import ProjectFileManager # noqa: F401
-from .hooks import ProjectHookManager # noqa: F401
-from .issues import ProjectIssueManager # noqa: F401
-from .jobs import ProjectJobManager # noqa: F401
-from .labels import ProjectLabelManager # noqa: F401
-from .members import ProjectMemberAllManager, ProjectMemberManager # noqa: F401
-from .merge_request_approvals import ( # noqa: F401
- ProjectApprovalManager,
- ProjectApprovalRuleManager,
-)
-from .merge_requests import ProjectMergeRequestManager # noqa: F401
-from .milestones import ProjectMilestoneManager # noqa: F401
-from .notes import ProjectNoteManager # noqa: F401
-from .notification_settings import ProjectNotificationSettingsManager # noqa: F401
-from .packages import GenericPackageManager, ProjectPackageManager # noqa: F401
-from .pages import ProjectPagesDomainManager # noqa: F401
-from .pipelines import ( # noqa: F401
- ProjectPipeline,
- ProjectPipelineManager,
- ProjectPipelineScheduleManager,
-)
-from .project_access_tokens import ProjectAccessTokenManager # noqa: F401
-from .push_rules import ProjectPushRulesManager # noqa: F401
-from .releases import ProjectReleaseManager # noqa: F401
-from .repositories import RepositoryMixin
-from .runners import ProjectRunnerManager # noqa: F401
-from .services import ProjectServiceManager # noqa: F401
-from .snippets import ProjectSnippetManager # noqa: F401
-from .statistics import ( # noqa: F401
- ProjectAdditionalStatisticsManager,
- ProjectIssuesStatisticsManager,
-)
-from .tags import ProjectProtectedTagManager, ProjectTagManager # noqa: F401
-from .triggers import ProjectTriggerManager # noqa: F401
-from .users import ProjectUserManager # noqa: F401
-from .variables import ProjectVariableManager # noqa: F401
-from .wikis import ProjectWikiManager # noqa: F401
-
-__all__ = [
- "GroupProject",
- "GroupProjectManager",
- "Project",
- "ProjectManager",
- "ProjectFork",
- "ProjectForkManager",
- "ProjectRemoteMirror",
- "ProjectRemoteMirrorManager",
-]
-
-
-class GroupProject(RESTObject):
- pass
-
-
-class GroupProjectManager(ListMixin, RESTManager):
- _path = "/groups/%(group_id)s/projects"
- _obj_cls = GroupProject
- _from_parent_attrs = {"group_id": "id"}
- _list_filters = (
- "archived",
- "visibility",
- "order_by",
- "sort",
- "search",
- "simple",
- "owned",
- "starred",
- "with_custom_attributes",
- "include_subgroups",
- "with_issues_enabled",
- "with_merge_requests_enabled",
- "with_shared",
- "min_access_level",
- "with_security_reports",
- )
-
-
-class Project(RefreshMixin, SaveMixin, ObjectDeleteMixin, RepositoryMixin, RESTObject):
- _short_print_attr = "path"
-
- access_tokens: ProjectAccessTokenManager
- accessrequests: ProjectAccessRequestManager
- additionalstatistics: ProjectAdditionalStatisticsManager
- approvalrules: ProjectApprovalRuleManager
- approvals: ProjectApprovalManager
- audit_events: ProjectAuditEventManager
- badges: ProjectBadgeManager
- boards: ProjectBoardManager
- branches: ProjectBranchManager
- clusters: ProjectClusterManager
- commits: ProjectCommitManager
- customattributes: ProjectCustomAttributeManager
- deployments: ProjectDeploymentManager
- deploytokens: ProjectDeployTokenManager
- environments: ProjectEnvironmentManager
- events: ProjectEventManager
- exports: ProjectExportManager
- files: ProjectFileManager
- forks: "ProjectForkManager"
- generic_packages: GenericPackageManager
- hooks: ProjectHookManager
- imports: ProjectImportManager
- issues: ProjectIssueManager
- issues_statistics: ProjectIssuesStatisticsManager
- jobs: ProjectJobManager
- keys: ProjectKeyManager
- labels: ProjectLabelManager
- members: ProjectMemberManager
- members_all: ProjectMemberAllManager
- mergerequests: ProjectMergeRequestManager
- milestones: ProjectMilestoneManager
- notes: ProjectNoteManager
- notificationsettings: ProjectNotificationSettingsManager
- packages: ProjectPackageManager
- pagesdomains: ProjectPagesDomainManager
- pipelines: ProjectPipelineManager
- pipelineschedules: ProjectPipelineScheduleManager
- protectedbranches: ProjectProtectedBranchManager
- protectedtags: ProjectProtectedTagManager
- pushrules: ProjectPushRulesManager
- releases: ProjectReleaseManager
- remote_mirrors: "ProjectRemoteMirrorManager"
- repositories: ProjectRegistryRepositoryManager
- runners: ProjectRunnerManager
- services: ProjectServiceManager
- snippets: ProjectSnippetManager
- tags: ProjectTagManager
- triggers: ProjectTriggerManager
- users: ProjectUserManager
- variables: ProjectVariableManager
- wikis: ProjectWikiManager
-
- @cli.register_custom_action("Project", ("forked_from_id",))
- @exc.on_http_error(exc.GitlabCreateError)
- def create_fork_relation(self, forked_from_id: int, **kwargs: Any) -> None:
- """Create a forked from/to relation between existing projects.
-
- Args:
- forked_from_id (int): The ID of the project that was forked from
- **kwargs: Extra options to send to the server (e.g. sudo)
-
- Raises:
- GitlabAuthenticationError: If authentication is not correct
- GitlabCreateError: If the relation could not be created
- """
- path = "/projects/%s/fork/%s" % (self.get_id(), forked_from_id)
- self.manager.gitlab.http_post(path, **kwargs)
-
- @cli.register_custom_action("Project")
- @exc.on_http_error(exc.GitlabDeleteError)
- def delete_fork_relation(self, **kwargs: Any) -> None:
- """Delete a forked relation between existing projects.
-
- Args:
- **kwargs: Extra options to send to the server (e.g. sudo)
-
- Raises:
- GitlabAuthenticationError: If authentication is not correct
- GitlabDeleteError: If the server failed to perform the request
- """
- path = "/projects/%s/fork" % self.get_id()
- self.manager.gitlab.http_delete(path, **kwargs)
-
- @cli.register_custom_action("Project")
- @exc.on_http_error(exc.GitlabGetError)
- def languages(self, **kwargs: Any) -> Union[Dict[str, Any], requests.Response]:
- """Get languages used in the project with percentage value.
-
- Args:
- **kwargs: Extra options to send to the server (e.g. sudo)
-
- Raises:
- GitlabAuthenticationError: If authentication is not correct
- GitlabGetError: If the server failed to perform the request
- """
- path = "/projects/%s/languages" % self.get_id()
- return self.manager.gitlab.http_get(path, **kwargs)
-
- @cli.register_custom_action("Project")
- @exc.on_http_error(exc.GitlabCreateError)
- def star(self, **kwargs: Any) -> None:
- """Star a project.
-
- Args:
- **kwargs: Extra options to send to the server (e.g. sudo)
-
- Raises:
- GitlabAuthenticationError: If authentication is not correct
- GitlabCreateError: If the server failed to perform the request
- """
- path = "/projects/%s/star" % self.get_id()
- server_data = self.manager.gitlab.http_post(path, **kwargs)
- if TYPE_CHECKING:
- assert isinstance(server_data, dict)
- self._update_attrs(server_data)
-
- @cli.register_custom_action("Project")
- @exc.on_http_error(exc.GitlabDeleteError)
- def unstar(self, **kwargs: Any) -> None:
- """Unstar a project.
-
- Args:
- **kwargs: Extra options to send to the server (e.g. sudo)
-
- Raises:
- GitlabAuthenticationError: If authentication is not correct
- GitlabDeleteError: If the server failed to perform the request
- """
- path = "/projects/%s/unstar" % self.get_id()
- server_data = self.manager.gitlab.http_post(path, **kwargs)
- if TYPE_CHECKING:
- assert isinstance(server_data, dict)
- self._update_attrs(server_data)
-
- @cli.register_custom_action("Project")
- @exc.on_http_error(exc.GitlabCreateError)
- def archive(self, **kwargs: Any) -> None:
- """Archive a project.
-
- Args:
- **kwargs: Extra options to send to the server (e.g. sudo)
-
- Raises:
- GitlabAuthenticationError: If authentication is not correct
- GitlabCreateError: If the server failed to perform the request
- """
- path = "/projects/%s/archive" % self.get_id()
- server_data = self.manager.gitlab.http_post(path, **kwargs)
- if TYPE_CHECKING:
- assert isinstance(server_data, dict)
- self._update_attrs(server_data)
-
- @cli.register_custom_action("Project")
- @exc.on_http_error(exc.GitlabDeleteError)
- def unarchive(self, **kwargs: Any) -> None:
- """Unarchive a project.
-
- Args:
- **kwargs: Extra options to send to the server (e.g. sudo)
-
- Raises:
- GitlabAuthenticationError: If authentication is not correct
- GitlabDeleteError: If the server failed to perform the request
- """
- path = "/projects/%s/unarchive" % self.get_id()
- server_data = self.manager.gitlab.http_post(path, **kwargs)
- if TYPE_CHECKING:
- assert isinstance(server_data, dict)
- self._update_attrs(server_data)
-
- @cli.register_custom_action(
- "Project", ("group_id", "group_access"), ("expires_at",)
- )
- @exc.on_http_error(exc.GitlabCreateError)
- def share(
- self,
- group_id: int,
- group_access: int,
- expires_at: Optional[str] = None,
- **kwargs: Any
- ) -> None:
- """Share the project with a group.
-
- Args:
- group_id (int): ID of the group.
- group_access (int): Access level for the group.
- **kwargs: Extra options to send to the server (e.g. sudo)
-
- Raises:
- GitlabAuthenticationError: If authentication is not correct
- GitlabCreateError: If the server failed to perform the request
- """
- path = "/projects/%s/share" % self.get_id()
- data = {
- "group_id": group_id,
- "group_access": group_access,
- "expires_at": expires_at,
- }
- self.manager.gitlab.http_post(path, post_data=data, **kwargs)
-
- @cli.register_custom_action("Project", ("group_id",))
- @exc.on_http_error(exc.GitlabDeleteError)
- def unshare(self, group_id: int, **kwargs: Any) -> None:
- """Delete a shared project link within a group.
-
- Args:
- group_id (int): ID of the group.
- **kwargs: Extra options to send to the server (e.g. sudo)
-
- Raises:
- GitlabAuthenticationError: If authentication is not correct
- GitlabDeleteError: If the server failed to perform the request
- """
- path = "/projects/%s/share/%s" % (self.get_id(), group_id)
- self.manager.gitlab.http_delete(path, **kwargs)
-
- # variables not supported in CLI
- @cli.register_custom_action("Project", ("ref", "token"))
- @exc.on_http_error(exc.GitlabCreateError)
- def trigger_pipeline(
- self,
- ref: str,
- token: str,
- variables: Optional[Dict[str, Any]] = None,
- **kwargs: Any
- ) -> ProjectPipeline:
- """Trigger a CI build.
-
- See https://gitlab.com/help/ci/triggers/README.md#trigger-a-build
-
- Args:
- ref (str): Commit to build; can be a branch name or a tag
- token (str): The trigger token
- variables (dict): Variables passed to the build script
- **kwargs: Extra options to send to the server (e.g. sudo)
-
- Raises:
- GitlabAuthenticationError: If authentication is not correct
- GitlabCreateError: If the server failed to perform the request
- """
- variables = variables or {}
- path = "/projects/%s/trigger/pipeline" % self.get_id()
- post_data = {"ref": ref, "token": token, "variables": variables}
- attrs = self.manager.gitlab.http_post(path, post_data=post_data, **kwargs)
- if TYPE_CHECKING:
- assert isinstance(attrs, dict)
- return ProjectPipeline(self.pipelines, attrs)
-
- @cli.register_custom_action("Project")
- @exc.on_http_error(exc.GitlabHousekeepingError)
- def housekeeping(self, **kwargs: Any) -> None:
- """Start the housekeeping task.
-
- Args:
- **kwargs: Extra options to send to the server (e.g. sudo)
-
- Raises:
- GitlabAuthenticationError: If authentication is not correct
- GitlabHousekeepingError: If the server failed to perform the
- request
- """
- path = "/projects/%s/housekeeping" % self.get_id()
- self.manager.gitlab.http_post(path, **kwargs)
-
- # see #56 - add file attachment features
- @cli.register_custom_action("Project", ("filename", "filepath"))
- @exc.on_http_error(exc.GitlabUploadError)
- def upload(
- self,
- filename: str,
- filedata: Optional[bytes] = None,
- filepath: Optional[str] = None,
- **kwargs: Any
- ) -> Dict[str, Any]:
- """Upload the specified file into the project.
-
- .. note::
-
- Either ``filedata`` or ``filepath`` *MUST* be specified.
-
- Args:
- filename (str): The name of the file being uploaded
- filedata (bytes): The raw data of the file being uploaded
- filepath (str): The path to a local file to upload (optional)
-
- Raises:
- GitlabConnectionError: If the server cannot be reached
- GitlabUploadError: If the file upload fails
- GitlabUploadError: If ``filedata`` and ``filepath`` are not
- specified
- GitlabUploadError: If both ``filedata`` and ``filepath`` are
- specified
-
- Returns:
- dict: A ``dict`` with the keys:
- * ``alt`` - The alternate text for the upload
- * ``url`` - The direct url to the uploaded file
- * ``markdown`` - Markdown for the uploaded file
- """
- if filepath is None and filedata is None:
- raise exc.GitlabUploadError("No file contents or path specified")
-
- if filedata is not None and filepath is not None:
- raise exc.GitlabUploadError("File contents and file path specified")
-
- if filepath is not None:
- with open(filepath, "rb") as f:
- filedata = f.read()
-
- url = "/projects/%(id)s/uploads" % {"id": self.id}
- file_info = {"file": (filename, filedata)}
- data = self.manager.gitlab.http_post(url, files=file_info)
-
- if TYPE_CHECKING:
- assert isinstance(data, dict)
- return {"alt": data["alt"], "url": data["url"], "markdown": data["markdown"]}
-
- @cli.register_custom_action("Project", optional=("wiki",))
- @exc.on_http_error(exc.GitlabGetError)
- def snapshot(
- self,
- wiki: bool = False,
- streamed: bool = False,
- action: Optional[Callable] = None,
- chunk_size: int = 1024,
- **kwargs: Any
- ) -> Optional[bytes]:
- """Return a snapshot of the repository.
-
- Args:
- wiki (bool): If True return the wiki repository
- streamed (bool): If True the data will be processed by chunks of
- `chunk_size` and each chunk is passed to `action` for
- treatment.
- action (callable): Callable responsible of dealing with chunk of
- data
- chunk_size (int): Size of each chunk
- **kwargs: Extra options to send to the server (e.g. sudo)
-
- Raises:
- GitlabAuthenticationError: If authentication is not correct
- GitlabGetError: If the content could not be retrieved
-
- Returns:
- str: The uncompressed tar archive of the repository
- """
- path = "/projects/%s/snapshot" % self.get_id()
- result = self.manager.gitlab.http_get(
- path, streamed=streamed, raw=True, **kwargs
- )
- if TYPE_CHECKING:
- assert isinstance(result, requests.Response)
- return utils.response_content(result, streamed, action, chunk_size)
-
- @cli.register_custom_action("Project", ("scope", "search"))
- @exc.on_http_error(exc.GitlabSearchError)
- def search(
- self, scope: str, search: str, **kwargs: Any
- ) -> Union[client.GitlabList, List[Dict[str, Any]]]:
- """Search the project resources matching the provided string.'
-
- Args:
- scope (str): Scope of the search
- search (str): Search string
- **kwargs: Extra options to send to the server (e.g. sudo)
-
- Raises:
- GitlabAuthenticationError: If authentication is not correct
- GitlabSearchError: If the server failed to perform the request
-
- Returns:
- GitlabList: A list of dicts describing the resources found.
- """
- data = {"scope": scope, "search": search}
- path = "/projects/%s/search" % self.get_id()
- return self.manager.gitlab.http_list(path, query_data=data, **kwargs)
-
- @cli.register_custom_action("Project")
- @exc.on_http_error(exc.GitlabCreateError)
- def mirror_pull(self, **kwargs: Any) -> None:
- """Start the pull mirroring process for the project.
-
- Args:
- **kwargs: Extra options to send to the server (e.g. sudo)
-
- Raises:
- GitlabAuthenticationError: If authentication is not correct
- GitlabCreateError: If the server failed to perform the request
- """
- path = "/projects/%s/mirror/pull" % self.get_id()
- self.manager.gitlab.http_post(path, **kwargs)
-
- @cli.register_custom_action("Project", ("to_namespace",))
- @exc.on_http_error(exc.GitlabTransferProjectError)
- def transfer_project(self, to_namespace: str, **kwargs: Any) -> None:
- """Transfer a project to the given namespace ID
-
- Args:
- to_namespace (str): ID or path of the namespace to transfer the
- project to
- **kwargs: Extra options to send to the server (e.g. sudo)
-
- Raises:
- GitlabAuthenticationError: If authentication is not correct
- GitlabTransferProjectError: If the project could not be transferred
- """
- path = "/projects/%s/transfer" % (self.id,)
- self.manager.gitlab.http_put(
- path, post_data={"namespace": to_namespace}, **kwargs
- )
-
- @cli.register_custom_action("Project", ("ref_name", "job"), ("job_token",))
- @exc.on_http_error(exc.GitlabGetError)
- def artifacts(
- self,
- ref_name: str,
- job: str,
- streamed: bool = False,
- action: Optional[Callable] = None,
- chunk_size: int = 1024,
- **kwargs: Any
- ) -> Optional[bytes]:
- """Get the job artifacts archive from a specific tag or branch.
-
- Args:
- ref_name (str): Branch or tag name in repository. HEAD or SHA references
- are not supported.
- artifact_path (str): Path to a file inside the artifacts archive.
- job (str): The name of the job.
- job_token (str): Job token for multi-project pipeline triggers.
- streamed (bool): If True the data will be processed by chunks of
- `chunk_size` and each chunk is passed to `action` for
- treatment
- action (callable): Callable responsible of dealing with chunk of
- data
- chunk_size (int): Size of each chunk
- **kwargs: Extra options to send to the server (e.g. sudo)
-
- Raises:
- GitlabAuthenticationError: If authentication is not correct
- GitlabGetError: If the artifacts could not be retrieved
-
- Returns:
- str: The artifacts if `streamed` is False, None otherwise.
- """
- path = "/projects/%s/jobs/artifacts/%s/download" % (self.get_id(), ref_name)
- result = self.manager.gitlab.http_get(
- path, job=job, streamed=streamed, raw=True, **kwargs
- )
- if TYPE_CHECKING:
- assert isinstance(result, requests.Response)
- return utils.response_content(result, streamed, action, chunk_size)
-
- @cli.register_custom_action("Project", ("ref_name", "artifact_path", "job"))
- @exc.on_http_error(exc.GitlabGetError)
- def artifact(
- self,
- ref_name: str,
- artifact_path: str,
- job: str,
- streamed: bool = False,
- action: Optional[Callable] = None,
- chunk_size: int = 1024,
- **kwargs: Any
- ) -> Optional[bytes]:
- """Download a single artifact file from a specific tag or branch from within the job’s artifacts archive.
-
- Args:
- ref_name (str): Branch or tag name in repository. HEAD or SHA references are not supported.
- artifact_path (str): Path to a file inside the artifacts archive.
- job (str): The name of the job.
- streamed (bool): If True the data will be processed by chunks of
- `chunk_size` and each chunk is passed to `action` for
- treatment
- action (callable): Callable responsible of dealing with chunk of
- data
- chunk_size (int): Size of each chunk
- **kwargs: Extra options to send to the server (e.g. sudo)
-
- Raises:
- GitlabAuthenticationError: If authentication is not correct
- GitlabGetError: If the artifacts could not be retrieved
-
- Returns:
- str: The artifacts if `streamed` is False, None otherwise.
- """
-
- path = "/projects/%s/jobs/artifacts/%s/raw/%s?job=%s" % (
- self.get_id(),
- ref_name,
- artifact_path,
- job,
- )
- result = self.manager.gitlab.http_get(
- path, streamed=streamed, raw=True, **kwargs
- )
- if TYPE_CHECKING:
- assert isinstance(result, requests.Response)
- return utils.response_content(result, streamed, action, chunk_size)
-
-
-class ProjectManager(CRUDMixin, RESTManager):
- _path = "/projects"
- _obj_cls = Project
- # Please keep these _create_attrs in same order as they are at:
- # https://docs.gitlab.com/ee/api/projects.html#create-project
- _create_attrs = RequiredOptional(
- optional=(
- "name",
- "path",
- "allow_merge_on_skipped_pipeline",
- "analytics_access_level",
- "approvals_before_merge",
- "auto_cancel_pending_pipelines",
- "auto_devops_deploy_strategy",
- "auto_devops_enabled",
- "autoclose_referenced_issues",
- "avatar",
- "build_coverage_regex",
- "build_git_strategy",
- "build_timeout",
- "builds_access_level",
- "ci_config_path",
- "container_expiration_policy_attributes",
- "container_registry_enabled",
- "default_branch",
- "description",
- "emails_disabled",
- "external_authorization_classification_label",
- "forking_access_level",
- "group_with_project_templates_id",
- "import_url",
- "initialize_with_readme",
- "issues_access_level",
- "issues_enabled",
- "jobs_enabled",
- "lfs_enabled",
- "merge_method",
- "merge_requests_access_level",
- "merge_requests_enabled",
- "mirror_trigger_builds",
- "mirror",
- "namespace_id",
- "operations_access_level",
- "only_allow_merge_if_all_discussions_are_resolved",
- "only_allow_merge_if_pipeline_succeeds",
- "packages_enabled",
- "pages_access_level",
- "requirements_access_level",
- "printing_merge_request_link_enabled",
- "public_builds",
- "remove_source_branch_after_merge",
- "repository_access_level",
- "repository_storage",
- "request_access_enabled",
- "resolve_outdated_diff_discussions",
- "shared_runners_enabled",
- "show_default_award_emojis",
- "snippets_access_level",
- "snippets_enabled",
- "tag_list",
- "template_name",
- "template_project_id",
- "use_custom_template",
- "visibility",
- "wiki_access_level",
- "wiki_enabled",
- ),
- )
- # Please keep these _update_attrs in same order as they are at:
- # https://docs.gitlab.com/ee/api/projects.html#edit-project
- _update_attrs = RequiredOptional(
- optional=(
- "allow_merge_on_skipped_pipeline",
- "analytics_access_level",
- "approvals_before_merge",
- "auto_cancel_pending_pipelines",
- "auto_devops_deploy_strategy",
- "auto_devops_enabled",
- "autoclose_referenced_issues",
- "avatar",
- "build_coverage_regex",
- "build_git_strategy",
- "build_timeout",
- "builds_access_level",
- "ci_config_path",
- "ci_default_git_depth",
- "ci_forward_deployment_enabled",
- "container_expiration_policy_attributes",
- "container_registry_enabled",
- "default_branch",
- "description",
- "emails_disabled",
- "external_authorization_classification_label",
- "forking_access_level",
- "import_url",
- "issues_access_level",
- "issues_enabled",
- "jobs_enabled",
- "lfs_enabled",
- "merge_method",
- "merge_requests_access_level",
- "merge_requests_enabled",
- "mirror_overwrites_diverged_branches",
- "mirror_trigger_builds",
- "mirror_user_id",
- "mirror",
- "name",
- "operations_access_level",
- "only_allow_merge_if_all_discussions_are_resolved",
- "only_allow_merge_if_pipeline_succeeds",
- "only_mirror_protected_branches",
- "packages_enabled",
- "pages_access_level",
- "requirements_access_level",
- "restrict_user_defined_variables",
- "path",
- "public_builds",
- "remove_source_branch_after_merge",
- "repository_access_level",
- "repository_storage",
- "request_access_enabled",
- "resolve_outdated_diff_discussions",
- "service_desk_enabled",
- "shared_runners_enabled",
- "show_default_award_emojis",
- "snippets_access_level",
- "snippets_enabled",
- "suggestion_commit_message",
- "tag_list",
- "visibility",
- "wiki_access_level",
- "wiki_enabled",
- "issues_template",
- "merge_requests_template",
- ),
- )
- _list_filters = (
- "archived",
- "id_after",
- "id_before",
- "last_activity_after",
- "last_activity_before",
- "membership",
- "min_access_level",
- "order_by",
- "owned",
- "repository_checksum_failed",
- "repository_storage",
- "search_namespaces",
- "search",
- "simple",
- "sort",
- "starred",
- "statistics",
- "topic",
- "visibility",
- "wiki_checksum_failed",
- "with_custom_attributes",
- "with_issues_enabled",
- "with_merge_requests_enabled",
- "with_programming_language",
- )
- _types = {"avatar": types.ImageAttribute, "topic": types.ListAttribute}
-
- def get(self, id: Union[str, int], lazy: bool = False, **kwargs: Any) -> Project:
- return cast(Project, super().get(id=id, lazy=lazy, **kwargs))
-
- def import_project(
- self,
- file: str,
- path: str,
- name: Optional[str] = None,
- namespace: Optional[str] = None,
- overwrite: bool = False,
- override_params: Optional[Dict[str, Any]] = None,
- **kwargs: Any
- ) -> Union[Dict[str, Any], requests.Response]:
- """Import a project from an archive file.
-
- Args:
- file: Data or file object containing the project
- path (str): Name and path for the new project
- namespace (str): The ID or path of the namespace that the project
- will be imported to
- overwrite (bool): If True overwrite an existing project with the
- same path
- override_params (dict): Set the specific settings for the project
- **kwargs: Extra options to send to the server (e.g. sudo)
-
- Raises:
- GitlabAuthenticationError: If authentication is not correct
- GitlabListError: If the server failed to perform the request
-
- Returns:
- dict: A representation of the import status.
- """
- files = {"file": ("file.tar.gz", file, "application/octet-stream")}
- data = {"path": path, "overwrite": str(overwrite)}
- if override_params:
- for k, v in override_params.items():
- data["override_params[%s]" % k] = v
- if name is not None:
- data["name"] = name
- if namespace:
- data["namespace"] = namespace
- return self.gitlab.http_post(
- "/projects/import", post_data=data, files=files, **kwargs
- )
-
- def import_bitbucket_server(
- self,
- bitbucket_server_url: str,
- bitbucket_server_username: str,
- personal_access_token: str,
- bitbucket_server_project: str,
- bitbucket_server_repo: str,
- new_name: Optional[str] = None,
- target_namespace: Optional[str] = None,
- **kwargs: Any
- ) -> Union[Dict[str, Any], requests.Response]:
- """Import a project from BitBucket Server to Gitlab (schedule the import)
-
- This method will return when an import operation has been safely queued,
- or an error has occurred. After triggering an import, check the
- ``import_status`` of the newly created project to detect when the import
- operation has completed.
-
- .. note::
- This request may take longer than most other API requests.
- So this method will specify a 60 second default timeout if none is specified.
- A timeout can be specified via kwargs to override this functionality.
-
- Args:
- bitbucket_server_url (str): Bitbucket Server URL
- bitbucket_server_username (str): Bitbucket Server Username
- personal_access_token (str): Bitbucket Server personal access
- token/password
- bitbucket_server_project (str): Bitbucket Project Key
- bitbucket_server_repo (str): Bitbucket Repository Name
- new_name (str): New repository name (Optional)
- target_namespace (str): Namespace to import repository into.
- Supports subgroups like /namespace/subgroup (Optional)
- **kwargs: Extra options to send to the server (e.g. sudo)
-
- Raises:
- GitlabAuthenticationError: If authentication is not correct
- GitlabListError: If the server failed to perform the request
-
- Returns:
- dict: A representation of the import status.
-
- Example:
-
- .. code-block:: python
-
- gl = gitlab.Gitlab_from_config()
- print("Triggering import")
- result = gl.projects.import_bitbucket_server(
- bitbucket_server_url="https://some.server.url",
- bitbucket_server_username="some_bitbucket_user",
- personal_access_token="my_password_or_access_token",
- bitbucket_server_project="my_project",
- bitbucket_server_repo="my_repo",
- new_name="gl_project_name",
- target_namespace="gl_project_path"
- )
- project = gl.projects.get(ret['id'])
- print("Waiting for import to complete")
- while project.import_status == u'started':
- time.sleep(1.0)
- project = gl.projects.get(project.id)
- print("BitBucket import complete")
-
- """
- data = {
- "bitbucket_server_url": bitbucket_server_url,
- "bitbucket_server_username": bitbucket_server_username,
- "personal_access_token": personal_access_token,
- "bitbucket_server_project": bitbucket_server_project,
- "bitbucket_server_repo": bitbucket_server_repo,
- }
- if new_name:
- data["new_name"] = new_name
- if target_namespace:
- data["target_namespace"] = target_namespace
- if (
- "timeout" not in kwargs
- or self.gitlab.timeout is None
- or self.gitlab.timeout < 60.0
- ):
- # Ensure that this HTTP request has a longer-than-usual default timeout
- # The base gitlab object tends to have a default that is <10 seconds,
- # and this is too short for this API command, typically.
- # On the order of 24 seconds has been measured on a typical gitlab instance.
- kwargs["timeout"] = 60.0
- result = self.gitlab.http_post(
- "/import/bitbucket_server", post_data=data, **kwargs
- )
- return result
-
- def import_github(
- self,
- personal_access_token: str,
- repo_id: int,
- target_namespace: str,
- new_name: Optional[str] = None,
- **kwargs: Any
- ) -> Union[Dict[str, Any], requests.Response]:
- """Import a project from Github to Gitlab (schedule the import)
-
- This method will return when an import operation has been safely queued,
- or an error has occurred. After triggering an import, check the
- ``import_status`` of the newly created project to detect when the import
- operation has completed.
-
- .. note::
- This request may take longer than most other API requests.
- So this method will specify a 60 second default timeout if none is specified.
- A timeout can be specified via kwargs to override this functionality.
-
- Args:
- personal_access_token (str): GitHub personal access token
- repo_id (int): Github repository ID
- target_namespace (str): Namespace to import repo into
- new_name (str): New repo name (Optional)
- **kwargs: Extra options to send to the server (e.g. sudo)
-
- Raises:
- GitlabAuthenticationError: If authentication is not correct
- GitlabListError: If the server failed to perform the request
-
- Returns:
- dict: A representation of the import status.
-
- Example:
-
- .. code-block:: python
-
- gl = gitlab.Gitlab_from_config()
- print("Triggering import")
- result = gl.projects.import_github(ACCESS_TOKEN,
- 123456,
- "my-group/my-subgroup")
- project = gl.projects.get(ret['id'])
- print("Waiting for import to complete")
- while project.import_status == u'started':
- time.sleep(1.0)
- project = gl.projects.get(project.id)
- print("Github import complete")
-
- """
- data = {
- "personal_access_token": personal_access_token,
- "repo_id": repo_id,
- "target_namespace": target_namespace,
- }
- if new_name:
- data["new_name"] = new_name
- if (
- "timeout" not in kwargs
- or self.gitlab.timeout is None
- or self.gitlab.timeout < 60.0
- ):
- # Ensure that this HTTP request has a longer-than-usual default timeout
- # The base gitlab object tends to have a default that is <10 seconds,
- # and this is too short for this API command, typically.
- # On the order of 24 seconds has been measured on a typical gitlab instance.
- kwargs["timeout"] = 60.0
- result = self.gitlab.http_post("/import/github", post_data=data, **kwargs)
- return result
-
-
-class ProjectFork(RESTObject):
- pass
-
-
-class ProjectForkManager(CreateMixin, ListMixin, RESTManager):
- _path = "/projects/%(project_id)s/forks"
- _obj_cls = ProjectFork
- _from_parent_attrs = {"project_id": "id"}
- _list_filters = (
- "archived",
- "visibility",
- "order_by",
- "sort",
- "search",
- "simple",
- "owned",
- "membership",
- "starred",
- "statistics",
- "with_custom_attributes",
- "with_issues_enabled",
- "with_merge_requests_enabled",
- )
- _create_attrs = RequiredOptional(optional=("namespace",))
-
- def create(
- self, data: Optional[Dict[str, Any]] = None, **kwargs: Any
- ) -> ProjectFork:
- """Creates a new object.
-
- Args:
- data (dict): Parameters to send to the server to create the
- resource
- **kwargs: Extra options to send to the server (e.g. sudo)
-
- Raises:
- GitlabAuthenticationError: If authentication is not correct
- GitlabCreateError: If the server cannot perform the request
-
- Returns:
- RESTObject: A new instance of the managed object class build with
- the data sent by the server
- """
- if TYPE_CHECKING:
- assert self.path is not None
- path = self.path[:-1] # drop the 's'
- return cast(ProjectFork, CreateMixin.create(self, data, path=path, **kwargs))
-
-
-class ProjectRemoteMirror(SaveMixin, RESTObject):
- pass
-
-
-class ProjectRemoteMirrorManager(ListMixin, CreateMixin, UpdateMixin, RESTManager):
- _path = "/projects/%(project_id)s/remote_mirrors"
- _obj_cls = ProjectRemoteMirror
- _from_parent_attrs = {"project_id": "id"}
- _create_attrs = RequiredOptional(
- required=("url",), optional=("enabled", "only_protected_branches")
- )
- _update_attrs = RequiredOptional(optional=("enabled", "only_protected_branches"))