Introduce gitlab-protocol option to force the gitlab repos to use https or git protocol (#9401)
parent
c8de960018
commit
dd625669e8
|
@ -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,
|
||||||
|
|
|
@ -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',
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue