composer_file = $composer_file; } public function search($query): array { putenv('COMPOSER=' . $this->composer_file); $input = new Input([ 'command' => 'search', 'tokens' => [$query] ]); $output = new Output(); $app = new Application(); $app->setAutoExit(false); $app->run($input, $output); return $this->parseOutput($output->fetch()); } protected function parseOutput(array $input): array { $output = []; foreach ($input as $line) { if (strpos($line[0], '<') !== false) { continue; } $pos = strpos($line[0], ' '); $name = substr($line[0], 0, $pos); $desc = substr($line[0], $pos + 1); $output []= (object) compact('name', 'desc'); } return $output; } public function latest(string $package): string { putenv('COMPOSER=' . $this->composer_file); $input = new Input([ 'command' => 'show', '--all' => true, '--latest' => true, 'package' => $package ]); $output = new Output(); $app = new Application(); $app->setAutoExit(false); $app->run($input, $output); $arr = $output->fetch(); $latest = '*'; foreach ($arr as $line) { if (strpos($line[0], 'latest') === false) { continue; } list($option, $value) = explode(':', $line[0]); if (trim($option) == 'latest') { $latest = trim($value); } } return $latest; } public function getLatest(array $packages, int $semver = Composer::MINOR): array { $output = []; foreach ($packages as $package) { $latest = $this->semver($this->latest($package), $semver); $output[$package] = $latest; } return $output; } protected function semver(string $version, int $semver) { switch ($semver) { case Composer::PATCH: case Composer::RELEASE: return $version; case Composer::MINOR: if (strpos($version, '.') === false) { return $version; } $v = explode('.', $version); if (count($v) < 3) { return '^' . $version; } array_pop($v); $version = '^' . implode('.', $v); return $version; case Composer::MAYOR: if (strpos($version, '.') === false) { return $version; } $v = explode('.', $version); return '^' . $v[0]; } } }