Example #1
0
 public function installProject(IOInterface $io, $packageName, $directory = null, $version = null, $preferSource = false, $installDevPackages = false, $repositoryUrl = null, $disableCustomInstallers = false, $noScripts = false)
 {
     $dm = $this->createDownloadManager($io);
     if ($preferSource) {
         $dm->setPreferSource(true);
     }
     $config = Factory::createConfig();
     if (null === $repositoryUrl) {
         $sourceRepo = new CompositeRepository(Factory::createDefaultRepositories($io, $config));
     } elseif ("json" === pathinfo($repositoryUrl, PATHINFO_EXTENSION)) {
         $sourceRepo = new FilesystemRepository(new JsonFile($repositoryUrl, new RemoteFilesystem($io)));
     } elseif (0 === strpos($repositoryUrl, 'http')) {
         $sourceRepo = new ComposerRepository(array('url' => $repositoryUrl), $io, $config);
     } else {
         throw new \InvalidArgumentException("Invalid repository url given. Has to be a .json file or an http url.");
     }
     $candidates = $sourceRepo->findPackages($packageName, $version);
     if (!$candidates) {
         throw new \InvalidArgumentException("Could not find package {$packageName}" . ($version ? " with version {$version}." : ''));
     }
     if (null === $directory) {
         $parts = explode("/", $packageName, 2);
         $directory = getcwd() . DIRECTORY_SEPARATOR . array_pop($parts);
     }
     // select highest version if we have many
     $package = $candidates[0];
     foreach ($candidates as $candidate) {
         if (version_compare($package->getVersion(), $candidate->getVersion(), '<')) {
             $package = $candidate;
         }
     }
     $io->write('<info>Installing ' . $package->getName() . ' (' . VersionParser::formatVersion($package, false) . ')</info>', true);
     if ($disableCustomInstallers) {
         $io->write('<info>Custom installers have been disabled.</info>');
     }
     if (0 === strpos($package->getPrettyVersion(), 'dev-') && in_array($package->getSourceType(), array('git', 'hg'))) {
         $package->setSourceReference(substr($package->getPrettyVersion(), 4));
     }
     $projectInstaller = new ProjectInstaller($directory, $dm);
     $projectInstaller->install(new InstalledFilesystemRepository(new JsonFile('php://memory')), $package);
     if ($package->getRepository() instanceof NotifiableRepositoryInterface) {
         $package->getRepository()->notifyInstall($package);
     }
     $io->write('<info>Created project in ' . $directory . '</info>', true);
     chdir($directory);
     putenv('COMPOSER_ROOT_VERSION=' . $package->getPrettyVersion());
     $composer = Factory::create($io);
     $installer = Installer::create($io, $composer);
     $installer->setPreferSource($preferSource)->setDevMode($installDevPackages)->setRunScripts(!$noScripts);
     if ($disableCustomInstallers) {
         $installer->disableCustomInstallers();
     }
     $installer->run();
 }
Example #2
0
 public function installProject(IOInterface $io, $packageName, $directory = null, $version = null, $preferSource = false, $repositoryUrl = null)
 {
     $dm = $this->createDownloadManager($io);
     if ($preferSource) {
         $dm->setPreferSource(true);
     }
     if (null === $repositoryUrl) {
         $sourceRepo = new ComposerRepository(array('url' => 'http://packagist.org'));
     } elseif (".json" === substr($repositoryUrl, -5)) {
         $sourceRepo = new FilesystemRepository($repositoryUrl);
     } elseif (0 === strpos($repositoryUrl, 'http')) {
         $sourceRepo = new ComposerRepository(array('url' => $repositoryUrl));
     } else {
         throw new \InvalidArgumentException("Invalid repository url given. Has to be a .json file or an http url.");
     }
     $candidates = $sourceRepo->findPackages($packageName, $version);
     if (!$candidates) {
         throw new \InvalidArgumentException("Could not find package {$packageName}" . ($version ? " with version {$version}." : ''));
     }
     if (null === $directory) {
         $parts = explode("/", $packageName, 2);
         $directory = getcwd() . DIRECTORY_SEPARATOR . array_pop($parts);
     }
     // select highest version if we have many
     $package = $candidates[0];
     foreach ($candidates as $candidate) {
         if (version_compare($package->getVersion(), $candidate->getVersion(), '<')) {
             $package = $candidate;
         }
     }
     $io->write('<info>Installing ' . $package->getName() . ' as new project.</info>', true);
     $projectInstaller = new ProjectInstaller($directory, $dm);
     $projectInstaller->install($package);
     $io->write('<info>Created project into directory ' . $directory . '</info>', true);
     chdir($directory);
     $composer = Factory::create($io);
     $installer = Installer::create($io, $composer);
     $installer->run($preferSource);
 }
