function FixtureManipulator::addRepository

Adds a path repository.

Parameters

array $package: A Composer package definition. Must include the `name` and `type` keys.

Return value

string The repository path.

2 calls to FixtureManipulator::addRepository()
FixtureManipulator::addPackage in core/modules/package_manager/tests/modules/fixture_manipulator/src/FixtureManipulator.php
Adds a package.
FixtureManipulator::modifyPackageConfig in core/modules/package_manager/tests/modules/fixture_manipulator/src/FixtureManipulator.php
Modifies a package's composer.json properties.

File

core/modules/package_manager/tests/modules/fixture_manipulator/src/FixtureManipulator.php, line 602

Class

FixtureManipulator
Manipulates a test fixture using Composer commands.

Namespace

Drupal\fixture_manipulator

Code

private function addRepository(array $package) : string {
  $name = $package['name'];
  $path_repo_base = \Drupal::state()->get(self::PATH_REPO_STATE_KEY);
  $repo_path = "{$path_repo_base}/" . str_replace('/', '--', $name);
  // Determine if the given $package is a new package or a fork of an existing
  // one (that means it's either the same version but with other metadata, or
  // a new version with other metadata). Existing path repos are never
  // modified, not even if the same version of a package is assigned other
  // metadata. This allows always comparing with the original metadata.
  $is_new_or_fork = !is_dir($repo_path) ? 'new' : 'fork';
  if ($is_new_or_fork === 'fork') {
    $original_composer_json_path = $repo_path . DIRECTORY_SEPARATOR . 'composer.json';
    $original_repo_path = $repo_path;
    $original_composer_json_data = json_decode(file_get_contents($original_composer_json_path), TRUE, flags: JSON_THROW_ON_ERROR);
    $forked_composer_json_data = NestedArray::mergeDeep($original_composer_json_data, $package);
    if ($original_composer_json_data === $forked_composer_json_data) {
      throw new \LogicException(sprintf('Nothing is actually different in this fork of the package %s.', $package['name']));
    }
    $package = $forked_composer_json_data;
    $repo_path .= "--{$package['version']}";
    // Cannot create multiple forks with the same version. This is likely
    // due to a test simulating a failed Stage::apply().
    if (!is_dir($repo_path)) {
      $this->createPathRepo($package, $repo_path, $original_repo_path);
    }
  }
  else {
    $this->createPathRepo($package, $repo_path, NULL);
  }
  // Add the package to the Composer repository defined for the site.
  $packages_json = $this->dir . '/packages.json';
  $packages_data = file_get_contents($packages_json);
  $packages_data = json_decode($packages_data, TRUE, flags: JSON_THROW_ON_ERROR);
  $version = $package['version'];
  $package['dist'] = [
    'type' => 'path',
    'url' => $repo_path,
  ];
  $packages_data['packages'][$name][$version] = $package;
  assert(file_put_contents($packages_json, json_encode($packages_data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES)) !== FALSE);
  return $repo_path;
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.