%PDF- %GIF98; %PNG;
Server : ApacheSystem : Linux host.digitalbabaji.in 4.18.0-513.11.1.el8_9.x86_64 #1 SMP Wed Jan 17 02:00:40 EST 2024 x86_64 User : addictionfreeind ( 1003) PHP Version : 7.2.34 Disable Function : exec,passthru,shell_exec,system Directory : /home/addictionfreeind/public_html/admin1/vendor/m4tthumphrey/php-gitlab-api/src/Api/ |
Upload File : |
<?php
declare(strict_types=1);
/*
* This file is part of the Gitlab API library.
*
* (c) Matt Humphrey <matth@windsor-telecom.co.uk>
* (c) Graham Campbell <hello@gjcampbell.co.uk>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Gitlab\Api;
use Symfony\Component\OptionsResolver\Exception\InvalidOptionsException;
use Symfony\Component\OptionsResolver\Exception\UndefinedOptionsException;
use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolver;
class Projects extends AbstractApi
{
/**
* @param array $parameters {
*
* @var bool $archived limit by archived status
* @var string $visibility limit by visibility public, internal, or private
* @var string $order_by Return projects ordered by id, name, path, created_at, updated_at,
* last_activity_at, repository_size, storage_size, packages_size or
* wiki_size fields (default is created_at)
* @var string $sort Return projects sorted in asc or desc order (default is desc)
* @var string $search return list of projects matching the search criteria
* @var bool $search_namespaces Include ancestor namespaces when matching search criteria
* @var bool $simple return only the ID, URL, name, and path of each project
* @var bool $owned limit by projects owned by the current user
* @var bool $membership limit by projects that the current user is a member of
* @var bool $starred limit by projects starred by the current user
* @var bool $statistics include project statistics
* @var bool $with_issues_enabled limit by enabled issues feature
* @var bool $with_merge_requests_enabled limit by enabled merge requests feature
* @var int $min_access_level Limit by current user minimal access level
* @var int $id_after Limit by project id's greater than the specified id
* @var int $id_before Limit by project id's less than the specified id
* @var \DateTimeInterface $last_activity_after Limit by last_activity after specified time
* @var \DateTimeInterface $last_activity_before Limit by last_activity before specified time
* @var bool $repository_checksum_failed Limit by failed repository checksum calculation
* @var string $repository_storage Limit by repository storage type
* @var bool $wiki_checksum_failed Limit by failed wiki checksum calculation
* @var bool $with_custom_attributes Include custom attributes in response
* @var string $with_programming_language Limit by programming language
* @var string $topic Limit by topic
* }
*
* @throws UndefinedOptionsException If an option name is undefined
* @throws InvalidOptionsException If an option doesn't fulfill the
* specified validation rules
*
* @return mixed
*/
public function all(array $parameters = [])
{
$resolver = $this->createOptionsResolver();
$booleanNormalizer = function (Options $resolver, $value): string {
return $value ? 'true' : 'false';
};
$datetimeNormalizer = function (Options $resolver, \DateTimeInterface $value): string {
return $value->format('c');
};
$resolver->setDefined('archived')
->setAllowedTypes('archived', 'bool')
->setNormalizer('archived', $booleanNormalizer)
;
$resolver->setDefined('visibility')
->setAllowedValues('visibility', ['public', 'internal', 'private'])
;
$orderBy = [
'id', 'name', 'path', 'created_at', 'updated_at', 'last_activity_at',
'repository_size', 'storage_size', 'packages_size', 'wiki_size',
];
$resolver->setDefined('order_by')
->setAllowedValues('order_by', $orderBy)
;
$resolver->setDefined('sort')
->setAllowedValues('sort', ['asc', 'desc'])
;
$resolver->setDefined('search');
$resolver->setDefined('search_namespaces')
->setAllowedTypes('search_namespaces', 'bool')
->setNormalizer('search_namespaces', $booleanNormalizer)
;
$resolver->setDefined('simple')
->setAllowedTypes('simple', 'bool')
->setNormalizer('simple', $booleanNormalizer)
;
$resolver->setDefined('owned')
->setAllowedTypes('owned', 'bool')
->setNormalizer('owned', $booleanNormalizer)
;
$resolver->setDefined('membership')
->setAllowedTypes('membership', 'bool')
->setNormalizer('membership', $booleanNormalizer)
;
$resolver->setDefined('starred')
->setAllowedTypes('starred', 'bool')
->setNormalizer('starred', $booleanNormalizer)
;
$resolver->setDefined('statistics')
->setAllowedTypes('statistics', 'bool')
->setNormalizer('statistics', $booleanNormalizer)
;
$resolver->setDefined('with_issues_enabled')
->setAllowedTypes('with_issues_enabled', 'bool')
->setNormalizer('with_issues_enabled', $booleanNormalizer)
;
$resolver->setDefined('with_merge_requests_enabled')
->setAllowedTypes('with_merge_requests_enabled', 'bool')
->setNormalizer('with_merge_requests_enabled', $booleanNormalizer)
;
$resolver->setDefined('min_access_level')
->setAllowedValues('min_access_level', [null, 10, 20, 30, 40, 50])
;
$resolver->setDefined('id_after')
->setAllowedTypes('id_after', 'integer')
;
$resolver->setDefined('id_before')
->setAllowedTypes('id_before', 'integer')
;
$resolver->setDefined('last_activity_after')
->setAllowedTypes('last_activity_after', \DateTimeInterface::class)
->setNormalizer('last_activity_after', $datetimeNormalizer)
;
$resolver->setDefined('last_activity_before')
->setAllowedTypes('last_activity_before', \DateTimeInterface::class)
->setNormalizer('last_activity_before', $datetimeNormalizer)
;
$resolver->setDefined('repository_checksum_failed')
->setAllowedTypes('repository_checksum_failed', 'bool')
->setNormalizer('repository_checksum_failed', $booleanNormalizer)
;
$resolver->setDefined('repository_storage');
$resolver->setDefined('wiki_checksum_failed')
->setAllowedTypes('wiki_checksum_failed', 'bool')
->setNormalizer('wiki_checksum_failed', $booleanNormalizer)
;
$resolver->setDefined('with_custom_attributes')
->setAllowedTypes('with_custom_attributes', 'bool')
->setNormalizer('with_custom_attributes', $booleanNormalizer)
;
$resolver->setDefined('with_programming_language');
$resolver->setDefined('topic');
return $this->get('projects', $resolver->resolve($parameters));
}
/**
* @param int|string $project_id
* @param array $parameters {
*
* @var bool $statistics include project statistics
* @var bool $with_custom_attributes Include project custom attributes.
* }
*
* @return mixed
*/
public function show($project_id, array $parameters = [])
{
$resolver = $this->createOptionsResolver();
$booleanNormalizer = function (Options $resolver, $value): bool {
return (bool) $value;
};
$resolver->setDefined('statistics')
->setAllowedTypes('statistics', 'bool')
->setNormalizer('statistics', $booleanNormalizer)
;
$resolver->setDefined('with_custom_attributes')
->setAllowedTypes('with_custom_attributes', 'bool')
->setNormalizer('with_custom_attributes', $booleanNormalizer)
;
return $this->get('projects/'.self::encodePath($project_id), $resolver->resolve($parameters));
}
/**
* @param string $name
* @param array $parameters
*
* @return mixed
*/
public function create(string $name, array $parameters = [])
{
$parameters['name'] = $name;
return $this->post('projects', $parameters);
}
/**
* @param int $user_id
* @param string $name
* @param array $parameters
*
* @return mixed
*/
public function createForUser(int $user_id, string $name, array $parameters = [])
{
$parameters['name'] = $name;
return $this->post('projects/user/'.self::encodePath($user_id), $parameters);
}
/**
* @param int|string $project_id
* @param array $parameters
*
* @return mixed
*/
public function update($project_id, array $parameters)
{
return $this->put('projects/'.self::encodePath($project_id), $parameters);
}
/**
* @param int|string $project_id
*
* @return mixed
*/
public function remove($project_id)
{
return $this->delete('projects/'.self::encodePath($project_id));
}
/**
* @param int|string $project_id
*
* @return mixed
*/
public function archive($project_id)
{
return $this->post('projects/'.self::encodePath($project_id).'/archive');
}
/**
* @param int|string $project_id
*
* @return mixed
*/
public function unarchive($project_id)
{
return $this->post('projects/'.self::encodePath($project_id).'/unarchive');
}
/**
* @param int|string $project_id
*
* @return mixed
*/
public function triggers($project_id)
{
return $this->get('projects/'.self::encodePath($project_id).'/triggers');
}
/**
* @param int|string $project_id
* @param int $trigger_id
*
* @return mixed
*/
public function trigger($project_id, int $trigger_id)
{
return $this->get($this->getProjectPath($project_id, 'triggers/'.self::encodePath($trigger_id)));
}
/**
* @param int|string $project_id
* @param string $description
*
* @return mixed
*/
public function createTrigger($project_id, string $description)
{
return $this->post($this->getProjectPath($project_id, 'triggers'), [
'description' => $description,
]);
}
/**
* @param int|string $project_id
* @param string $ref
* @param string $token
* @param array $variables
*
* @return mixed
*/
public function triggerPipeline($project_id, string $ref, string $token, array $variables = [])
{
return $this->post($this->getProjectPath($project_id, 'trigger/pipeline'), [
'ref' => $ref,
'token' => $token,
'variables' => $variables,
]);
}
/**
* @param int $project_id
* @param int $runner_id
*
* @return mixed
*/
public function disableRunner(int $project_id, int $runner_id)
{
return $this->delete('projects/'.self::encodePath($project_id).'/runners/'.self::encodePath($runner_id));
}
/**
* @param int $project_id
* @param int $runner_id
*
* @return mixed
*/
public function enableRunner(int $project_id, int $runner_id)
{
$parameters = [
'runner_id' => $runner_id,
];
return $this->post('projects/'.self::encodePath($project_id).'/runners', $parameters);
}
/**
* @param int|string $project_id
* @param array $parameters {
*
* @var string $scope the scope of pipelines, one of: running, pending, finished, branches, tags
* @var string $status the status of pipelines, one of: running, pending, success, failed, canceled, skipped
* @var string $ref the ref of pipelines
* @var string $sha the sha of pipelines
* @var bool $yaml_errors returns pipelines with invalid configurations
* @var string $name the name of the user who triggered pipelines
* @var string $username the username of the user who triggered pipelines
* @var string $order_by order pipelines by id, status, ref, updated_at, or user_id (default: id)
* @var string $order sort pipelines in asc or desc order (default: desc)
* @var string $source the source of the pipeline
* }
*
* @return mixed
*/
public function pipelines($project_id, array $parameters = [])
{
$resolver = $this->createOptionsResolver();
$booleanNormalizer = function (Options $resolver, $value): string {
return $value ? 'true' : 'false';
};
$datetimeNormalizer = function (Options $resolver, \DateTimeInterface $value): string {
return $value->format('Y-m-d');
};
$resolver->setDefined('scope')
->setAllowedValues('scope', ['running', 'pending', 'finished', 'branches', 'tags'])
;
$resolver->setDefined('status')
->setAllowedValues('status', ['running', 'pending', 'success', 'failed', 'canceled', 'skipped'])
;
$resolver->setDefined('ref');
$resolver->setDefined('sha');
$resolver->setDefined('yaml_errors')
->setAllowedTypes('yaml_errors', 'bool')
->setNormalizer('yaml_errors', $booleanNormalizer)
;
$resolver->setDefined('name');
$resolver->setDefined('username');
$resolver->setDefined('updated_after')
->setAllowedTypes('updated_after', \DateTimeInterface::class)
->setNormalizer('updated_after', $datetimeNormalizer)
;
$resolver->setDefined('updated_before')
->setAllowedTypes('updated_before', \DateTimeInterface::class)
->setNormalizer('updated_before', $datetimeNormalizer)
;
$resolver->setDefined('order_by')
->setAllowedValues('order_by', ['id', 'status', 'ref', 'updated_at', 'user_id'])
;
$resolver->setDefined('sort')
->setAllowedValues('sort', ['asc', 'desc'])
;
$resolver->setDefined('source')
->setAllowedValues('source', ['push', 'web', 'trigger', 'schedule', 'api', 'external', 'pipeline', 'chat', 'webide', 'merge_request_event', 'external_pull_request_event', 'parent_pipeline', 'ondemand_dast_scan', 'ondemand_dast_validation'])
;
return $this->get($this->getProjectPath($project_id, 'pipelines'), $resolver->resolve($parameters));
}
/**
* @param int|string $project_id
* @param int $pipeline_id
*
* @return mixed
*/
public function pipeline($project_id, int $pipeline_id)
{
return $this->get($this->getProjectPath($project_id, 'pipelines/'.self::encodePath($pipeline_id)));
}
/**
* @param int|string $project_id
* @param int $pipeline_id
*
* @return mixed
*/
public function pipelineJobs($project_id, int $pipeline_id)
{
return $this->get($this->getProjectPath($project_id, 'pipelines/'.self::encodePath($pipeline_id).'/jobs'));
}
/**
* @param int|string $project_id
* @param int $pipeline_id
*
* @return mixed
*/
public function pipelineVariables($project_id, int $pipeline_id)
{
return $this->get($this->getProjectPath($project_id, 'pipelines/'.self::encodePath($pipeline_id).'/variables'));
}
/**
* @param int|string $project_id
* @param int $pipeline_id
*
* @return mixed
*/
public function pipelineTestReport($project_id, int $pipeline_id)
{
return $this->get($this->getProjectPath($project_id, 'pipelines/'.self::encodePath($pipeline_id).'/test_report'));
}
/**
* @param int|string $project_id
* @param int $pipeline_id
*
* @return mixed
*/
public function pipelineTestReportSummary($project_id, int $pipeline_id)
{
return $this->get($this->getProjectPath($project_id, 'pipelines/'.self::encodePath($pipeline_id).'/test_report_summary'));
}
/**
* @param int|string $project_id
* @param string $commit_ref
* @param array|null $variables {
*
* @var string $key The name of the variable
* @var mixed $value The value of the variable
* @var string $variable_type env_var (default) or file
* }
*
* @return mixed
*/
public function createPipeline($project_id, string $commit_ref, array $variables = null)
{
$parameters = [];
if (null !== $variables) {
$parameters['variables'] = $variables;
}
return $this->post($this->getProjectPath($project_id, 'pipeline'), $parameters, [], [], [
'ref' => $commit_ref,
]);
}
/**
* @param int|string $project_id
* @param int $pipeline_id
*
* @return mixed
*/
public function retryPipeline($project_id, int $pipeline_id)
{
return $this->post($this->getProjectPath($project_id, 'pipelines/'.self::encodePath($pipeline_id)).'/retry');
}
/**
* @param int|string $project_id
* @param int $pipeline_id
*
* @return mixed
*/
public function cancelPipeline($project_id, int $pipeline_id)
{
return $this->post($this->getProjectPath($project_id, 'pipelines/'.self::encodePath($pipeline_id)).'/cancel');
}
/**
* @param int|string $project_id
* @param int $pipeline_id
*
* @return mixed
*/
public function deletePipeline($project_id, int $pipeline_id)
{
return $this->delete($this->getProjectPath($project_id, 'pipelines/'.self::encodePath($pipeline_id)));
}
/**
* @param int|string $project_id
* @param array $parameters
*
* @return mixed
*/
public function allMembers($project_id, array $parameters = [])
{
$resolver = $this->createOptionsResolver();
$resolver->setDefined('query');
$resolver->setDefined('user_ids')
->setAllowedTypes('user_ids', 'array')
->setAllowedValues('user_ids', function (array $value) {
return \count($value) === \count(\array_filter($value, 'is_int'));
})
;
return $this->get('projects/'.self::encodePath($project_id).'/members/all', $resolver->resolve($parameters));
}
/**
* @param int|string $project_id
* @param array $parameters {
*
* @var string $query The query you want to search members for.
* }
*
* @return mixed
*/
public function members($project_id, array $parameters = [])
{
$resolver = $this->createOptionsResolver();
$resolver->setDefined('query')
->setAllowedTypes('query', 'string')
;
$resolver->setDefined('user_ids')
->setAllowedTypes('user_ids', 'array')
->setAllowedValues('user_ids', function (array $value) {
return \count($value) === \count(\array_filter($value, 'is_int'));
})
;
return $this->get($this->getProjectPath($project_id, 'members'), $resolver->resolve($parameters));
}
/**
* @param int|string $project_id
* @param int $user_id
*
* @return mixed
*/
public function member($project_id, int $user_id)
{
return $this->get($this->getProjectPath($project_id, 'members/'.self::encodePath($user_id)));
}
/**
* @param int|string $project_id
* @param int $user_id
*
* @return mixed
*/
public function allMember($project_id, int $user_id)
{
return $this->get($this->getProjectPath($project_id, 'members/all/'.self::encodePath($user_id)));
}
/**
* @param int|string $project_id
* @param int $user_id
* @param int $access_level
*
* @return mixed
*/
public function addMember($project_id, int $user_id, int $access_level)
{
return $this->post($this->getProjectPath($project_id, 'members'), [
'user_id' => $user_id,
'access_level' => $access_level,
]);
}
/**
* @param int|string $project_id
* @param int $user_id
* @param int $access_level
*
* @return mixed
*/
public function saveMember($project_id, int $user_id, int $access_level)
{
return $this->put($this->getProjectPath($project_id, 'members/'.self::encodePath($user_id)), [
'access_level' => $access_level,
]);
}
/**
* @param int|string $project_id
* @param int $user_id
*
* @return mixed
*/
public function removeMember($project_id, int $user_id)
{
return $this->delete($this->getProjectPath($project_id, 'members/'.self::encodePath($user_id)));
}
/**
* @param int|string $project_id
* @param array $parameters
*
* @return mixed
*/
public function hooks($project_id, array $parameters = [])
{
$resolver = $this->createOptionsResolver();
return $this->get($this->getProjectPath($project_id, 'hooks'), $resolver->resolve($parameters));
}
/**
* @param int|string $project_id
* @param int $hook_id
*
* @return mixed
*/
public function hook($project_id, int $hook_id)
{
return $this->get($this->getProjectPath($project_id, 'hooks/'.self::encodePath($hook_id)));
}
/**
* Get project users.
*
* See https://docs.gitlab.com/ee/api/projects.html#get-project-users for more info.
*
* @param int|string $project_id
* @param array $parameters
*
* @return mixed
*/
public function users($project_id, array $parameters = [])
{
return $this->get($this->getProjectPath($project_id, 'users'), $parameters);
}
/**
* Get project issues.
*
* See https://docs.gitlab.com/ee/api/issues.html#list-project-issues for more info.
*
* @param int|string $project_id
* @param array $parameters
*
* @return mixed
*/
public function issues($project_id, array $parameters = [])
{
return $this->get($this->getProjectPath($project_id, 'issues'), $parameters);
}
/**
* Get projects board list.
*
* See https://docs.gitlab.com/ee/api/boards.html for more info.
*
* @param int|string $project_id
*
* @return mixed
*/
public function boards($project_id)
{
return $this->get($this->getProjectPath($project_id, 'boards'));
}
/**
* @param int|string $project_id
* @param array $parameters {
*
* @var string $state Return opened, upcoming, current (previously started), closed, or all iterations.
* Filtering by started state is deprecated starting with 14.1, please use current instead.
* @var string $search return only iterations with a title matching the provided string
* @var bool $include_ancestors Include iterations from parent group and its ancestors. Defaults to true.
* }
*
* @return mixed
*/
public function iterations($project_id, array $parameters = [])
{
$resolver = $this->createOptionsResolver();
$booleanNormalizer = function (Options $resolver, $value): string {
return $value ? 'true' : 'false';
};
$resolver->setDefined('state')
->setAllowedValues('state', ['opened', 'upcoming', 'current', 'current (previously started)', 'closed', 'all'])
;
$resolver->setDefined('include_ancestors')
->setAllowedTypes('include_ancestors', 'bool')
->setNormalizer('include_ancestors', $booleanNormalizer)
->setDefault('include_ancestors', true)
;
return $this->get('projects/'.self::encodePath($project_id).'/iterations', $resolver->resolve($parameters));
}
/**
* Gets a list of all discussion items for a single commit.
*
* Example:
* - https://gitlab.com/gitlab-org/gitlab/-/commit/695c29abcf7dc2eabde8d59869abcea0923ce8fa#note_334686748
* - https://gitlab.com/api/v4/projects/gitlab-org%2Fgitlab/repository/commits/695c29abcf7dc2eabde8d59869abcea0923ce8fa/discussions
*
* @see https://docs.gitlab.com/ee/api/discussions.html#list-project-commit-discussion-items
*
* @param int|string $project_id
* @param string $commit_id
*
* @return mixed
*/
public function getRepositoryCommitDiscussions($project_id, string $commit_id)
{
return $this->get($this->getProjectPath($project_id, 'repository/commits/'.self::encodePath($commit_id)).'/discussions');
}
/**
* @param int|string $project_id
* @param string $url
* @param array $parameters
*
* @return mixed
*/
public function addHook($project_id, string $url, array $parameters = [])
{
if (0 === \count($parameters)) {
$parameters = ['push_events' => true];
}
$parameters['url'] = $url;
return $this->post($this->getProjectPath($project_id, 'hooks'), $parameters);
}
/**
* @param int|string $project_id
* @param int $hook_id
* @param array $parameters
*
* @return mixed
*/
public function updateHook($project_id, int $hook_id, array $parameters)
{
return $this->put($this->getProjectPath($project_id, 'hooks/'.self::encodePath($hook_id)), $parameters);
}
/**
* @param int|string $project_id
* @param int $hook_id
*
* @return mixed
*/
public function removeHook($project_id, int $hook_id)
{
return $this->delete($this->getProjectPath($project_id, 'hooks/'.self::encodePath($hook_id)));
}
/**
* @param int|string $project_id
* @param mixed $namespace
*
* @return mixed
*/
public function transfer($project_id, $namespace)
{
return $this->put($this->getProjectPath($project_id, 'transfer'), ['namespace' => $namespace]);
}
/**
* @param int|string $project_id
*
* @return mixed
*/
public function deployKeys($project_id)
{
return $this->get($this->getProjectPath($project_id, 'deploy_keys'));
}
/**
* @param int|string $project_id
* @param int $key_id
*
* @return mixed
*/
public function deployKey($project_id, int $key_id)
{
return $this->get($this->getProjectPath($project_id, 'deploy_keys/'.self::encodePath($key_id)));
}
/**
* @param int|string $project_id
* @param string $title
* @param string $key
* @param bool $canPush
*
* @return mixed
*/
public function addDeployKey($project_id, string $title, string $key, bool $canPush = false)
{
return $this->post($this->getProjectPath($project_id, 'deploy_keys'), [
'title' => $title,
'key' => $key,
'can_push' => $canPush,
]);
}
/**
* @param int|string $project_id
* @param int $key_id
*
* @return mixed
*/
public function deleteDeployKey($project_id, int $key_id)
{
return $this->delete($this->getProjectPath($project_id, 'deploy_keys/'.self::encodePath($key_id)));
}
/**
* @param int|string $project_id
* @param int $key_id
*
* @return mixed
*/
public function enableDeployKey($project_id, int $key_id)
{
return $this->post($this->getProjectPath($project_id, 'deploy_keys/'.self::encodePath($key_id).'/enable'));
}
/**
* @param int|string $project_id
* @param bool|null $active
*
* @return mixed
*/
public function deployTokens($project_id, bool $active = null)
{
return $this->get($this->getProjectPath($project_id, 'deploy_tokens'), (null !== $active) ? ['active' => $active] : []);
}
/**
* @param int|string $project_id
* @param array $parameters {
*
* @var string $name the name of the deploy token
* @var \DateTimeInterface $expires_at expiration date for the deploy token, does not expire if no value is provided
* @var string $username the username for the deploy token
* @var array $scopes the scopes, one or many of: read_repository, read_registry, write_registry, read_package_registry, write_package_registry
* }
*
* @return mixed
*/
public function createDeployToken($project_id, array $parameters = [])
{
$resolver = $this->createOptionsResolver();
$datetimeNormalizer = function (Options $resolver, \DateTimeInterface $value): string {
return $value->format('c');
};
$resolver->define('name')
->required()
;
$resolver->define('scopes')
->required()
->allowedTypes('array')
->allowedValues(function ($scopes) {
$allowed = ['read_repository', 'read_registry', 'write_registry', 'read_package_registry', 'write_package_registry'];
foreach ($scopes as $scope) {
if (!\in_array($scope, $allowed, true)) {
return false;
}
}
return true;
})
;
$resolver->setDefined('username')
->setAllowedTypes('username', 'string')
;
$resolver->setDefined('expires_at')
->setAllowedTypes('expires_at', \DateTimeInterface::class)
->setNormalizer('expires_at', $datetimeNormalizer)
;
return $this->post($this->getProjectPath($project_id, 'deploy_tokens'), $resolver->resolve($parameters));
}
/**
* @param int|string $project_id
* @param int $token_id
*
* @return mixed
*/
public function deleteDeployToken($project_id, int $token_id)
{
return $this->delete($this->getProjectPath($project_id, 'deploy_tokens/'.self::encodePath($token_id)));
}
/**
* @param int|string $project_id
* @param array $parameters {
*
* @var string $action include only events of a particular action type
* @var string $target_type include only events of a particular target type
* @var \DateTimeInterface $before include only events created before a particular date
* @var \DateTimeInterface $after include only events created after a particular date
* @var string $sort Sort events in asc or desc order by created_at (default is desc)
* }
*
* @return mixed
*/
public function events($project_id, array $parameters = [])
{
$resolver = $this->createOptionsResolver();
$datetimeNormalizer = function (Options $resolver, \DateTimeInterface $value): string {
return $value->format('Y-m-d');
};
$resolver->setDefined('action')
->setAllowedValues('action', ['created', 'updated', 'closed', 'reopened', 'pushed', 'commented', 'merged', 'joined', 'left', 'destroyed', 'expired'])
;
$resolver->setDefined('target_type')
->setAllowedValues('target_type', ['issue', 'milestone', 'merge_request', 'note', 'project', 'snippet', 'user'])
;
$resolver->setDefined('before')
->setAllowedTypes('before', \DateTimeInterface::class)
->setNormalizer('before', $datetimeNormalizer);
$resolver->setDefined('after')
->setAllowedTypes('after', \DateTimeInterface::class)
->setNormalizer('after', $datetimeNormalizer)
;
$resolver->setDefined('sort')
->setAllowedValues('sort', ['asc', 'desc'])
;
return $this->get($this->getProjectPath($project_id, 'events'), $resolver->resolve($parameters));
}
/**
* @param int|string $project_id
* @param array $parameters
*
* @return mixed
*/
public function labels($project_id, array $parameters = [])
{
$resolver = $this->createOptionsResolver();
return $this->get($this->getProjectPath($project_id, 'labels'), $resolver->resolve($parameters));
}
/**
* @param int|string $project_id
* @param array $parameters
*
* @return mixed
*/
public function addLabel($project_id, array $parameters)
{
return $this->post($this->getProjectPath($project_id, 'labels'), $parameters);
}
/**
* @param int|string $project_id
* @param int $label_id
* @param array $parameters
*
* @return mixed
*/
public function updateLabel($project_id, int $label_id, array $parameters)
{
return $this->put($this->getProjectPath($project_id, 'labels/'.self::encodePath($label_id)), $parameters);
}
/**
* @param int|string $project_id
* @param int $label_id
*
* @return mixed
*/
public function removeLabel($project_id, int $label_id)
{
return $this->delete($this->getProjectPath($project_id, 'labels/'.self::encodePath($label_id)));
}
/**
* Get languages used in a project with percentage value.
*
* @param int|string $project_id
*
* @return mixed
*/
public function languages($project_id)
{
return $this->get($this->getProjectPath($project_id, 'languages'));
}
/**
* @param int|string $project_id
* @param array $parameters
*
* @return mixed
*/
public function forks($project_id, array $parameters = [])
{
$resolver = $this->createOptionsResolver();
return $this->get($this->getProjectPath($project_id, 'forks'), $resolver->resolve($parameters));
}
/**
* @param int|string $project_id
* @param array $parameters {
*
* @var string $namespace The ID or path of the namespace that the project will be forked to
* @var string $path The path of the forked project (optional)
* @var string $name The name of the forked project (optional)
* }
*
* @return mixed
*/
public function fork($project_id, array $parameters = [])
{
$resolver = new OptionsResolver();
$resolver->setDefined(['namespace', 'path', 'name']);
$resolved = $resolver->resolve($parameters);
return $this->post($this->getProjectPath($project_id, 'fork'), $resolved);
}
/**
* @param int|string $project_id
* @param int|string $forked_project_id
*
* @return mixed
*/
public function createForkRelation($project_id, $forked_project_id)
{
return $this->post($this->getProjectPath($project_id, 'fork/'.self::encodePath($forked_project_id)));
}
/**
* @param int|string $project_id
*
* @return mixed
*/
public function removeForkRelation($project_id)
{
return $this->delete($this->getProjectPath($project_id, 'fork'));
}
/**
* @param int|string $project_id
* @param string $service_name
* @param array $parameters
*
* @return mixed
*/
public function setService($project_id, string $service_name, array $parameters = [])
{
return $this->put($this->getProjectPath($project_id, 'services/'.self::encodePath($service_name)), $parameters);
}
/**
* @param int|string $project_id
* @param string $service_name
*
* @return mixed
*/
public function removeService($project_id, string $service_name)
{
return $this->delete($this->getProjectPath($project_id, 'services/'.self::encodePath($service_name)));
}
/**
* @param int|string $project_id
* @param array $parameters
*
* @return mixed
*/
public function variables($project_id, array $parameters = [])
{
$resolver = $this->createOptionsResolver();
return $this->get($this->getProjectPath($project_id, 'variables'), $resolver->resolve($parameters));
}
/**
* @param int|string $project_id
* @param string $key
*
* @return mixed
*/
public function variable($project_id, string $key)
{
return $this->get($this->getProjectPath($project_id, 'variables/'.self::encodePath($key)));
}
/**
* @param int|string $project_id
* @param string $key
* @param string $value
* @param bool|null $protected
* @param string|null $environment_scope
* @param array<string,mixed> $parameters {
*
* @var string $variable_type env_var (default) or file
* }
*
* @return mixed
*/
public function addVariable($project_id, string $key, string $value, ?bool $protected = null, ?string $environment_scope = null, array $parameters = [])
{
$payload = [
'key' => $key,
'value' => $value,
];
if ($protected) {
$payload['protected'] = $protected;
}
if ($environment_scope) {
$payload['environment_scope'] = $environment_scope;
}
$payload = \array_merge($parameters, $payload);
return $this->post($this->getProjectPath($project_id, 'variables'), $payload);
}
/**
* @param int|string $project_id
* @param string $key
* @param string $value
* @param bool|null $protected
* @param string|null $environment_scope
* @param array<string,mixed> $parameters {
*
* @var string $variable_type env_var (default) or file
*}
*
* @return mixed
*/
public function updateVariable($project_id, string $key, string $value, ?bool $protected = null, ?string $environment_scope = null, array $parameters = [])
{
$payload = [
'value' => $value,
];
if ($protected) {
$payload['protected'] = $protected;
}
if ($environment_scope) {
$payload['environment_scope'] = $environment_scope;
}
$payload = \array_merge($parameters, $payload);
return $this->put($this->getProjectPath($project_id, 'variables/'.self::encodePath($key)), $payload);
}
/**
* @param int|string $project_id
* @param string $key
*
* @return mixed
*/
public function removeVariable($project_id, string $key)
{
return $this->delete($this->getProjectPath($project_id, 'variables/'.self::encodePath($key)));
}
/**
* @param int|string $project_id
* @param string $file
*
* @return mixed
*/
public function uploadFile($project_id, string $file)
{
return $this->post($this->getProjectPath($project_id, 'uploads'), [], [], ['file' => $file]);
}
/**
* @param int|string $project_id
* @param string $file
*
* @return mixed
*/
public function uploadAvatar($project_id, string $file)
{
return $this->put('projects/'.self::encodePath($project_id), [], [], ['avatar' => $file]);
}
/**
* @param int|string $project_id
* @param array $parameters
*
* @return mixed
*/
public function deployments($project_id, array $parameters = [])
{
$resolver = $this->createOptionsResolver();
return $this->get($this->getProjectPath($project_id, 'deployments'), $resolver->resolve($parameters));
}
/**
* @param int|string $project_id
* @param int $deployment_id
*
* @return mixed
*/
public function deployment($project_id, int $deployment_id)
{
return $this->get($this->getProjectPath($project_id, 'deployments/'.self::encodePath($deployment_id)));
}
/**
* @param int|string $project_id
* @param array $parameters
*
* @return mixed
*/
public function addShare($project_id, array $parameters = [])
{
$resolver = $this->createOptionsResolver();
$datetimeNormalizer = function (OptionsResolver $optionsResolver, \DateTimeInterface $value): string {
return $value->format('Y-m-d');
};
$resolver->setRequired('group_id')
->setAllowedTypes('group_id', 'int');
$resolver->setRequired('group_access')
->setAllowedTypes('group_access', 'int')
->setAllowedValues('group_access', [0, 10, 20, 30, 40, 50]);
$resolver->setDefined('expires_at')
->setAllowedTypes('expires_at', \DateTimeInterface::class)
->setNormalizer('expires_at', $datetimeNormalizer)
;
return $this->post($this->getProjectPath($project_id, 'share'), $resolver->resolve($parameters));
}
/**
* @param int|string $project_id
* @param int|string $group_id
*
* @return mixed
*/
public function removeShare($project_id, $group_id)
{
return $this->delete($this->getProjectPath($project_id, 'share/'.$group_id));
}
/**
* @param int|string $project_id
*
* @return mixed
*/
public function badges($project_id)
{
return $this->get($this->getProjectPath($project_id, 'badges'));
}
/**
* @param int|string $project_id
* @param int $badge_id
*
* @return mixed
*/
public function badge($project_id, int $badge_id)
{
return $this->get($this->getProjectPath($project_id, 'badges/'.self::encodePath($badge_id)));
}
/**
* @param int|string $project_id
* @param array $parameters
*
* @return mixed
*/
public function addBadge($project_id, array $parameters = [])
{
return $this->post($this->getProjectPath($project_id, 'badges'), $parameters);
}
/**
* @param int|string $project_id
* @param int $badge_id
*
* @return mixed
*/
public function removeBadge($project_id, int $badge_id)
{
return $this->delete($this->getProjectPath($project_id, 'badges/'.self::encodePath($badge_id)));
}
/**
* @param int|string $project_id
* @param int $badge_id
* @param array $parameters
*
* @return mixed
*/
public function updateBadge($project_id, int $badge_id, array $parameters = [])
{
return $this->put($this->getProjectPath($project_id, 'badges/'.self::encodePath($badge_id)), $parameters);
}
/**
* @param int|string $project_id
* @param array $parameters
*
* @return mixed
*/
public function protectedBranches($project_id, array $parameters = [])
{
return $this->get('projects/'.self::encodePath($project_id).'/protected_branches');
}
/**
* @param int|string $project_id
* @param array $parameters
*
* @return mixed
*/
public function addProtectedBranch($project_id, array $parameters = [])
{
return $this->post($this->getProjectPath($project_id, 'protected_branches'), $parameters);
}
/**
* @param int|string $project_id
* @param string $branch_name
*
* @return mixed
*/
public function deleteProtectedBranch($project_id, string $branch_name)
{
return $this->delete($this->getProjectPath($project_id, 'protected_branches/'.self::encodePath($branch_name)));
}
/**
* @param int|string $project_id
*
* @return mixed
*/
public function approvalsConfiguration($project_id)
{
return $this->get('projects/'.self::encodePath($project_id).'/approvals');
}
/**
* @param int|string $project_id
*
* @return mixed
*/
public function approvalsRules($project_id)
{
return $this->get('projects/'.self::encodePath($project_id).'/approval_rules');
}
/**
* @param int|string $project_id
* @param array $parameters
*
* @return mixed
*/
public function createApprovalsRule($project_id, array $parameters = [])
{
return $this->post('projects/'.self::encodePath($project_id).'/approval_rules/', $parameters);
}
/**
* @param int|string $project_id
* @param int $approval_rule_id
* @param array $parameters
*
* @return mixed
*/
public function updateApprovalsRule($project_id, int $approval_rule_id, array $parameters = [])
{
return $this->put('projects/'.self::encodePath($project_id).'/approval_rules/'.self::encodePath($approval_rule_id), $parameters);
}
/**
* @param int|string $project_id
* @param int $approval_rule_id
*
* @return mixed
*/
public function deleteApprovalsRule($project_id, int $approval_rule_id)
{
return $this->delete('projects/'.self::encodePath($project_id).'/approval_rules/'.self::encodePath($approval_rule_id));
}
/**
* @param int|string $project_id
*
* @return mixed
*/
public function deleteAllMergedBranches($project_id)
{
return $this->delete($this->getProjectPath($project_id, 'repository/merged_branches'));
}
/**
* @param int|string $project_id
*
* @return mixed
*/
public function projectAccessTokens($project_id)
{
return $this->get($this->getProjectPath($project_id, 'access_tokens'));
}
/**
* @param int|string $project_id
* @param int|string $token_id
*
* @return mixed
*/
public function projectAccessToken($project_id, $token_id)
{
return $this->get($this->getProjectPath($project_id, 'access_tokens/'.self::encodePath($token_id)));
}
/**
* @param int|string $project_id
* @param array $parameters {
*
* @var string $name the name of the project access token
* @var array $scopes the scopes, one or many of: api, read_api, read_registry, write_registry, read_repository, write_repository
* @var \DateTimeInterface $expires_at the token expires at midnight UTC on that date
* }
*
* @return mixed
*/
public function createProjectAccessToken($project_id, array $parameters = [])
{
$resolver = $this->createOptionsResolver();
$datetimeNormalizer = function (Options $resolver, \DateTimeInterface $value): string {
return $value->format('Y-m-d');
};
$resolver->define('name')
->required()
;
$resolver->define('scopes')
->required()
->allowedTypes('array')
->allowedValues(function ($scopes) {
$allowed = ['api', 'read_api', 'read_registry', 'write_registry', 'read_repository', 'write_repository'];
foreach ($scopes as $scope) {
if (!\in_array($scope, $allowed, true)) {
return false;
}
}
return true;
})
;
$resolver->setDefined('expires_at')
->setAllowedTypes('expires_at', \DateTimeInterface::class)
->setNormalizer('expires_at', $datetimeNormalizer)
;
return $this->post($this->getProjectPath($project_id, 'access_tokens'), $resolver->resolve($parameters));
}
/**
* @param int|string $project_id
* @param int|string $token_id
*
* @return mixed
*/
public function deleteProjectAccessToken($project_id, $token_id)
{
return $this->delete($this->getProjectPath($project_id, 'access_tokens/'.$token_id));
}
/**
* @param int|string $project_id
*
* @return mixed
*/
public function protectedTags($project_id)
{
return $this->get('projects/'.self::encodePath($project_id).'/protected_tags');
}
/**
* @param int|string $project_id
* @param string $tag_name
*
* @return mixed
*/
public function protectedTag($project_id, string $tag_name)
{
return $this->get('projects/'.self::encodePath($project_id).'/protected_tags/'.self::encodePath($tag_name));
}
/**
* @param int|string $project_id
* @param array $parameters
*
* @return mixed
*/
public function addProtectedTag($project_id, array $parameters = [])
{
$resolver = new OptionsResolver();
$resolver->setDefined('name')
->setAllowedTypes('name', 'string')
->setRequired('name')
;
$resolver->setDefined('create_access_level')
->setAllowedTypes('create_access_level', 'int')
->setAllowedValues('create_access_level', [0, 30, 40])
;
$resolver->setDefined('allowed_to_create')
->setAllowedTypes('allowed_to_create', 'array')
->setAllowedValues('allowed_to_create', function (array $value) {
$keys = \array_keys((array) \call_user_func_array('array_merge', $value));
$diff = \array_diff($keys, ['user_id', 'group_id', 'access_level']);
$values = \array_map(function ($item) {
return \array_values($item)[0] ?? '';
}, $value);
$integer = \count($values) === \count(\array_filter($values, 'is_int'));
return \count($value) > 0 && 0 === \count($diff) && $integer;
})
;
return $this->post($this->getProjectPath($project_id, 'protected_tags'), $resolver->resolve($parameters));
}
/**
* @param int|string $project_id
* @param string $tag_name
*
* @return mixed
*/
public function deleteProtectedTag($project_id, string $tag_name)
{
return $this->delete($this->getProjectPath($project_id, 'protected_tags/'.self::encodePath($tag_name)));
}
}