Ejemplo n.º 1
0
 /**
  * {@inheritDoc}
  */
 public function initialize()
 {
     if (Filesystem::isLocalPath($this->url)) {
         $this->url = preg_replace('{[\\/]\\.git/?$}', '', $this->url);
         $this->repoDir = $this->url;
         $cacheUrl = realpath($this->url);
     } else {
         $this->repoDir = $this->config->get('cache-vcs-dir') . '/' . preg_replace('{[^a-z0-9.]}i', '-', $this->url) . '/';
         GitUtil::cleanEnv();
         $fs = new Filesystem();
         $fs->ensureDirectoryExists(dirname($this->repoDir));
         if (!is_writable(dirname($this->repoDir))) {
             throw new \RuntimeException('Can not clone ' . $this->url . ' to access package information. The "' . dirname($this->repoDir) . '" directory is not writable by the current user.');
         }
         if (preg_match('{^ssh://[^@]+@[^:]+:[^0-9]+}', $this->url)) {
             throw new \InvalidArgumentException('The source URL ' . $this->url . ' is invalid, ssh URLs should have a port number after ":".' . "\n" . 'Use ssh://git@example.com:22/path or just git@example.com:path if you do not want to provide a password or custom port.');
         }
         $gitUtil = new GitUtil($this->io, $this->config, $this->process, $fs);
         // update the repo if it is a valid git repository
         if (is_dir($this->repoDir) && 0 === $this->process->execute('git rev-parse --git-dir', $output, $this->repoDir) && trim($output) === '.') {
             try {
                 $commandCallable = function ($url) {
                     return sprintf('git remote set-url origin %s && git remote update --prune origin', ProcessExecutor::escape($url));
                 };
                 $gitUtil->runCommand($commandCallable, $this->url, $this->repoDir);
             } catch (\Exception $e) {
                 $this->io->writeError('<error>Failed to update ' . $this->url . ', package information from this repository may be outdated (' . $e->getMessage() . ')</error>');
             }
         } else {
             // clean up directory and do a fresh clone into it
             $fs->removeDirectory($this->repoDir);
             $repoDir = $this->repoDir;
             $commandCallable = function ($url) use($repoDir) {
                 return sprintf('git clone --mirror %s %s', ProcessExecutor::escape($url), ProcessExecutor::escape($repoDir));
             };
             $gitUtil->runCommand($commandCallable, $this->url, $this->repoDir, true);
         }
         $cacheUrl = $this->url;
     }
     $this->getTags();
     $this->getBranches();
     $this->cache = new Cache($this->io, $this->config->get('cache-repo-dir') . '/' . preg_replace('{[^a-z0-9.]}i', '-', $cacheUrl));
 }
 /**
  * Clone repository
  *
  * @param PackageInterface $package
  * @param string $path
  * @param string $url
  * @return $this
  */
 protected function cloneRepository(PackageInterface $package, $path, $url)
 {
     $command = $this->getCloneCommand();
     $this->io->write("    Cloning " . $package->getSourceReference());
     $commandCallable = $this->getCloneCommandCallback($path, $package->getSourceReference(), $command);
     $this->gitUtil->runCommand($commandCallable, $url, $path, true);
     if ($url !== $package->getSourceUrl()) {
         $url = $package->getSourceUrl();
         $this->process->execute(sprintf('git remote set-url origin %s', ProcessExecutor::escape($url)), $output, $path);
     }
     $this->setPushUrl($path, $url);
     return $this;
 }