diff --git a/package_manager/package_manager.install b/package_manager/package_manager.install index a533010e3cd6b86ecbc22a298d0f60455c77e834..065a1ebbdc0b71925b516a5171b995eacf4c8ee7 100644 --- a/package_manager/package_manager.install +++ b/package_manager/package_manager.install @@ -5,6 +5,8 @@ * Contains install and update functions for Package Manager. */ +use Drupal\package_manager\Exception\ApplyFailedException; + /** * Implements hook_requirements(). */ @@ -25,5 +27,22 @@ function package_manager_requirements(string $phase) { 'severity' => REQUIREMENT_WARNING, ]; } + + // If we're able to check for the presence of the failure marker at all, do it + // irrespective of the current run phase. If the failure marker is there, the + // site is in an indeterminate state and should be restored from backup ASAP. + $service_id = 'package_manager.failure_marker'; + if (\Drupal::hasService($service_id)) { + try { + \Drupal::service($service_id)->assertNotExists(); + } + catch (ApplyFailedException $exception) { + $requirements['package_manager_failure_marker'] = [ + 'title' => t('Failed update detected'), + 'description' => $exception->getMessage(), + 'severity' => REQUIREMENT_ERROR, + ]; + } + } return $requirements; } diff --git a/package_manager/tests/src/Functional/FailureMarkerRequirementTest.php b/package_manager/tests/src/Functional/FailureMarkerRequirementTest.php new file mode 100644 index 0000000000000000000000000000000000000000..578b1cf85c1e5e87a6ee131466e6f7013252f60d --- /dev/null +++ b/package_manager/tests/src/Functional/FailureMarkerRequirementTest.php @@ -0,0 +1,53 @@ +<?php + +namespace Drupal\Tests\package_manager\Functional; + +use Drupal\package_manager\Stage; +use Drupal\Tests\BrowserTestBase; + +/** + * Tests that Package Manager's requirements check for the failure marker. + * + * @group package_manager + */ +class FailureMarkerRequirementTest extends BrowserTestBase { + + /** + * {@inheritdoc} + */ + protected static $modules = [ + 'package_manager', + 'package_manager_bypass', + ]; + + /** + * {@inheritdoc} + */ + protected $defaultTheme = 'stark'; + + /** + * Tests that error is shown if failure marker already exists. + */ + public function testFailureMarkerExists() { + $account = $this->drupalCreateUser([ + 'administer site configuration', + ]); + $this->drupalLogin($account); + + $this->container->get('package_manager.path_locator') + ->setPaths($this->publicFilesDirectory, NULL, NULL, NULL); + + $failure_marker = $this->container->get('package_manager.failure_marker'); + $message = 'Package Manager is here to wreck your day.'; + $failure_marker->write($this->createMock(Stage::class), $message); + $path = $failure_marker->getPath(); + $this->assertFileExists($path); + $this->assertStringStartsWith($this->publicFilesDirectory, $path); + + $this->drupalGet('/admin/reports/status'); + $assert_session = $this->assertSession(); + $assert_session->pageTextContains('Failed update detected'); + $assert_session->pageTextContains($message); + } + +}