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