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";
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 |