function UnknownPathExcluder::getExcludedPaths

Returns the paths to exclude from stage operations.

Return value

string[] The paths that should be excluded from stage operations, relative to the project root.

Throws

\Exception See \Drupal\package_manager\ComposerInspector::validate().

2 calls to UnknownPathExcluder::getExcludedPaths()
UnknownPathExcluder::excludeUnknownPaths in core/modules/package_manager/src/PathExcluder/UnknownPathExcluder.php
Excludes unknown paths from stage operations.
UnknownPathExcluder::logExcludedPaths in core/modules/package_manager/src/PathExcluder/UnknownPathExcluder.php
Logs the paths that will be excluded from stage operations.

File

core/modules/package_manager/src/PathExcluder/UnknownPathExcluder.php, line 76

Class

UnknownPathExcluder
Excludes unknown paths from stage operations.

Namespace

Drupal\package_manager\PathExcluder

Code

private function getExcludedPaths() : array {
  // If this excluder is disabled, or the project root and web root are the
  // same, we are not excluding any paths.
  $is_disabled = $this->configFactory
    ->get('package_manager.settings')
    ->get('include_unknown_files_in_project_root');
  $web_root = $this->pathLocator
    ->getWebRoot();
  if ($is_disabled || empty($web_root)) {
    return [];
  }
  // To determine the files to include, the installed packages must be known,
  // and that requires Composer commands to be able to run. This intentionally
  // does not catch exceptions: failed Composer validation in the project root
  // implies that this excluder cannot function correctly. In such a case, the
  // call to ComposerInspector::getConfig() would also have triggered an
  // exception, but explicitness is preferred here.
  // @see \Drupal\package_manager\StatusCheckTrait::runStatusCheck()
  $project_root = $this->pathLocator
    ->getProjectRoot();
  $this->composerInspector
    ->validate($project_root);
  // The vendor directory and web root are always included in staging
  // operations, along with `composer.json`, `composer.lock`, and any scaffold
  // files provided by Drupal core.
  $always_include = [
    $this->composerInspector
      ->getConfig('vendor-dir', $project_root),
    $web_root,
    'composer.json',
    'composer.lock',
  ];
  foreach ($this->getScaffoldFiles() as $scaffold_file_path) {
    // The web root is always included in staging operations, so we don't need
    // to do anything special for scaffold files that live in it.
    if (str_starts_with($scaffold_file_path, '[web-root]')) {
      continue;
    }
    $always_include[] = ltrim($scaffold_file_path, '/');
  }
  // Find any path repositories located inside the project root. These need
  // to be included or Composer will break in the staging area.
  $repositories = $this->composerInspector
    ->getConfig('repositories', $project_root);
  $repositories = Json::decode($repositories);
  foreach ($repositories as $repository) {
    if ($repository['type'] !== 'path') {
      continue;
    }
    try {
      // Ensure $path is relative to the project root, even if it's written as
      // an absolute path in `composer.json`.
      $path = Path::makeRelative($repository['url'], $project_root);
      // Strip off everything except the top-level directory name. For
      // example, if the repository path is `custom/module/foo`, always
      // include `custom`.
      $always_include[] = dirname($path, substr_count($path, '/') ?: 1);
    } catch (InvalidArgumentException) {
      // The repository path is not relative to the project root, so we don't
      // need to worry about it.
    }
  }
  // Search for all files (including hidden ones) in the project root. We need
  // to use readdir() and friends here, rather than glob(), since certain
  // glob() flags aren't supported on all systems. We also can't use
  // \Drupal\Core\File\FileSystemInterface::scanDirectory(), because it
  // unconditionally ignores hidden files and directories.
  $files_in_project_root = [];
  $handle = opendir($project_root);
  if (empty($handle)) {
    throw new \RuntimeException("Could not scan for files in the project root.");
  }
  while ($entry = readdir($handle)) {
    $files_in_project_root[] = $entry;
  }
  closedir($handle);
  return array_diff($files_in_project_root, $always_include, [
    '.',
    '..',
  ]);
}

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