Add artifact name suggestions for download and install commands

This commit is contained in:
crazywhalecc 2026-02-04 16:25:23 +08:00
parent 3fa2d69813
commit 16f94466fd
No known key found for this signature in database
GPG Key ID: 1F4BDD59391F2680
3 changed files with 41 additions and 3 deletions

View File

@ -6,11 +6,13 @@ namespace StaticPHP\Command;
use StaticPHP\Artifact\ArtifactDownloader;
use StaticPHP\Artifact\DownloaderOptions;
use StaticPHP\Registry\ArtifactLoader;
use StaticPHP\Registry\PackageLoader;
use StaticPHP\Util\DependencyResolver;
use StaticPHP\Util\FileSystem;
use StaticPHP\Util\InteractiveTerm;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Completion\CompletionInput;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputOption;
@ -19,7 +21,17 @@ class DownloadCommand extends BaseCommand
{
public function configure(): void
{
$this->addArgument('artifacts', InputArgument::OPTIONAL, 'Specific artifacts to download, comma separated, e.g "php-src,openssl,curl"');
$this->addArgument(
'artifacts',
InputArgument::OPTIONAL,
'Specific artifacts to download, comma separated, e.g "php-src,openssl,curl"',
suggestedValues: function (CompletionInput $input) {
$input_val = $input->getCompletionValue();
$all_names = ArtifactLoader::getLoadedArtifactNames();
// filter by input value
return array_filter($all_names, fn ($name) => str_starts_with($name, $input_val));
},
);
// 2.x compatible options
$this->addOption('shallow-clone', null, null, '(deprecated) Clone shallowly repositories when downloading sources');

View File

@ -6,14 +6,29 @@ namespace StaticPHP\Command;
use StaticPHP\DI\ApplicationContext;
use StaticPHP\Package\PackageInstaller;
use StaticPHP\Registry\PackageLoader;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Completion\CompletionInput;
use Symfony\Component\Console\Input\InputArgument;
#[AsCommand('install-pkg', 'Install additional package', ['i', 'install-package'])]
class InstallPackageCommand extends BaseCommand
{
public function configure()
public function configure(): void
{
$this->addArgument('package', null, 'The package to install (name or path)');
$this->addArgument(
'package',
InputArgument::REQUIRED,
'The package to install (name or path)',
suggestedValues: function (CompletionInput $input) {
$packages = [];
foreach (PackageLoader::getPackages(['target', 'virtual-target']) as $name => $_) {
$packages[] = $name;
}
$val = $input->getCompletionValue();
return array_filter($packages, fn ($name) => str_starts_with($name, $val));
}
);
}
public function handle(): int

View File

@ -69,6 +69,17 @@ class ArtifactLoader
}
}
/**
* Get names of all loaded artifacts.
*
* @return string[]
*/
public static function getLoadedArtifactNames(): array
{
self::initArtifactInstances();
return array_keys(self::$artifacts ?? []);
}
/**
* Process #[CustomSource] attribute.
*/