113 lines
4.2 KiB
PHP
113 lines
4.2 KiB
PHP
|
<?php
|
||
|
namespace nur\tools\compctl;
|
||
|
|
||
|
use nur\b\IllegalAccessException;
|
||
|
use nur\cli\Application;
|
||
|
use nur\msg;
|
||
|
use nur\path;
|
||
|
use nur\yaml;
|
||
|
|
||
|
class CompctlApp extends Application {
|
||
|
const ACTION_INIT = 10, ACTION_INFOS = 20;
|
||
|
const ACTION_SYNC = 30;
|
||
|
const ACTION_SYNC_ALL = -1, ACTION_SYNC_COMPOSER = 1, ACTION_SYNC_UPDATE_APPS = 2, ACTION_SYNC_DOCKER_COMPOSE = 4, ACTION_SYNC_IDEA_PROJECT = 8;
|
||
|
|
||
|
const ARGS = [
|
||
|
"merge" => parent::ARGS,
|
||
|
"purpose" => "gestion du fichier composer.json",
|
||
|
["-0", "--init", "name" => "action", "value" => self::ACTION_INIT,
|
||
|
"help" => "Créer une configuration si elle n'existe pas déjà",
|
||
|
],
|
||
|
["--infos", "name" => "action", "value" => self::ACTION_INFOS,
|
||
|
"help" => "Afficher la configuration",
|
||
|
],
|
||
|
["group",
|
||
|
["-s", "--sync", "name" => "action", "value" => self::ACTION_SYNC,
|
||
|
"help" => "Synchroniser les fichier à partir de la configuration",
|
||
|
],
|
||
|
["-a", "--sa", "--sync-all", "name" => "action_sync", "value" => self::ACTION_SYNC_ALL],
|
||
|
["--sc", "--sync-composer", "name" => "action_sync", "value" => self::ACTION_SYNC_COMPOSER],
|
||
|
["--su", "--sync-update-apps", "name" => "action_sync", "value" => self::ACTION_SYNC_UPDATE_APPS],
|
||
|
["--sd", "--sync-docker-compose", "name" => "action_sync", "value" => self::ACTION_SYNC_DOCKER_COMPOSE],
|
||
|
["--sp", "--sync-idea-project", "name" => "action_sync", "value" => self::ACTION_SYNC_IDEA_PROJECT],
|
||
|
],
|
||
|
["-d", "--projdir", "args" => "dir",
|
||
|
"help" => "Spécifier le répertoire du projet. Par défaut, chercher à partir du répertoire courant",
|
||
|
],
|
||
|
["-b", "--branch", "args" => 1,
|
||
|
"help" => "Utiliser la configuration associée à la branche spécifiée. Par défaut, utiliser la branche courante",
|
||
|
],
|
||
|
["-i", "--inplace", "value" => true,
|
||
|
"help" => "modifier le fichier en place, au lieu d'afficher le nouveau contenu",
|
||
|
],
|
||
|
];
|
||
|
|
||
|
protected $action = self::ACTION_INFOS;
|
||
|
protected $actionSync = 0;
|
||
|
protected $projdir, $branch, $inplace = false;
|
||
|
|
||
|
protected $args;
|
||
|
|
||
|
protected function checkConfigFile(string $configFile, ?string $projdir=null): void {
|
||
|
if (!file_exists($configFile)) {
|
||
|
$message = "aucune configuration n'a été trouvée";
|
||
|
if ($projdir) $message = path::ppath($projdir) . ": $message";
|
||
|
msg::warning($message);
|
||
|
self::exit(1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function main() {
|
||
|
git::setup();
|
||
|
[$projdir, $composerFile, $configFile] = ut::resolve_projdir($this->projdir);
|
||
|
[$gitdir, $branch] = ut::resolve_branch($this->branch, $projdir);
|
||
|
|
||
|
if ($this->action == self::ACTION_INIT) {
|
||
|
$composer = new ComposerFile($composerFile, $projdir);
|
||
|
$config = $composer->initConfig($configFile);
|
||
|
if ($config === null) return false;
|
||
|
yaml::dump($config->getv());
|
||
|
|
||
|
} else {
|
||
|
$inplace = $this->inplace;
|
||
|
$config = new ConfigFile($configFile, $projdir);
|
||
|
switch ($this->action) {
|
||
|
case self::ACTION_INFOS:
|
||
|
yaml::dump([
|
||
|
"projdir" => $projdir,
|
||
|
"composer_file" => $composerFile,
|
||
|
"config_file" => $configFile,
|
||
|
"git_dir" => $gitdir,
|
||
|
"branch" => $branch,
|
||
|
"config" => $config->getv(),
|
||
|
]);
|
||
|
break;
|
||
|
case self::ACTION_SYNC:
|
||
|
$actionSync = $this->actionSync;
|
||
|
if ($actionSync == 0) $actionSync = self::ACTION_SYNC_COMPOSER;
|
||
|
$synced = false;
|
||
|
if ($actionSync & self::ACTION_SYNC_COMPOSER) {
|
||
|
$dest = new ComposerFile($composerFile, $projdir);
|
||
|
$synced |= $dest->sync($config, $branch, $inplace);
|
||
|
}
|
||
|
if ($actionSync & self::ACTION_SYNC_UPDATE_APPS) {
|
||
|
$dest = new UpdateAppsFile();
|
||
|
$synced |= $dest->sync($config, $branch, $inplace);
|
||
|
}
|
||
|
if ($actionSync & self::ACTION_SYNC_DOCKER_COMPOSE) {
|
||
|
$dest = new DockerComposeFile();
|
||
|
$synced |= $dest->sync($config, $branch, $inplace);
|
||
|
}
|
||
|
if ($actionSync & self::ACTION_SYNC_IDEA_PROJECT) {
|
||
|
$dest = new IdeaProject();
|
||
|
$synced |= $dest->sync($config, $branch, $inplace);
|
||
|
}
|
||
|
return $synced;
|
||
|
default:
|
||
|
throw IllegalAccessException::unexpected_state("action non implémentée");
|
||
|
}
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
}
|