Files
project/provm/common/Service/Composer.php

103 lines
2.7 KiB
PHP

<?php
namespace ProVM\Common\Service;
use Psr\Container\ContainerInterface as Container;
use Composer\Console\Application;
use Symfony\Component\Console\Input\ArrayInput as Input;
use ProVM\Common\Define\ArrayOutput as Output;
class Composer {
const MAYOR = 0;
const MINOR = 1;
const PATCH = 2;
const RELEASE = 3;
protected $composer_file;
public function __construct(string $composer_file) {
$this->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];
}
}
}