From e5a67b91bb770f9473807281cb3ab3c39a674eed Mon Sep 17 00:00:00 2001 From: catch <6915-catch@users.noreply.drupalcode.org> Date: Wed, 15 Jan 2025 12:02:00 +0000 Subject: [PATCH] Issue #3220784 by berdir, johnchque, mathilde_dumond, dww, quietone: ContentEntityBase::createDuplicate() should reset default revision flag --- core/lib/Drupal/Core/Entity/ContentEntityBase.php | 4 ++++ .../Core/Entity/EntityDuplicateTest.php | 14 ++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/core/lib/Drupal/Core/Entity/ContentEntityBase.php b/core/lib/Drupal/Core/Entity/ContentEntityBase.php index 4e8bf52cc751..3b658a7ed35e 100644 --- a/core/lib/Drupal/Core/Entity/ContentEntityBase.php +++ b/core/lib/Drupal/Core/Entity/ContentEntityBase.php @@ -1200,7 +1200,11 @@ public function createDuplicate() { if ($entity_type->hasKey('id')) { $duplicate->{$entity_type->getKey('id')}->value = NULL; } + // Explicitly mark the entity as new and the default revision. A new entity + // is always the default revision, but that persists only until the entity + // is saved. $duplicate->enforceIsNew(); + $duplicate->isDefaultRevision(TRUE); // Check if the entity type supports UUIDs and generate a new one if so. if ($entity_type->hasKey('uuid')) { diff --git a/core/tests/Drupal/KernelTests/Core/Entity/EntityDuplicateTest.php b/core/tests/Drupal/KernelTests/Core/Entity/EntityDuplicateTest.php index a1b32dd60c32..fce299acd485 100644 --- a/core/tests/Drupal/KernelTests/Core/Entity/EntityDuplicateTest.php +++ b/core/tests/Drupal/KernelTests/Core/Entity/EntityDuplicateTest.php @@ -44,7 +44,13 @@ public function testDuplicateNonDefaultRevision(): void { $duplicate_first_revision = $this->entityTestRevStorage->loadRevision($first_revision_id)->createDuplicate(); $this->assertTrue($duplicate_first_revision->isDefaultRevision(), 'Duplicating a non-default revision creates a default revision.'); $this->assertEquals('First Revision', $duplicate_first_revision->label()); + $this->assertTrue($duplicate_first_revision->isNew()); + $this->assertTrue($duplicate_first_revision->isNewRevision()); + $this->assertTrue($duplicate_first_revision->isDefaultRevision()); $duplicate_first_revision->save(); + $this->assertFalse($duplicate_first_revision->isNew()); + $this->assertFalse($duplicate_first_revision->isNewRevision()); + $this->assertTrue($duplicate_first_revision->isDefaultRevision()); $duplicate_first_revision->name = 'Updated name'; $duplicate_first_revision->save(); @@ -52,6 +58,14 @@ public function testDuplicateNonDefaultRevision(): void { $this->entityTestRevStorage->resetCache(); $duplicate_first_revision = EntityTestRev::load($duplicate_first_revision->id()); $this->assertEquals('Updated name', $duplicate_first_revision->label()); + + // Also ensure the base table storage by doing an entity query for the + // updated name field. + $results = \Drupal::entityQuery('entity_test_rev') + ->condition('name', 'Updated name') + ->accessCheck(FALSE) + ->execute(); + $this->assertEquals([$duplicate_first_revision->getRevisionId() => $duplicate_first_revision->id()], $results); } } -- GitLab