Example #3
0
 /**
  * Runs the script: connect to packagist, download everything it can!
  */
 public function run()
 {
     // TODO: each package is there twice. Find why.
     $filesystem = new Filesystem();
     if (file_exists(DOWNLOAD_DIR . "/last_analyzed_package")) {
         $lastAnalyzedPackage = file_get_contents(DOWNLOAD_DIR . "/last_analyzed_package");
     } else {
         $lastAnalyzedPackage = "";
     }
     $providerNames = $this->packagistRepository->getProviderNames();
     // If analyzis is over, let's start from the beginning again.
     if ($lastAnalyzedPackage >= $providerNames[count($providerNames) - 1]) {
         $lastAnalyzedPackage = '';
     }
     $this->logger->debug("Starting script.");
     $found = false;
     sort($providerNames);
     foreach ($providerNames as $packageName) {
         if ($this->forcedPackage && $this->forcedPackage != $packageName) {
             continue;
         } else {
             $found = true;
         }
         if (!$this->forcedPackage && $packageName <= $lastAnalyzedPackage) {
             continue;
         }
         // Let's write the name of the last package we are going to analyze
         // We will use it to start again from next package in case this package fails.
         if (!$this->forcedPackage) {
             file_put_contents(DOWNLOAD_DIR . "/last_analyzed_package", $packageName);
         }
         $this->logger->debug("Analyzing {packageName}.", array("packageName" => $packageName));
         //if ($packageName != '10up/wp_mock') continue;
         //var_dump($packagistRepo->findPackages($packageName));
         $packages = $this->packagistRepository->findPackages($packageName);
         $packages = array_filter($packages, function ($package) use($packageName) {
             return $package->getName() == $packageName;
         });
         // Warning: findPackages uses "whatProvides". For instance: symfony/symonfy provides symfony/finder.
         // When a new version of finder is released, we don't want to remove symfony. Therefore, we need to restrict
         // the packages returned by "findPackages"
         $importantPackages = $this->getImportantVersions($packages);
         // DELETE PACKAGES VERSION BEFORE REINSERTION!
         // Only delete packages that are not important anymore.
         $notImportantPackages = array_diff($packages, $importantPackages);
         foreach ($notImportantPackages as $notImportantPackage) {
             if ($this->packageDao->get($notImportantPackage->getName(), $notImportantPackage->getPrettyVersion())) {
                 $this->logger->info("Removing {packageName} {version}. A newer package is available.", array("packageName" => $notImportantPackage->getPrettyName(), "version" => $notImportantPackage->getPrettyVersion()));
                 $this->itemDao->deletePackage($notImportantPackage->getName(), $notImportantPackage->getPrettyVersion());
                 $this->packageDao->deletePackage($notImportantPackage->getName(), $notImportantPackage->getPrettyVersion());
                 $downloadPath = DOWNLOAD_DIR . "/" . $notImportantPackage->getName() . "/" . $notImportantPackage->getPrettyVersion();
                 $filesystem->removeDirectory($downloadPath);
             }
         }
         foreach ($importantPackages as $package) {
             /* @var $package PackageInterface */
             try {
                 // Let's reset to null (in case an exception happens on first line).
                 $packageVersionEntity = null;
                 // Let's get the update date of each version and let's compare it with the one we stored.
                 $packageVersion = $this->packageDao->get($package->getName(), $package->getPrettyVersion());
                 if (!$this->force && (!isset($packageVersion['refresh']) || !$packageVersion['refresh'])) {
                     if ($packageVersion && $packageVersion['releaseDate']->sec == $package->getReleaseDate()->getTimestamp()) {
                         if (isset($packageVersion['onError'])) {
                             if ($packageVersion['onError'] == false || $packageVersion['onError'] == true && !$this->retryOnError) {
                                 $this->logger->debug("{packageName} {version} has not moved since last run. Ignoring.", array("packageName" => $package->getPrettyName(), "version" => $package->getPrettyVersion()));
                                 continue;
                             }
                         }
                     }
                 }
                 $this->itemDao->deletePackage($package->getName(), $package->getPrettyVersion());
                 $this->packageDao->deletePackage($package->getName(), $package->getPrettyVersion());
                 $this->logger->info("Downloading {packageName} {version}{additional}", array("packageName" => $package->getPrettyName(), "version" => $package->getPrettyVersion(), "additional" => isset($packageVersion['refresh']) && $packageVersion['refresh'] ? " (forced via force-refresh)" : ""));
                 //var_dump($package->getDistUrls());
                 //var_dump($package->getSourceUrls());
                 $downloadPath = DOWNLOAD_DIR . "/" . $package->getName() . "/" . $package->getPrettyVersion();
                 $this->downloadManager->download($package, $downloadPath);
                 $packageVersion = $this->packageDao->createOrUpdatePackage($package);
                 $this->classesDetector->storePackage($downloadPath, $packageVersion);
                 $packageVersion['onError'] = false;
                 $packageVersion['errorMsg'] = '';
                 unset($packageVersion['refresh']);
             } catch (\Exception $e) {
                 if (!$packageVersion) {
                     $packageVersion = $this->packageDao->createOrUpdatePackage($package);
                 }
                 $this->logger->error("Package {packageName} {version} failed to download. Exception: " . $e->getMessage() . " - " . $e->getTraceAsString(), array("packageName" => $package->getName(), "version" => $package->getPrettyVersion(), "exception" => $e));
                 $packageVersion['packageName'] = $package->getName();
                 $packageVersion['packageVersion'] = $package->getPrettyVersion();
                 $packageVersion['onError'] = true;
                 $packageVersion['errorMsg'] = $e->getMessage() . "\n" . $e->getTraceAsString();
             }
             $this->packageDao->save($packageVersion);
         }
     }
     if ($this->forcedPackage && !$found) {
         $this->logger->error("Unable to find package '{packageName}'", ['packageName' => $this->forcedPackage]);
     }
     //var_dump("Nb packages: ".count($repositories->getPackages()));
 }
 /**
  * Search for dependencies in multiple packages.
  *
  * @param string[]           $packageNames The package names.
  * @param ComposerRepository $repository   The repository.
  *
  * @return void
  */
 private function searchInPackageNames($packageNames, ComposerRepository $repository)
 {
     foreach ($packageNames as $packageName) {
         try {
             $packages = $repository->findPackages($packageName);
             $this->searchInPackages($packages);
         } catch (\Exception $e) {
             $this->application->renderException($e, $this->output);
         }
     }
 }
Example #5
0
 public function findPackages($name, $constraint = null)
 {
     // @todo - where are these used? needs fixing
     // get vendor and package name parts
     if (count($parts = explode('/', $name)) === 2) {
         list($vendor, $name) = $parts;
         if (isset($this->repoConfig['vendors'][$vendor])) {
             $packages = parent::findPackages($name, $constraint);
             return $packages;
         }
     }
     return [];
 }