function LockFileValidator::validate

Checks that the active lock file is unchanged during stage operations.

Parameters

\Drupal\package_manager\Event\SandboxValidationEvent $event: The event being handled.

File

core/modules/package_manager/src/Validator/LockFileValidator.php, line 111

Class

LockFileValidator
Checks that the active lock file is unchanged during stage operations.

Namespace

Drupal\package_manager\Validator

Code

public function validate(SandboxValidationEvent $event) : void {
  $sandbox_manager = $event->sandboxManager;
  // If we're going to change the active directory directly, we don't need to
  // validate the lock file's consistency, since there is no separate
  // sandbox directory to compare against.
  if ($sandbox_manager->isDirectWrite()) {
    return;
  }
  // Early return if the stage is not already created.
  if ($event instanceof StatusCheckEvent && $sandbox_manager->isAvailable()) {
    return;
  }
  $messages = [];
  // Ensure we can get a current hash of the lock file.
  $active_lock_file_path = $this->pathLocator
    ->getProjectRoot() . DIRECTORY_SEPARATOR . 'composer.lock';
  $active_lock_file_hash = $this->getHash($active_lock_file_path);
  if (empty($active_lock_file_hash)) {
    $messages[] = $this->t('The active lock file (@file) does not exist.', [
      '@file' => $active_lock_file_path,
    ]);
  }
  // Ensure we also have a stored hash of the lock file.
  $active_lock_file_stored_hash = $this->keyValue
    ->get(static::KEY);
  if (empty($active_lock_file_stored_hash)) {
    throw new \LogicException('Stored hash key deleted.');
  }
  // If we have both hashes, ensure they match.
  if ($active_lock_file_hash && !hash_equals($active_lock_file_stored_hash, $active_lock_file_hash)) {
    $messages[] = $this->t('Unexpected changes were detected in the active lock file (@file), which indicates that other Composer operations were performed since this Package Manager operation started. This can put the code base into an unreliable state and therefore is not allowed.', [
      '@file' => $active_lock_file_path,
    ]);
  }
  // Don't allow staged changes to be applied if the staged lock file has no
  // apparent changes.
  if (empty($messages) && $event instanceof PreApplyEvent) {
    $staged_lock_file_path = $sandbox_manager->getSandboxDirectory() . DIRECTORY_SEPARATOR . 'composer.lock';
    $staged_lock_file_hash = $this->getHash($staged_lock_file_path);
    if ($staged_lock_file_hash && hash_equals($active_lock_file_hash, $staged_lock_file_hash)) {
      $messages[] = $this->t('There appear to be no pending Composer operations because the active lock file (@active_file) and the staged lock file (@staged_file) are identical.', [
        '@active_file' => $active_lock_file_path,
        '@staged_file' => $staged_lock_file_path,
      ]);
    }
  }
  if (!empty($messages)) {
    $summary = $this->formatPlural(count($messages), 'Problem detected in lock file during stage operations.', 'Problems detected in lock file during stage operations.');
    $event->addError($messages, $summary);
  }
}

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