mirror of
https://github.com/Vateron-Media/XC_VM.git
synced 2026-10-26 19:03:17 +01:00
Atomic case-rename of the seven class-holding source directories to match the PSR-4 namespace casing, plus every consequent path reference. No code logic changes — pure structural rename. (config/content/resources/signals/migrations/ ministra/storage/tmp/vendor/www/bin stay lowercase.) - git mv: core→Core, domain→Domain, infrastructure→Infrastructure, streaming→Streaming, modules→Modules, cli→Cli, public→Public (module subdirs like Modules/plex stay lowercase; loaded by ModuleLoader, not Composer). - PHP filesystem paths updated across src/ + tests/: require/include, glob/scandir bases, view includes, asset/nginx-alias paths, autoload.php registerDirectories(), ModuleLoader/ModuleManager module roots, console.php discovery dirs. - src/composer.json PSR-4 vendored-lib paths → Core/Parsing/...; vendor/ regenerated. - nginx.conf: docroot + SCRIPT_FILENAME → Public/. SCRIPT_NAME and the public-facing /streaming/*.php compat routes are URLs, left unchanged. - Build/CI: Makefile LB_DIRS / LB_DIRS_TO_REMOVE / LB_FILES_TO_REMOVE PascalCased (closes the LB-archive privileged-leak blocker); phpstan.dist.neon paths/ scanDirectories/excludePaths; phpunit.xml.dist coverage; phpstan-baseline.neon regenerated (294→294 errors, no new resolution failures). - migrations/deleted_files.txt: old lowercase trees listed for client cleanup (assumes case-sensitive FS — the supported Linux target). Verified: grep-gate 0 live lowercase-dir require/include in src+tests; php -l clean; PHPUnit 292/292; PHPStan no errors; Composer first / XC_Autoloader last in SPL stack; global classes resolve from the renamed dirs.
111 lines
2.9 KiB
PHP
111 lines
2.9 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Реестр CLI-команд.
|
|
*
|
|
* Хранит маппинг имя → экземпляр CommandInterface.
|
|
* Dispatch: ищет команду по имени из $argv и вызывает execute().
|
|
*
|
|
* Команды обнаруживаются автоматически: console.php сканирует
|
|
* cli/Commands/ и cli/CronJobs/ и регистрирует все классы,
|
|
* реализующие CommandInterface.
|
|
*
|
|
* @package XC_VM_CLI
|
|
* @author Divarion_D <https://github.com/Divarion-D>
|
|
* @copyright 2025-2026 Vateron Media
|
|
* @link https://github.com/Vateron-Media/XC_VM
|
|
* @license AGPL-3.0 https://www.gnu.org/licenses/agpl-3.0.html
|
|
*/
|
|
|
|
class CommandRegistry {
|
|
|
|
/** @var CommandInterface[] name → command */
|
|
private $rCommands = [];
|
|
|
|
/**
|
|
* Зарегистрировать команду.
|
|
*/
|
|
public function register(CommandInterface $rCommand): void {
|
|
$this->rCommands[$rCommand->getName()] = $rCommand;
|
|
}
|
|
|
|
/**
|
|
* Dispatch: найти команду по $argv и выполнить.
|
|
*
|
|
* @param array $rArgv Полный $argv из CLI
|
|
* @return int Exit code
|
|
*/
|
|
public function dispatch(array $rArgv): int {
|
|
$rCommandName = $rArgv[1] ?? null;
|
|
|
|
if ($rCommandName === null || $rCommandName === '--help' || $rCommandName === '-h') {
|
|
$this->printHelp();
|
|
return 0;
|
|
}
|
|
|
|
if ($rCommandName === '--list') {
|
|
$this->printList();
|
|
return 0;
|
|
}
|
|
|
|
if (!isset($this->rCommands[$rCommandName])) {
|
|
fwrite(STDERR, "Unknown command: {$rCommandName}\n");
|
|
fwrite(STDERR, "Run with --list to see available commands.\n");
|
|
return 1;
|
|
}
|
|
|
|
$rArgs = array_slice($rArgv, 2);
|
|
return $this->rCommands[$rCommandName]->execute($rArgs);
|
|
}
|
|
|
|
/**
|
|
* Получить команду по имени (для тестов и проверок).
|
|
*/
|
|
public function get(string $rName): ?CommandInterface {
|
|
return $this->rCommands[$rName] ?? null;
|
|
}
|
|
|
|
/**
|
|
* Все зарегистрированные команды.
|
|
*
|
|
* @return CommandInterface[]
|
|
*/
|
|
public function getAll(): array {
|
|
return $this->rCommands;
|
|
}
|
|
|
|
private function printHelp(): void {
|
|
echo "XC_VM Console\n";
|
|
echo "\n";
|
|
echo "Usage: /home/xc_vm/console.php <command> [arguments]\n";
|
|
echo "\n";
|
|
echo " --list Show all available commands\n";
|
|
echo " --help Show this help message\n";
|
|
echo "\n";
|
|
}
|
|
|
|
private function printList(): void {
|
|
echo "Available commands:\n\n";
|
|
|
|
$rGrouped = [];
|
|
foreach ($this->rCommands as $rName => $rCommand) {
|
|
$rParts = explode(':', $rName, 2);
|
|
$rGroup = count($rParts) > 1 ? $rParts[0] : '';
|
|
$rGrouped[$rGroup][$rName] = $rCommand->getDescription();
|
|
}
|
|
|
|
ksort($rGrouped);
|
|
|
|
foreach ($rGrouped as $rGroup => $rItems) {
|
|
if ($rGroup !== '') {
|
|
echo " {$rGroup}\n";
|
|
}
|
|
ksort($rItems);
|
|
foreach ($rItems as $rName => $rDesc) {
|
|
echo sprintf(" %-30s %s\n", $rName, $rDesc);
|
|
}
|
|
echo "\n";
|
|
}
|
|
}
|
|
}
|