162 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			162 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?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";
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| }
 |