From 8f44f19cada4ec40e20b91579b180d3ee8a4c006 Mon Sep 17 00:00:00 2001
From: rahul_ <rahul_gupta@3278723.no-reply.drupal.org>
Date: Wed, 2 Nov 2022 16:18:47 +0000
Subject: [PATCH] Issue #3310666 by tedbow, kunal.sachdev, rahul_,
 phenaproxima, Shabbir, siramsay: UpdaterForm throws an exception if you try
 to update to the next minor beta

---
 .../release-history/drupal.9.8.0-beta1.xml    | 77 +++++++++++++++++++
 src/Form/UpdaterForm.php                      | 26 +++++--
 tests/src/Functional/UpdaterFormTest.php      | 16 ++++
 3 files changed, 111 insertions(+), 8 deletions(-)
 create mode 100644 package_manager/tests/fixtures/release-history/drupal.9.8.0-beta1.xml

diff --git a/package_manager/tests/fixtures/release-history/drupal.9.8.0-beta1.xml b/package_manager/tests/fixtures/release-history/drupal.9.8.0-beta1.xml
new file mode 100644
index 0000000000..d95cabcc79
--- /dev/null
+++ b/package_manager/tests/fixtures/release-history/drupal.9.8.0-beta1.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+Contains metadata about the following (fake) releases of Drupal core, in order:
+* 9.8.0-beta1
+* 9.7.0
+* 9.8.x-dev
+-->
+<project xmlns:dc="http://purl.org/dc/elements/1.1/">
+    <title>Drupal</title>
+    <short_name>drupal</short_name>
+    <dc:creator>Drupal</dc:creator>
+    <supported_branches>9.8.,9.7.</supported_branches>
+    <project_status>published</project_status>
+    <link>http://example.com/project/drupal</link>
+    <terms>
+        <term>
+            <name>Projects</name>
+            <value>Drupal project</value>
+        </term>
+    </terms>
+    <releases>
+        <release>
+          <name>Drupal 9.8.0-beta1</name>
+          <version>9.8.0-beta1</version>
+          <status>published</status>
+          <release_link>http://example.com/drupal-9-8-0-beta1-release</release_link>
+          <download_link>http://example.com/drupal-9-8-0-beta1-.tar.gz</download_link>
+          <date>1250424521</date>
+          <terms>
+            <term>
+              <name>Release type</name>
+              <value>New features</value>
+            </term>
+            <term>
+              <name>Release type</name>
+              <value>Bug fixes</value>
+            </term>
+          </terms>
+        </release>
+        <release>
+            <name>Drupal 9.7.0</name>
+            <version>9.7.0</version>
+            <status>published</status>
+            <release_link>http://example.com/drupal-9-7-0-release</release_link>
+            <download_link>http://example.com/drupal-9-7-0.tar.gz</download_link>
+            <date>1250424521</date>
+            <terms>
+                <term>
+                    <name>Release type</name>
+                    <value>New features</value>
+                </term>
+                <term>
+                    <name>Release type</name>
+                    <value>Bug fixes</value>
+                </term>
+            </terms>
+        </release>
+        <release>
+            <name>Drupal 9.8.x-dev</name>
+            <version>9.8.x-dev</version>
+            <status>published</status>
+            <release_link>http://example.com/drupal-9-8-x-dex-release</release_link>
+            <download_link>http://example.com/drupal-9-8-x-dex.tar.gz</download_link>
+            <date>1250424521</date>
+            <terms>
+                <term>
+                    <name>Release type</name>
+                    <value>New features</value>
+                </term>
+                <term>
+                    <name>Release type</name>
+                    <value>Bug fixes</value>
+                </term>
+            </terms>
+        </release>
+    </releases>
+</project>
diff --git a/src/Form/UpdaterForm.php b/src/Form/UpdaterForm.php
index ba57131731..fd7c5a78da 100644
--- a/src/Form/UpdaterForm.php
+++ b/src/Form/UpdaterForm.php
@@ -314,18 +314,28 @@ final class UpdaterForm extends UpdateFormBase {
         $first_release_version = $release_version->getMajorVersion() . '.' . $release_version->getMinorVersion() . '.0';
         $available_updates = update_get_available(TRUE);
 
-        // @todo In https://www.drupal.org/i/3310666 handle if the .0 release is
-        //   not available, and only pre-releases are available.
-        $next_minor_first_release = ProjectRelease::createFromArray($available_updates['drupal']['releases'][$first_release_version]);
+        // If the `.0` patch release of this minor is available link to its
+        // release notes because this will document the most important changes
+        // in this minor.
+        if (isset($available_updates['drupal']['releases'][$first_release_version])) {
+          $next_minor_first_release = ProjectRelease::createFromArray($available_updates['drupal']['releases'][$first_release_version]);
+          $caption = $this->t('Latest version of Drupal @major.@minor (next minor) (<a href=":url">Release notes</a>):', [
+            '@major' => $release_version->getMajorVersion(),
+            '@minor' => $release_version->getMinorVersion(),
+            ':url' => $next_minor_first_release->getReleaseUrl(),
+          ]);
+        }
+        else {
+          $caption = $this->t('Latest version of Drupal @major.@minor (next minor):', [
+            '@major' => $release_version->getMajorVersion(),
+            '@minor' => $release_version->getMinorVersion(),
+          ]);
+        }
 
         $form["next_minor_$next_minor_release_count"] = $this->createReleaseTable(
           $release,
           $installed_minor_release ? $this->t('Minor update') : $release_status,
-          $this->t('Latest version of Drupal @major.@minor (next minor) (<a href=":url">Release notes</a>):', [
-            '@major' => $release_version->getMajorVersion(),
-            '@minor' => $release_version->getMinorVersion(),
-            ':url' => $next_minor_first_release->getReleaseUrl(),
-          ]),
+          $caption,
           $installed_minor_release ? 'update-optional' : $type,
           $create_update_buttons,
           $is_primary
diff --git a/tests/src/Functional/UpdaterFormTest.php b/tests/src/Functional/UpdaterFormTest.php
index 03942b99e7..ad6f42d3c7 100644
--- a/tests/src/Functional/UpdaterFormTest.php
+++ b/tests/src/Functional/UpdaterFormTest.php
@@ -259,6 +259,22 @@ class UpdaterFormTest extends AutomaticUpdatesFunctionalTestBase {
     $assert_session->pageTextContains($message);
   }
 
+  /**
+   * Checks pre-releases of the next minor are available on the form.
+   */
+  public function testNextMinorPreRelease(): void {
+    $this->setReleaseMetadata(__DIR__ . '/../../../package_manager/tests/fixtures/release-history/drupal.9.8.0-beta1.xml');
+    $this->setCoreVersion('9.7.0');
+    $this->config('automatic_updates.settings')
+      ->set('allow_core_minor_updates', TRUE)
+      ->save();
+    $this->checkForUpdates();
+    $this->drupalGet('/admin/reports/updates/automatic-update');
+    $assert_session = $this->assertSession();
+    $this->checkReleaseTable('#edit-next-minor-1', '.update-update-recommended', '9.8.0-beta1', FALSE, 'Latest version of Drupal 9.8 (next minor):');
+    $assert_session->pageTextContainsOnce('Currently installed: 9.7.0 (Up to date)');
+  }
+
   /**
    * Checks the table for a release on the form.
    *
-- 
GitLab