| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 | <?phpdeclare(strict_types=1);namespace Drush\Commands\composer_check;use Consolidation\OutputFormatters\StructuredData\RowsOfFields;use Drush\Commands\DrushCommands;use Symfony\Component\Yaml\Yaml;/** * MagpjmCommands provides Drush 9 commands for the MAGPJ run time module. */class ComposerCheckCommands extends DrushCommands {  /**   * The serialization.yaml service.   *   * @var \Symfony\Component\Yaml   */  private $yaml;  public function __construct() {    $this->yaml = new Yaml();  }  /**   * Command callback for composer-check.   *   * @param null|string $lockPath   *   Optional. The path to a composer.lock file.   */  /**   * Lists the packages requested in composer.json and the matching locked   * version.   *   * @param ?string $lockPath   *   * @return \Consolidation\OutputFormatters\StructuredData\RowsOfFields   *   The list of package versions, unless YAML encoding is used.   *   * @field-labels   *   name: Name   *   kind: Kind   *   req: Requirement   *   ver: Version   *   * @command composer:check   * @aliases cch   *   * @option all List all locked packages, even those not requested   * @option yaml Produce YAML output instead of a table   *   * @throws \Exception   */  public function composerCheck(string $lockPath = NULL) {    $lockPath = $this->validateLockPath($lockPath);    $jsonPath = $this->validateJsonPath($lockPath);    ['run' => $jrPack, 'dev' => $jdPack] = $this->decodeJsonPackages($jsonPath);    ['run' => $lrPack, 'dev' => $ldPack] = $this->decodeLockPackages($lockPath);    $all = !!$this->input()->getOption('all');    $yaml = !!$this->input()->getOption('yaml');    $packages = ['run' => [], 'dev' => []];    foreach ($jrPack as $package => $requirement) {      if ($all || !empty($requirement)) {        $package = mb_strtolower($package);        $packages['run'][$package]['requirement'] = $requirement;      }    }    foreach ($jdPack as $package => $requirement) {      if ($all || !empty($requirement)) {        $package = mb_strtolower($package);        $packages['dev'][$package]['requirement'] = $requirement;      }    }    foreach ($lrPack as $packageInfo) {      $package = mb_strtolower($packageInfo['name']);      if ($all || !empty($packages['run'][$package])) {        $version = $packageInfo['version'];        $packages['run'][$package]['version'] = $version;      }    }    foreach ($ldPack as $packageInfo) {      $package = mb_strtolower($packageInfo['name']);      if ($all || !empty($packages['dev'][$package])) {        $version = $packageInfo['version'];        $packages['dev'][$package]['version'] = $version;      }    }    ksort($packages['dev']);    ksort($packages['run']);    if ($yaml) {      $this->output()->writeln($this->yaml->dump($packages, 3, 2));      return NULL;    }    return $this->humanOutput($packages);  }  /**   * Display a package comparison as a text table.   *   * @param array $packages   *   A package comparison array.   *   * @return \Consolidation\OutputFormatters\StructuredData\RowsOfFields   *   */  protected function humanOutput($packages): RowsOfFields {    //$header = ['Name', 'Kind', 'Requirement', 'Version'];    $rows = [];    foreach ($packages as $kind => $kindPackages) {      foreach ($kindPackages as $package => $info) {        $rows["$package/$kind"] = [          'name' => $package,          'kind' => $kind,          'req' => $info['requirement'] ?? '',          'ver' => $info['version'] ?? '',        ];      }    }    ksort($rows);    return new RowsOfFields($rows);  }  /**   * @param string $jsonPath   *   * @return array   */  protected function decodeJsonPackages(string $jsonPath): array {    $json = json_decode(file_get_contents($jsonPath), TRUE);    $jsonPackages = $json['require'] ?? [];    $jsonDevPackages = $json['require-dev'] ?? [];    return ['run' => $jsonPackages, 'dev' => $jsonDevPackages];  }  protected function decodeLockPackages(string $lockPath): array {    $file = json_decode(file_get_contents($lockPath), TRUE);    $run = $file['packages'];    $dev = $file['packages-dev'];    $platform = $file['platform'];    array_walk($platform, function (&$requirement, $component) {      $requirement = [        'name' => $component,        'version' => $requirement,      ];    });    $run = array_merge($run, $platform);    $dev = array_merge($dev, $platform);    return ['run' => $run, 'dev' => $dev];  }  /**   * @param string $lockPath The lockPath command argument.   *   * @return string   *   * @throws \Exception   */  protected function validateJsonPath(string $lockPath): string {    $jsonPath = dirname($lockPath) . '/composer.json';    if (!is_file($jsonPath) && is_readable($jsonPath)) {      throw new \Exception("Cannot read composer.json file");    }    return $jsonPath;  }  /**   * @param string|null $lockPath The lockPath optional command argument.   *   * @return string|null The defaulted lock path.   *   * @throws \Exception If the defaulted lock path cannot be read.   */  protected function validateLockPath(?string $lockPath): ?string {    if (empty($lockPath)) {      $lockPath = dirname(DRUPAL_ROOT) . '/composer.lock';    }    if (!is_file($lockPath) && is_readable($lockPath)) {      throw new \Exception("Cannot read composer.lock file");    }    return $lockPath;  }}
 |