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\ArtifactDownloader;
use StaticPHP\Artifact\DownloaderOptions; use StaticPHP\Artifact\DownloaderOptions;
use StaticPHP\Registry\ArtifactLoader;
use StaticPHP\Registry\PackageLoader; use StaticPHP\Registry\PackageLoader;
use StaticPHP\Util\DependencyResolver; use StaticPHP\Util\DependencyResolver;
use StaticPHP\Util\FileSystem; use StaticPHP\Util\FileSystem;
use StaticPHP\Util\InteractiveTerm; use StaticPHP\Util\InteractiveTerm;
use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Completion\CompletionInput;
use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Input\InputOption;
@ -19,7 +21,17 @@ class DownloadCommand extends BaseCommand
{ {
public function configure(): void 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 // 2.x compatible options
$this->addOption('shallow-clone', null, null, '(deprecated) Clone shallowly repositories when downloading sources'); $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\DI\ApplicationContext;
use StaticPHP\Package\PackageInstaller; use StaticPHP\Package\PackageInstaller;
use StaticPHP\Registry\PackageLoader;
use Symfony\Component\Console\Attribute\AsCommand; 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'])] #[AsCommand('install-pkg', 'Install additional package', ['i', 'install-package'])]
class InstallPackageCommand extends BaseCommand 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 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. * Process #[CustomSource] attribute.
*/ */