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(); } }
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]); }
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; }
public function search($query) { $key = $this->getPrefixKey(__METHOD__, $query); if ($this->getCache()->contains($key)) { $results = $this->getCache()->fetch($key); } else { $results = parent::search($query); $this->getCache()->save($key, $results, $this->TTLSearch); } return $results; }