Browse Source

Fallback to https directly if ssh proto is disabled on github private repos, fixes #2786

Jordi Boggiano 10 years ago
parent
commit
0c775e997e
1 changed files with 6 additions and 2 deletions
  1. 6 2
      src/Composer/Util/Git.php

+ 6 - 2
src/Composer/Util/Git.php

@@ -52,9 +52,10 @@ class Git
             }
         }
 
+        $protocols = $this->config->get('github-protocols');
+
         // public github, autoswitch protocols
         if (preg_match('{^(?:https?|git)://'.self::getGitHubDomainsRegex($this->config).'/(.*)}', $url, $match)) {
-            $protocols = $this->config->get('github-protocols');
             if (!is_array($protocols)) {
                 throw new \RuntimeException('Config value "github-protocols" must be an array, got '.gettype($protocols));
             }
@@ -79,8 +80,11 @@ class Git
             $this->throwException('Failed to clone ' . self::sanitizeUrl($url) .' via '.implode(', ', $protocols).' protocols, aborting.' . "\n\n" . implode("\n", $messages), $url);
         }
 
+        // if we have a private github url and the ssh protocol is disabled then we skip it and directly fallback to https
+        $bypassSshForGitHub = preg_match('{^git@'.self::getGitHubDomainsRegex($this->config).':(.+?)\.git$}i', $url) && !in_array('ssh', $protocols, true);
+
         $command = call_user_func($commandCallable, $url);
-        if (0 !== $this->process->execute($command, $ignoredOutput, $cwd)) {
+        if ($bypassSshForGitHub || 0 !== $this->process->execute($command, $ignoredOutput, $cwd)) {
             // private github repository without git access, try https with auth
             if (preg_match('{^git@'.self::getGitHubDomainsRegex($this->config).':(.+?)\.git$}i', $url, $match)) {
                 if (!$this->io->hasAuthentication($match[1])) {