|
@@ -68,9 +68,9 @@ class GitLabDriver extends VcsDriver
|
|
|
private $isPrivate = true;
|
|
|
|
|
|
/**
|
|
|
- * @var int port number
|
|
|
+ * @var bool true if the origin has a port number or a path component in it
|
|
|
*/
|
|
|
- protected $portNumber;
|
|
|
+ private $hasNonstandardOrigin = false;
|
|
|
|
|
|
const URL_REGEX = '#^(?:(?P<scheme>https?)://(?P<domain>.+?)(?::(?P<port>[0-9]+))?/|git@(?P<domain2>[^:]+):)(?P<parts>.+)/(?P<repo>[^/]+?)(?:\.git|/)?$#';
|
|
|
|
|
@@ -95,11 +95,10 @@ class GitLabDriver extends VcsDriver
|
|
|
? $match['scheme']
|
|
|
: (isset($this->repoConfig['secure-http']) && $this->repoConfig['secure-http'] === false ? 'http' : 'https')
|
|
|
;
|
|
|
- $this->originUrl = $this->determineOrigin($configuredDomains, $guessedDomain, $urlParts);
|
|
|
+ $this->originUrl = $this->determineOrigin($configuredDomains, $guessedDomain, $urlParts, $match['port']);
|
|
|
|
|
|
- if (!empty($match['port']) && true === is_numeric($match['port'])) {
|
|
|
- // If it is an HTTP based URL, and it has a port
|
|
|
- $this->portNumber = (int) $match['port'];
|
|
|
+ if (false !== strpos($this->originUrl, ':') || false !== strpos($this->originUrl, '/')) {
|
|
|
+ $this->hasNonstandardOrigin = true;
|
|
|
}
|
|
|
|
|
|
$this->namespace = implode('/', $urlParts);
|
|
@@ -260,10 +259,7 @@ class GitLabDriver extends VcsDriver
|
|
|
*/
|
|
|
public function getApiUrl()
|
|
|
{
|
|
|
- $domainName = $this->originUrl;
|
|
|
- $portNumber = (true === is_numeric($this->portNumber)) ? sprintf(':%s', $this->portNumber) : '';
|
|
|
-
|
|
|
- return $this->scheme.'://'.$domainName.$portNumber.'/api/v4/projects/'.$this->urlEncodeAll($this->namespace).'%2F'.$this->urlEncodeAll($this->repository);
|
|
|
+ return $this->scheme.'://'.$this->originUrl.'/api/v4/projects/'.$this->urlEncodeAll($this->namespace).'%2F'.$this->urlEncodeAll($this->repository);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -362,6 +358,10 @@ class GitLabDriver extends VcsDriver
|
|
|
*/
|
|
|
protected function generateSshUrl()
|
|
|
{
|
|
|
+ if ($this->hasNonstandardOrigin) {
|
|
|
+ return 'ssh://git@'.$this->originUrl.'/'.$this->namespace.'/'.$this->repository.'.git';
|
|
|
+ }
|
|
|
+
|
|
|
return 'git@' . $this->originUrl . ':'.$this->namespace.'/'.$this->repository.'.git';
|
|
|
}
|
|
|
|
|
@@ -464,7 +464,7 @@ class GitLabDriver extends VcsDriver
|
|
|
$guessedDomain = !empty($match['domain']) ? $match['domain'] : $match['domain2'];
|
|
|
$urlParts = explode('/', $match['parts']);
|
|
|
|
|
|
- if (false === self::determineOrigin((array) $config->get('gitlab-domains'), $guessedDomain, $urlParts)) {
|
|
|
+ if (false === self::determineOrigin((array) $config->get('gitlab-domains'), $guessedDomain, $urlParts, $match['port'])) {
|
|
|
return false;
|
|
|
}
|
|
|
|
|
@@ -495,16 +495,16 @@ class GitLabDriver extends VcsDriver
|
|
|
* @param array $urlParts
|
|
|
* @return bool|string
|
|
|
*/
|
|
|
- private static function determineOrigin(array $configuredDomains, $guessedDomain, array &$urlParts)
|
|
|
+ private static function determineOrigin(array $configuredDomains, $guessedDomain, array &$urlParts, $portNumber)
|
|
|
{
|
|
|
- if (in_array($guessedDomain, $configuredDomains)) {
|
|
|
+ if (in_array($guessedDomain, $configuredDomains) || ($portNumber && in_array($guessedDomain.':'.$portNumber, $configuredDomains))) {
|
|
|
return $guessedDomain;
|
|
|
}
|
|
|
|
|
|
while (null !== ($part = array_shift($urlParts))) {
|
|
|
$guessedDomain .= '/' . $part;
|
|
|
|
|
|
- if (in_array($guessedDomain, $configuredDomains)) {
|
|
|
+ if (in_array($guessedDomain, $configuredDomains) || ($portNumber && in_array(preg_replace('{/}', ':'.$portNumber.'/', $guessedDomain, 1), $configuredDomains))) {
|
|
|
return $guessedDomain;
|
|
|
}
|
|
|
}
|