1
0
Fork 0

Introduce gitlab-protocol option to force the gitlab repos to use https or git protocol (#9401)

pull/9928/head
Brad Jones 2021-05-27 15:05:53 -06:00 committed by GitHub
parent c8de960018
commit dd625669e8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 67 additions and 6 deletions

View File

@ -86,6 +86,11 @@ of their API. Composer may prompt for credentials when needed, but these can als
manually set. Read more on how to get an OAuth token for GitHub and cli syntax manually set. Read more on how to get an OAuth token for GitHub and cli syntax
[here](articles/authentication-for-private-packages.md#github-oauth). [here](articles/authentication-for-private-packages.md#github-oauth).
## gitlab-domains
Defaults to `["gitlab.com"]`. A list of domains of GitLab servers.
This is used if you use the `gitlab` repository type.
## gitlab-oauth ## gitlab-oauth
A list of domain names and oauth keys. For example using `{"gitlab.com": A list of domain names and oauth keys. For example using `{"gitlab.com":
@ -109,6 +114,16 @@ gitlab.com the domain names must be also specified with the
`api` or `read_api` scope. `api` or `read_api` scope.
Further info can also be found [here](articles/authentication-for-private-packages.md#gitlab-token) Further info can also be found [here](articles/authentication-for-private-packages.md#gitlab-token)
## gitlab-protocol
A protocol to force use of when creating a repository URL for the `source`
value of the package metadata. One of `git` or `http`. (`https` is treated
as a synonym for `http`.) Helpful when working with projects referencing
private repositories which will later be cloned in GitLab CI jobs with a
[GitLab CI job token](https://docs.gitlab.com/ee/user/project/new_ci_build_permissions_model.html#dependent-repositories)
using HTTP basic auth. By default, Composer will generate a git-over-SSH
URL for private repositories and HTTP(S) only for public.
## disable-tls ## disable-tls
Defaults to `false`. If set to true all HTTPS URLs will be tried with HTTP Defaults to `false`. If set to true all HTTPS URLs will be tried with HTTP
@ -283,11 +298,6 @@ used for GitHub Enterprise setups.
Defaults to `true`. If `false`, the OAuth tokens created to access the Defaults to `true`. If `false`, the OAuth tokens created to access the
github API will have a date instead of the machine hostname. github API will have a date instead of the machine hostname.
## gitlab-domains
Defaults to `["gitlab.com"]`. A list of domains of GitLab servers.
This is used if you use the `gitlab` repository type.
## use-github-api ## use-github-api
Defaults to `true`. Similar to the `no-api` key on a specific repository, Defaults to `true`. Similar to the `no-api` key on a specific repository,

View File

@ -31,6 +31,7 @@ class Config
'preferred-install' => 'dist', 'preferred-install' => 'dist',
'notify-on-install' => true, 'notify-on-install' => true,
'github-protocols' => array('https', 'ssh', 'git'), 'github-protocols' => array('https', 'ssh', 'git'),
'gitlab-protocol' => null,
'vendor-dir' => 'vendor', 'vendor-dir' => 'vendor',
'bin-dir' => '{$vendor-dir}/bin', 'bin-dir' => '{$vendor-dir}/bin',
'cache-dir' => '{$home}/cache', 'cache-dir' => '{$home}/cache',

View File

@ -60,6 +60,13 @@ class GitLabDriver extends VcsDriver
*/ */
protected $gitDriver = null; protected $gitDriver = null;
/**
* Protocol to force use of for repository URLs.
*
* @var string One of ssh, http
*/
protected $protocol;
/** /**
* Defaults to true unless we can make sure it is public * Defaults to true unless we can make sure it is public
* *
@ -97,6 +104,14 @@ class GitLabDriver extends VcsDriver
; ;
$this->originUrl = self::determineOrigin($configuredDomains, $guessedDomain, $urlParts, $match['port']); $this->originUrl = self::determineOrigin($configuredDomains, $guessedDomain, $urlParts, $match['port']);
if ($protocol = $this->config->get('gitlab-protocol')) {
// https treated as a synonym for http.
if (!in_array($protocol, array('git', 'http', 'https'))) {
throw new \RuntimeException('gitlab-protocol must be one of git, http.');
}
$this->protocol = $protocol === 'git' ? 'ssh' : 'http';
}
if (false !== strpos($this->originUrl, ':') || false !== strpos($this->originUrl, '/')) { if (false !== strpos($this->originUrl, ':') || false !== strpos($this->originUrl, '/')) {
$this->hasNonstandardOrigin = true; $this->hasNonstandardOrigin = true;
} }
@ -210,6 +225,9 @@ class GitLabDriver extends VcsDriver
*/ */
public function getRepositoryUrl() public function getRepositoryUrl()
{ {
if ($this->protocol) {
return $this->project["{$this->protocol}_url_to_repo"];
}
return $this->isPrivate ? $this->project['ssh_url_to_repo'] : $this->project['http_url_to_repo']; return $this->isPrivate ? $this->project['ssh_url_to_repo'] : $this->project['http_url_to_repo'];
} }
@ -360,7 +378,7 @@ class GitLabDriver extends VcsDriver
if (isset($this->project['visibility'])) { if (isset($this->project['visibility'])) {
$this->isPrivate = $this->project['visibility'] !== 'public'; $this->isPrivate = $this->project['visibility'] !== 'public';
} else { } else {
// client is not authendicated, therefore repository has to be public // client is not authenticated, therefore repository has to be public
$this->isPrivate = false; $this->isPrivate = false;
} }
} }

View File

@ -561,6 +561,38 @@ JSON;
$driver->initialize(); $driver->initialize();
} }
public function testProtocolOverrideRepositoryUrlGeneration()
{
// @link http://doc.gitlab.com/ce/api/projects.html#get-single-project
$projectData = <<<JSON
{
"id": 17,
"default_branch": "mymaster",
"visibility": "private",
"http_url_to_repo": "https://gitlab.com/mygroup/myproject.git",
"ssh_url_to_repo": "git@gitlab.com:mygroup/myproject.git",
"last_activity_at": "2014-12-01T09:17:51.000+01:00",
"name": "My Project",
"name_with_namespace": "My Group / My Project",
"path": "myproject",
"path_with_namespace": "mygroup/myproject",
"web_url": "https://gitlab.com/mygroup/myproject"
}
JSON;
$apiUrl = 'https://gitlab.com/api/v4/projects/mygroup%2Fmyproject';
$url = 'git@gitlab.com:mygroup/myproject';
$this->mockResponse($apiUrl, array(), $projectData)
->shouldBeCalledTimes(1)
;
$config = clone $this->config;
$config->merge(array('config' => array('gitlab-protocol' => 'http')));
$driver = new GitLabDriver(array('url' => $url), $this->io->reveal(), $config, $this->httpDownloader->reveal(), $this->process->reveal());
$driver->initialize();
$this->assertEquals('https://gitlab.com/mygroup/myproject.git', $driver->getRepositoryUrl(), 'Repository URL matches config request for http not git');
}
private function mockResponse($url, $options, $return) private function mockResponse($url, $options, $return)
{ {
return $this->httpDownloader return $this->httpDownloader