Browse Source

Add auth for private, non-GitHub repos (#2826)

Tim Roberson 11 years ago
parent
commit
db1e4b7574
1 changed files with 27 additions and 2 deletions
  1. 27 2
      src/Composer/Repository/Vcs/GitDriver.php

+ 27 - 2
src/Composer/Repository/Vcs/GitDriver.php

@@ -71,9 +71,34 @@ class GitDriver extends VcsDriver
 
                     if (0 !== $this->process->execute('git --version', $ignoredOutput)) {
                         throw new \RuntimeException('Failed to clone '.$this->url.', git was not found, check that it is installed and in your PATH env.' . "\n\n" . $this->process->getErrorOutput());
+                    } elseif (
+                        $this->io->isInteractive() &&
+                        preg_match('{(https?://)([^/]+)(.*)$}i', $this->url, $match) &&
+                        strpos($output, 'fatal: Authentication failed') !== false
+                    ) {
+                        if ($this->io->hasAuthentication($match[2])) {
+                            $auth = $this->io->getAuthentication($match[2]);
+                        } else {
+                            $this->io->write($this->url.' requires Authentication');
+                            $auth = array(
+                                'username'  => $this->io->ask('Username: '),
+                                'password'  => $this->io->askAndHideAnswer('Password: '),
+                            );
+                        }
+
+                        $url = $match[1].urlencode($auth['username']).':'.urlencode($auth['password']).'@'.$match[2].$match[3];
+
+                        $command = sprintf('git clone --mirror %s %s', escapeshellarg($url), escapeshellarg($this->repoDir));
+
+                        if (0 === $this->process->execute($command, $output)) {
+                            $this->io->setAuthentication($match[2], $auth['username'], $auth['password']);
+                        } else {
+                            $output = $this->process->getErrorOutput();
+                            throw new \RuntimeException('Failed to clone '.$this->url.', could not read packages from it' . "\n\n" .$output);
+                        }
+                    } else {
+                        throw new \RuntimeException('Failed to clone '.$this->url.', could not read packages from it' . "\n\n" .$output);
                     }
-
-                    throw new \RuntimeException('Failed to clone '.$this->url.', could not read packages from it' . "\n\n" .$output);
                 }
             }
         }