nur-sery/nur_src/tools/compctl/CompdepApp.php

162 lines
5.4 KiB
PHP
Raw Normal View History

2024-04-04 15:36:42 +04:00
<?php
namespace nur\tools\compctl;
use nur\A;
use nur\cli\Application;
use nur\msg;
use nur\shutils;
class CompdepApp extends Application {
private static function split_pkey_value(string $pv): array {
if (preg_match('/([a-zA-Z0-9._-]+)=(.*)/', $pv, $ms)) {
return [$ms[1], $ms[2]];
} else {
return [$pv, true];
}
}
const SHOW_NAMES = "names", SHOW_DEPS = "deps", SHOW_DIRS = "dirs", SHOW_COMPOSER = "composer";
const ARGS = [
"purpose" => "Lister les dépendances d'un projet PHP",
["-B", "--projects-dir", "args" => "dir",
"help" => "Spécifier le répertoire de base des projets",
],
["-w", "--rewrite",
"help" => "modifier le fichier composer.json au lieu d'afficher le nouveau contenu",
],
["--force-rewrite",
"help" => "en cas de modification, forcer la ré-écriture du fichier composer.json même s'il est inchangé",
],
["-s", "--set-pkey", "args" => 1, "argsdesc" => "PKEY=VALUE",
"help" => "créer ou modifier le chemin de clé avec la valeur spécifiée",
],
["-d", "--del-pkey", "args" => 1, "argsdesc" => "PKEY",
"help" => "supprimer le chemin de clé spécifié",
],
["-r", "--filter-dep", "args" => 1, "argsdesc" => "DEP",
"help" => "sélectionner tous les projets qui ont une dépendance sur la librairie spécifiée",
],
["-u", "--update-dep", "args" => "value", "argsdesc" => "VERSION",
"help" => "mettre à jour la dépendance avec la nouvelle cible/version.
requière l'utilisation de --filter-dep",
],
["--sn", "--show-names", "name" => "show", "value" => self::SHOW_NAMES,
"help" => "afficher les noms des projets",
],
["--sp", "--show-deps", "name" => "show", "value" => self::SHOW_DEPS,
"help" => "afficher les branches",
],
["--sb", "--show-branches",
"help" => "avec --show-deps, afficher aussi les branches",
],
["--sf", "--show-filtered",
"help" => "avec --show-deps, n'afficher que la dépendances sélectionnée
implique --show-branches",
],
["--sd", "--show-dirs", "name" => "show", "value" => self::SHOW_DIRS,
"help" => "afficher les répertoires des projets",
],
["--sc", "--show-composer", "name" => "show", "value" => self::SHOW_COMPOSER,
"help" => "afficher les chemins des fichiers composer.json de chaque projet",
],
];
private $projectsDir;
private $rewrite = false, $forceRewrite = false;
private $setPkey, $delPkey;
private $filterDep, $updateDep;
private $show = self::SHOW_DEPS, $showBranches, $showFiltered;
private $args;
function main() {
$projectDirs = $this->args;
$rewrite = $this->rewrite;
$forceRewrite = $this->forceRewrite;
$setPkey = $this->setPkey;
$delPkey = $this->delPkey;
$filterDep = $this->filterDep;
$updateDep = $this->updateDep;
$projectsDir = $this->projectsDir;
$show = $this->show;
$showBranches = $this->showBranches;
$showFiltered = $this->showFiltered;
if ($updateDep && !$filterDep) {
self::die("--update-dep requière --filter-dep");
}
if (!$projectDirs) {
if ($projectsDir !== null) {
$projectDirs = shutils::ls_pdirs($projectsDir);
} else {
if (file_exists("composer.json")) {
$projectDirs = ["."];
} else {
$projectsDir = ".";
$projectDirs = shutils::ls_pdirs($projectsDir);
}
}
}
$projects = ComposerWalker::build_projects($projectDirs, $projectsDir);
$oprojects = ComposerWalker::order_deps(null, $projects);
foreach ($oprojects as $name) {
$project = A::get($projects, $name);
if ($project === null) continue;
$requires = ComposerWalker::order_deps($project["requires"], $projects);
$branches = $project["branches"];
if ($filterDep && !in_array($filterDep, $requires)) {
continue;
}
if ($setPkey || $delPkey || $updateDep) {
/** @var ComposerFile $composer */
$composer = $project["composer"];
msg::step($composer->getComposerFile());
if ($setPkey) {
[$pkey, $value] = self::split_pkey_value($setPkey);
$composer->setPkey($pkey, $value, $rewrite, $forceRewrite);
} elseif ($delPkey) {
[$pkey, $value] = self::split_pkey_value($delPkey);
$composer->delPkey($pkey, $rewrite, $forceRewrite);
} elseif ($updateDep) {
$composer->updateDep($filterDep, $updateDep, $rewrite, $forceRewrite);
}
} else {
switch ($show) {
case self::SHOW_NAMES:
echo $name;
break;
case self::SHOW_DEPS:
echo $name; $pos = strlen($name);
$sep = ": ";
foreach ($requires as $require) {
if ($showFiltered && $require !== $filterDep) continue;
$text = $require;
if ($showBranches || $showFiltered) {
$branch = A::get($branches, $require);
if ($branch !== null) $text .= "[$branch]";
}
$size = strlen("$sep$text");
if ($pos + $size > 80) {
$sep = "\n".str_repeat(" ", 4); $pos = 4;
$size = strlen($text);
}
echo "$sep$text"; $pos += $size;
$sep = ", ";
}
break;
case self::SHOW_DIRS:
echo $project["dir"];
break;
case self::SHOW_COMPOSER:
echo "$project[dir]/composer.json";
break;
}
echo "\n";
}
}
}
}