From 886ee4e3557c9a109a1992fada64700617512bf9 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 (cherry picked from commit e5a67b91bb770f9473807281cb3ab3c39a674eed) --- 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 bb3d3aea83e7..3724bf94cee3 100644 --- a/core/lib/Drupal/Core/Entity/ContentEntityBase.php +++ b/core/lib/Drupal/Core/Entity/ContentEntityBase.php @@ -1184,7 +1184,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