public function installAction() { $name = $this->getParam('name', null); if (!$name) { return $this->_helper->json(['success' => false, 'message' => 'no package name supplied']); } $client = new Packagist\Api\Client(); try { $package = $client->get($name); } catch (\Exception $ex) { return $this->_helper->json(['success' => false, 'message' => "packagist package with name '{$name}' not found"]); } $versions = $package->getVersions(); $version = null; foreach ($versions as $version => $infos) { // TODO(rafalgalka) check minimum-stability if ($version == 'dev-master') { continue; } $version = $versions[$version]; break; } if (!$version instanceof Version) { $version = $versions['dev-master']; } if (!$version instanceof Version) { return $this->_helper->json(['success' => false, 'message' => "no version found for package '{$name}'"]); } try { $jobId = \Manager\Composer::installPackage($name . ':' . $version->getVersion()); return $this->_helper->json(['success' => true, 'jobId' => $jobId]); } catch (Exception $e) { return $this->_helper->json(['success' => false, 'message' => $e->getMessage()]); } }
/** * @return Client */ private function getPackagist() { if (!$this->packagist) { $options = $this->getOptions(); $this->packagist = new Client(); $this->packagist->setPackagistUrl($options['packagist-url']); } return $this->packagist; }
protected function execute(InputInterface $input, OutputInterface $output) { $packager = new Packager(); $packager->setOutput($output); $packager->coerceWritable(); $dialog = $this->getHelperSet()->get('dialog'); /* @var $dialog DialogHelper */ $name = $input->getArgument('name'); do { if ($name === null) { // ask for input $name = $dialog->ask($output, 'Enter (partial) project name > '); } else { $output->writeln('Searching for <info>' . $name . '</info>...'); } $packagist = new Client(); $choices = array(); foreach ($packagist->search($name) as $package) { /* @var $package Result */ $label = str_pad($package->getName(), 39) . ' '; $label = str_replace($name, '<info>' . $name . '</info>', $label); $label .= $package->getDescription(); $label .= ' (⤓' . $package->getDownloads() . ')'; $choices[$package->getName()] = $label; } $name = $this->select($output, 'Select matching package', $choices, 'Start new search'); } while ($name === null); $output->writeln('Selected <info>' . $name . '</info>, listing versions...'); $package = $packagist->get($name); /* @var $package Package */ $choices = array(); foreach ($package->getVersions() as $version) { /* @var $version Version */ $label = $version->getVersion(); $bin = $version->getBin(); if ($bin === null) { $label .= ' (<error>no executable bin</error>)'; } else { $label .= ' (☑ executable bin)'; } $choices[$version->getVersion()] = $label; } $version = $this->select($output, 'Select available version', $choices); $action = $this->select($output, 'Action', array('build' => 'Build project', 'install' => 'Install project system-wide'), 'Quit'); if ($action === null) { return; } $pharer = $packager->getPharer($name, $version); if ($action === 'install') { $path = $packager->getSystemBin($pharer); $packager->install($pharer, $path); } else { $pharer->build(); } }
/** * Get the aggregated information from packagist. * * Please pass an array of vendors or package names, or a single vendor or * package name to this method. * * @param string[]|string $vendors * * @return array */ public function packages($vendors) { $packages = []; foreach ((array) $vendors as $vendor) { if (strpos($vendor, '/') !== false) { $packages[] = $this->packagist->get($vendor); } else { foreach ($this->packagist->all(compact('vendor')) as $result) { $packages[] = $this->packagist->get($result); } } } return $packages; }
public function indexAction() { $client = new Client(); $results = $client->search('', ['type' => 'pimcore-plugin']); $packages = []; $downloaded = \Manager\Composer::getDownloaded(); $sortable = ['name', 'description', 'downloads', 'favers']; $sort = []; if ($this->getParam('sort')) { $sort = json_decode($this->getParam('sort'), true); if (is_array($sort) && !empty($sort)) { $sort = $sort[0]; } } if (!in_array($sort['property'], $sortable)) { $sort['property'] = 'downloads'; } $direction = strtoupper($sort['direction']) === 'ASC' ? SORT_ASC : SORT_DESC; // for array_multisort $sorter = []; $filter = trim($this->getParam('filter')); /** @var Packagist\Api\Result\Result $result */ foreach ($results as $result) { if (isset($downloaded[$result->getName()])) { continue; } $package = ['name' => $result->getName(), 'description' => $result->getDescription(), 'url' => $result->getUrl(), 'downloads' => $result->getDownloads(), 'favers' => $result->getFavers(), 'repository' => $result->getRepository()]; if ($filter && strpos($package['name'], $filter) === false && strpos($package['description'], $filter) === false) { continue; } $packages[] = $package; $sorter[] = $package[$sort['property']]; } array_multisort($sorter, $direction, $packages); $total = count($packages); $start = (int) $this->getParam('start'); $limit = (int) $this->getParam('limit'); if ($start > 0 || $start + $limit < $total) { $packages = array_slice($packages, $start, $limit); } $this->_helper->json(['data' => $packages, 'success' => true, 'total' => $total]); }
/** * Get latest package version. * * @param string $name * * @return string|void */ public function getLatestVersion($name) { try { // Get all package versions. $versions = array_map(function ($version) { return $version->getVersion(); }, $this->packagist->get($name)->getVersions()); return Version::latest($versions); } catch (ClientErrorResponseException $e) { return; } }
protected function execute(InputInterface $input, OutputInterface $output) { $client = new Client(); $repository = $this->getContainer()->get('botrelli.package.doctrine.repository'); $packages = $client->all(); $packagesAdded = 0; $output->writeln("Number 5 is Analyzing Packagist packages... be patient or die, human."); $progress = new ProgressBar($output, count($packages)); $progress->setRedrawFrequency(100); $progress->start(); foreach ($packages as $package) { $localPackage = $repository->get($package); if (null === $localPackage) { $localPackage = Package::create($package); $repository->add($localPackage); $packagesAdded++; } $progress->advance(); } $progress->finish(); $output->writeln("Number 5 added {$packagesAdded} missing packages to the local Database."); }
public function packagistData(Request $request) { $package = $this->packagist->get($request->get('packagist_uri')); return response()->json($this->transformer->transform($package)); }
protected function doSearch(Builder $builder, Packager $packager) { $oldname = null; do { $dialog = $builder->entry('Search (partial) project name', $oldname); $dialog->setTitle('Search project name'); $name = $dialog->waitReturn(); if ($name === false) { return; } $oldname = $name; $pulsate = $builder->pulsate('Searching for "' . $name . '"...'); $pulsate->setNoCancel(true); $pulsate->run(); $packagist = new Client(); $choices = array(); foreach ($packagist->search($name) as $package) { /* @var $package Result */ $choices[$package->getName()] = array($package->getName(), mb_strimwidth($package->getDescription(), 0, 80, '…', 'utf-8'), $package->getDownloads()); } $pulsate->close(); if (!$choices) { $builder->warning('No package matching "' . $name . '" found!')->waitReturn(); $name = false; continue; } $table = $builder->table($choices, array('Name', 'Description', 'Downloads'), 'Select matching package'); $table->setTitle('Select matching package'); $table->setCancelLabel('Back to Search'); $table->setWidth(1000); $table->setHeight(600); $name = $table->waitReturn(); } while (is_bool($name)); $pulsate = $builder->pulsate('Selected <info>' . $name . '</info>, listing versions...'); $pulsate->setNoCancel(true); $pulsate->run(); $package = $packagist->get($name); /* @var $package Package */ $choices = array(); foreach ($package->getVersions() as $version) { /* @var $version Version */ $time = new \DateTime($version->getTime()); $time = $time->format('Y-m-d H:i:s'); $bin = $version->getBin(); if ($bin) { $bin = '☑ ' . array_shift($bin); } else { $bin = '☐ no executable bin'; } $choices[$version->getVersion()] = array($version->getVersion(), $time, $bin); } $pulsate->close(); if (!$choices) { $builder->warning('No versions for package "' . $name . '" found!')->waitReturn(); return; } $dialog = $builder->table($choices, array('Version', 'Date', 'Binary'), 'Select available version'); $dialog->setWidth(800); $dialog->setHeight(300); $version = $dialog->waitReturn(); if (is_bool($version)) { return; } $pulsate = $builder->pulsate('Installing to temporary directory...')->run(); $pharer = $packager->getPharer($name, $version); $pulsate->close(); return $pharer; }
/** * @return Client */ private static function getPackagist() { if (true === empty(self::$packagist) || false === self::$packagist instanceof Client) { $packagist = new Client(); $packagist->setPackagistUrl(ExtensionsManager::module()->packagistUrl); self::$packagist = $packagist; } return self::$packagist; }
/** * {@inheritdoc} */ public function getPackage($name) { return $this->client->get($name); }
public function all(array $filters = array()) { $key = $this->getPrefixKey(__METHOD__, $filters); if ($this->getCache()->contains($key)) { $results = $this->getCache()->fetch($key); } else { $results = parent::all($filters); $this->getCache()->save($key, $results, $this->TTLAll); } return $results; }
/** * @param string * @return \NetteAddons\Model\AddonEntity */ public function getAddon($url) { if (!$this->isSupported($url)) { throw new \NetteAddons\InvalidArgumentException('Url "' . $url . '" not supported.'); } $match = Strings::match($url, self::URL_REGEXP); $composerFullName = $match['vendor'] . '/' . $match['name']; try { $data = $this->apiClient->get($composerFullName); $addon = new AddonEntity($data->getName()); $addon->setPerex($data->getDescription()); $addon->setPackagist(UrlsHelper::normalizePackagistPackageUrl($url)); foreach ($data->getVersions() as $versionData) { /** @var \Packagist\Api\Result\Package\Version $versionData */ $version = new AddonVersionEntity($addon->getComposerFullName(), $versionData->getVersion()); if ($versionData->getSource() !== NULL && empty($addon->getGithub())) { /** @var \Packagist\Api\Result\Package\Source $source */ $source = $versionData->getSource(); if (UrlsHelper::isGithubRepositoryUrl($source->getUrl())) { $normalizedGithubUrl = UrlsHelper::normalizeGithubRepositoryUrl($source->getUrl()); $addon->setGithub($normalizedGithubUrl); $githubClient = $this->githubClientFactory->create($normalizedGithubUrl); $addon->setStars($githubClient->getMetadata()->stargazers_count); } } if ($versionData->getLicense() !== NULL) { foreach ($versionData->getLicense() as $license) { $version->addLicense($license); } } if ($versionData->getRequire() !== NULL) { foreach ($versionData->getRequire() as $dependencyName => $dependencyVersion) { $dependency = new AddonDependencyEntity($addon->getComposerFullName(), $version->getVersion(), AddonDependencyEntity::TYPE_REQUIRE, $dependencyName, $dependencyVersion); $version->addDependency($dependency); } } if ($versionData->getRequireDev() !== NULL) { foreach ($versionData->getRequireDev() as $dependencyName => $dependencyVersion) { $dependency = new AddonDependencyEntity($addon->getComposerFullName(), $version->getVersion(), AddonDependencyEntity::TYPE_REQUIRE_DEV, $dependencyName, $dependencyVersion); $version->addDependency($dependency); } } if ($versionData->getConflict() !== NULL) { foreach ($versionData->getConflict() as $dependencyName => $dependencyVersion) { $dependency = new AddonDependencyEntity($addon->getComposerFullName(), $version->getVersion(), AddonDependencyEntity::TYPE_CONFLICT, $dependencyName, $dependencyVersion); $version->addDependency($dependency); } } if ($versionData->getReplace() !== NULL) { foreach ($versionData->getReplace() as $dependencyName => $dependencyVersion) { $dependency = new AddonDependencyEntity($addon->getComposerFullName(), $version->getVersion(), AddonDependencyEntity::TYPE_REPLACE, $dependencyName, $dependencyVersion); $version->addDependency($dependency); } } if ($versionData->getProvide() !== NULL) { foreach ($versionData->getProvide() as $dependencyName => $dependencyVersion) { $dependency = new AddonDependencyEntity($addon->getComposerFullName(), $version->getVersion(), AddonDependencyEntity::TYPE_PROVIDE, $dependencyName, $dependencyVersion); $version->addDependency($dependency); } } // @todo suggest $addon->addVersion($version); } return $addon; } catch (\Guzzle\Http\Exception\ClientErrorResponseException $e) { if ($e->getResponse()->getStatusCode() === 404) { throw new \NetteAddons\Model\Importers\AddonVersionImporters\AddonNotFoundException('Addon "' . $composerFullName . '" not found', $composerFullName, $e); } throw $e; } }
/** * Get the versions. * * @param array $packages * * @return array */ private function getVersions(array $packages) { $client = new Client(); $versions = []; foreach ($packages as $name => $version) { try { $package = $client->get($name); $current = $this->normalize($version); $latest = $this->normalize($this->getLatest($package->getVersions())); if (version_compare($version, $latest, '<') && $current !== $latest) { $latest = $this->diff($current, $latest); array_push($versions, [$name, $current, '→', $latest]); } } catch (ClientErrorResponseException $e) { continue; } } return $versions; }