From 3c9cfaf462f07fcd6888b4e32011dca377ca764d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ph=C3=A9na=20Proxima?= <adam@phenaproxima.net>
Date: Thu, 9 Jan 2025 19:55:19 -0500
Subject: [PATCH] Issue #3493335 by phenaproxima, catch, poker10, tim.plunkett,
 pameeela, yesct, damienmckenna, greggles: Change minimum-stability to stable
 for 1.0 release

---
 .ddev/commands/web/tag                        | 31 ++++++++----------
 .ddev/homeadditions/bin/adjust-constraints    | 16 ++++++++++
 .gitlab-ci.yml                                |  4 +++
 project_template/composer.json                | 32 +++++++++++--------
 .../composer.json                             |  2 +-
 recipes/drupal_cms_ai/composer.json           |  2 +-
 recipes/drupal_cms_analytics/composer.json    |  2 +-
 .../drupal_cms_authentication/composer.json   |  2 +-
 recipes/drupal_cms_blog/composer.json         |  2 +-
 recipes/drupal_cms_case_study/composer.json   |  2 +-
 .../composer.json                             |  4 +--
 recipes/drupal_cms_events/composer.json       |  6 ++--
 recipes/drupal_cms_forms/composer.json        |  4 +--
 .../drupal_cms_google_analytics/composer.json |  2 +-
 recipes/drupal_cms_news/composer.json         |  2 +-
 recipes/drupal_cms_page/composer.json         |  2 +-
 recipes/drupal_cms_person/composer.json       |  2 +-
 .../drupal_cms_privacy_basic/composer.json    |  2 +-
 recipes/drupal_cms_project/composer.json      |  2 +-
 recipes/drupal_cms_remote_video/composer.json |  2 +-
 recipes/drupal_cms_starter/composer.json      | 18 +++++------
 21 files changed, 80 insertions(+), 61 deletions(-)
 create mode 100755 .ddev/homeadditions/bin/adjust-constraints

diff --git a/.ddev/commands/web/tag b/.ddev/commands/web/tag
index dfc8c2cb3..391653d0d 100755
--- a/.ddev/commands/web/tag
+++ b/.ddev/commands/web/tag
@@ -13,8 +13,12 @@ if [ -z "$VERSION" ]; then
   exit 1
 fi
 
-# Find all `composer.json` files and change their `*` version constraints.
-find . -maxdepth 3 -type f -name composer.json -exec sed --in-place "s/\"\*\"/\"~$VERSION\"/g" {} ';'
+COMPONENTS=$(find $PWD -maxdepth 2 -type d -name 'drupal_cms_*' -or -name project_template)
+
+# Change all components' version constraints.
+for dir in $COMPONENTS; do
+  adjust-constraints $dir "~$VERSION"
+done
 
 # Generate pre-parsed versions of the recipes available to the installer,
 # and store them in a serialized file format for one-time use. This greatly
@@ -23,24 +27,13 @@ cd $DDEV_DOCROOT
 ./profiles/drupal_cms_installer/build-cache.sh
 cd -
 
-# Bump the minimum stability of the project template and ensure it correctly
-# conflicts with `drupal/drupal`.
-cd project_template
-composer config minimum-stability beta
-jq --indent 4 '.conflict."drupal/drupal" = "*"' composer.json > tag.json
-mv -f tag.json composer.json
-cd -
-
-# For visbility, output every line we're executing, as interpreted by the shell.
-set -x
-
-# Remove any untracked files.
-git clean -d --force
+# Bump the minimum stability of the project template.
+composer config minimum-stability stable --working-dir=project_template
 
 # Stage all changes, but if we're just testing this script, don't actually commit
 # or tag anything.
-git add .
-if [[ "$VERSION" == "test" ]]; then
+git add $COMPONENTS
+if [[ $2 == "test" ]]; then
   exit 0
 fi
 
@@ -49,5 +42,7 @@ git commit --message=$VERSION
 git tag $VERSION
 
 # Make another commit that puts this branch back into its pre-tagged state.
-find . -maxdepth 2 -type d -name 'drupal_cms_*' -or -name project_template -exec git checkout HEAD^1 {} ';'
+for dir in $COMPONENTS; do
+  git checkout HEAD^1 $dir
+done
 git commit --all --message="Back to dev."
diff --git a/.ddev/homeadditions/bin/adjust-constraints b/.ddev/homeadditions/bin/adjust-constraints
new file mode 100755
index 000000000..a195e7e7c
--- /dev/null
+++ b/.ddev/homeadditions/bin/adjust-constraints
@@ -0,0 +1,16 @@
+#!/usr/bin/env bash
+
+# Alters dependency constraints for Drupal CMS components required by a
+# given `composer.json` file.
+# Usage: adjust-constraints path/to/component <constraint>
+# Example: adjust-constraints project_template "~1.2.3"
+
+DIR=$1
+
+DEPENDENCIES=$(jq -r '.require | keys | .[] | select(startswith("drupal/drupal_cms_"))' $DIR/composer.json)
+
+echo "Adjusting constraints in $DIR."
+
+for package in $DEPENDENCIES; do
+  composer require --quiet --no-update --working-dir=$DIR "$package:$2"
+done
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 0f8d1418e..f3de319b1 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -108,6 +108,10 @@ default:
 build test project:
   stage: test
   script:
+    # If this is a merge request branch, ensure that any recipe which requires the
+    # target branch (e.g., `"drupal/drupal_cms_ai": "1.x-dev"`) will know to refer
+    # to the detached HEAD we're operating from.
+    - if [ $CI_PIPELINE_SOURCE == "merge_request_event" ]; then find . -maxdepth 2 -type d -name 'drupal_cms_*' -exec composer config extra.branch-alias.dev-$CI_COMMIT_SHA $CI_MERGE_REQUEST_TARGET_BRANCH_NAME-dev --working-dir={} ';' ; fi
     - *create-project
     # Generate `composer.json` by merging our dev requirements into the project template.
     - .ddev/homeadditions/bin/generate-composer-json > $BUILD_DIR/composer.json
diff --git a/project_template/composer.json b/project_template/composer.json
index 00f609085..f779170f1 100644
--- a/project_template/composer.json
+++ b/project_template/composer.json
@@ -19,20 +19,24 @@
         "drupal/core-composer-scaffold": "^11.1.1",
         "drupal/core-project-message": "^11.1.1",
         "drupal/core-recommended": "^11.1.1",
-        "drupal/drupal_cms_starter": "*",
-        "drupal/drupal_cms_analytics": "*",
-        "drupal/drupal_cms_accessibility_tools": "*",
-        "drupal/drupal_cms_ai": "*",
-        "drupal/drupal_cms_blog": "*",
-        "drupal/drupal_cms_case_study": "*",
-        "drupal/drupal_cms_events": "*",
-        "drupal/drupal_cms_forms": "*",
-        "drupal/drupal_cms_news": "*",
-        "drupal/drupal_cms_person": "*",
-        "drupal/drupal_cms_project": "*",
-        "drupal/drupal_cms_seo_tools": "*",
-        "drush/drush": "^13",
-        "drupal/project_browser": "@alpha"
+        "drupal/dashboard": "@beta",
+        "drupal/drupal_cms_accessibility_tools": "1.0.x-dev",
+        "drupal/drupal_cms_ai": "1.0.x-dev",
+        "drupal/drupal_cms_analytics": "1.0.x-dev",
+        "drupal/drupal_cms_blog": "1.0.x-dev",
+        "drupal/drupal_cms_case_study": "1.0.x-dev",
+        "drupal/drupal_cms_events": "1.0.x-dev",
+        "drupal/drupal_cms_forms": "1.0.x-dev",
+        "drupal/drupal_cms_news": "1.0.x-dev",
+        "drupal/drupal_cms_page": "1.0.x-dev",
+        "drupal/drupal_cms_person": "1.0.x-dev",
+        "drupal/drupal_cms_project": "1.0.x-dev",
+        "drupal/drupal_cms_seo_tools": "1.0.x-dev",
+        "drupal/drupal_cms_starter": "1.0.x-dev",
+        "drupal/klaro": "@rc",
+        "drupal/project_browser": "@alpha",
+        "drupal/webform": "@beta",
+        "drush/drush": "^13"
     },
     "conflict": {
         "drupal/drupal": "*"
diff --git a/recipes/drupal_cms_accessibility_tools/composer.json b/recipes/drupal_cms_accessibility_tools/composer.json
index 083c7db68..71dd69725 100644
--- a/recipes/drupal_cms_accessibility_tools/composer.json
+++ b/recipes/drupal_cms_accessibility_tools/composer.json
@@ -5,7 +5,7 @@
     "license": ["GPL-2.0-or-later"],
     "require": {
         "drupal/core": ">=10.3",
-        "drupal/drupal_cms_page": "*",
+        "drupal/drupal_cms_page": "1.0.x-dev",
         "drupal/editoria11y": "^2.2"
     }
 }
diff --git a/recipes/drupal_cms_ai/composer.json b/recipes/drupal_cms_ai/composer.json
index 18361abf3..75d4e22b0 100644
--- a/recipes/drupal_cms_ai/composer.json
+++ b/recipes/drupal_cms_ai/composer.json
@@ -10,7 +10,7 @@
     "drupal/ai_image_alt_text": "^1",
     "drupal/ai_provider_anthropic": "^1",
     "drupal/ai_provider_openai": "^1",
-    "drupal/drupal_cms_privacy_basic": "*",
+    "drupal/drupal_cms_privacy_basic": "1.0.x-dev",
     "league/commonmark": "^2.4"
   }
 }
diff --git a/recipes/drupal_cms_analytics/composer.json b/recipes/drupal_cms_analytics/composer.json
index c3efee2a6..b2da6f3b8 100644
--- a/recipes/drupal_cms_analytics/composer.json
+++ b/recipes/drupal_cms_analytics/composer.json
@@ -3,6 +3,6 @@
     "type": "metapackage",
     "description": "Adds recipes for tracking website traffic.",
     "require": {
-        "drupal/drupal_cms_google_analytics": "*"
+        "drupal/drupal_cms_google_analytics": "1.0.x-dev"
     }
 }
diff --git a/recipes/drupal_cms_authentication/composer.json b/recipes/drupal_cms_authentication/composer.json
index ef7bdc1ad..61a8fcb20 100644
--- a/recipes/drupal_cms_authentication/composer.json
+++ b/recipes/drupal_cms_authentication/composer.json
@@ -6,7 +6,7 @@
     "require": {
         "drupal/bpmn_io": "^2.0.3",
         "drupal/core": ">=10.3",
-        "drupal/eca": "^2.1.0",
+        "drupal/eca": "^2.1",
         "drupal/login_emailusername": "^3",
         "drupal/token": "^1"
     }
diff --git a/recipes/drupal_cms_blog/composer.json b/recipes/drupal_cms_blog/composer.json
index c1030e403..4d9aa147e 100644
--- a/recipes/drupal_cms_blog/composer.json
+++ b/recipes/drupal_cms_blog/composer.json
@@ -6,7 +6,7 @@
     "require": {
         "drupal/core": ">=10.4",
         "drupal/add_content_by_bundle": "^1.2.2",
-        "drupal/drupal_cms_page": "*",
+        "drupal/drupal_cms_page": "1.0.x-dev",
         "drupal/better_exposed_filters": "^7",
         "drupal/selective_better_exposed_filters": "^3"
     }
diff --git a/recipes/drupal_cms_case_study/composer.json b/recipes/drupal_cms_case_study/composer.json
index 8226f3760..48c7939df 100644
--- a/recipes/drupal_cms_case_study/composer.json
+++ b/recipes/drupal_cms_case_study/composer.json
@@ -6,6 +6,6 @@
     "require": {
         "drupal/core": ">=10.4",
         "drupal/add_content_by_bundle": "^1.2.2",
-        "drupal/drupal_cms_page": "*"
+        "drupal/drupal_cms_page": "1.0.x-dev"
     }
 }
diff --git a/recipes/drupal_cms_content_type_base/composer.json b/recipes/drupal_cms_content_type_base/composer.json
index 7a35b782d..5df238a1a 100644
--- a/recipes/drupal_cms_content_type_base/composer.json
+++ b/recipes/drupal_cms_content_type_base/composer.json
@@ -7,8 +7,8 @@
         "drupal/autosave_form": "^1.7",
         "drupal/bpmn_io": "^2.0.3",
         "drupal/core": ">=10.4",
-        "drupal/drupal_cms_image": "*",
-        "drupal/eca": "^2.1.0",
+        "drupal/drupal_cms_image": "1.0.x-dev",
+        "drupal/eca": "^2.1",
         "drupal/linkit": "^7",
         "drupal/pathauto": "^1.13",
         "drupal/token": "^1",
diff --git a/recipes/drupal_cms_events/composer.json b/recipes/drupal_cms_events/composer.json
index 3e58bb6c5..aa2198f9a 100644
--- a/recipes/drupal_cms_events/composer.json
+++ b/recipes/drupal_cms_events/composer.json
@@ -7,9 +7,9 @@
     "drupal/core": ">=10.4",
     "drupal/add_content_by_bundle": "^1.2.2",
     "drupal/address": "^2",
-    "drupal/addtocal_augment": "^1.2@rc",
-    "drupal/drupal_cms_page": "*",
-    "drupal/drupal_cms_privacy_basic": "*",
+    "drupal/addtocal_augment": "^1.2.3",
+    "drupal/drupal_cms_page": "1.0.x-dev",
+    "drupal/drupal_cms_privacy_basic": "1.0.x-dev",
     "drupal/geocoder": "^4.10",
     "drupal/geofield": "^1.47",
     "drupal/leaflet": "^10.2.33",
diff --git a/recipes/drupal_cms_forms/composer.json b/recipes/drupal_cms_forms/composer.json
index de1f28288..95c112932 100644
--- a/recipes/drupal_cms_forms/composer.json
+++ b/recipes/drupal_cms_forms/composer.json
@@ -4,8 +4,8 @@
     "type": "drupal-recipe",
     "license": ["GPL-2.0-or-later"],
     "require": {
-        "drupal/drupal_cms_anti_spam": "*",
-        "drupal/drupal_cms_page": "*",
+        "drupal/drupal_cms_anti_spam": "1.0.x-dev",
+        "drupal/drupal_cms_page": "1.0.x-dev",
         "drupal/core": ">=10.4",
         "drupal/webform": "^6.3-beta1"
     }
diff --git a/recipes/drupal_cms_google_analytics/composer.json b/recipes/drupal_cms_google_analytics/composer.json
index c242c2ddb..ad4de9bc8 100644
--- a/recipes/drupal_cms_google_analytics/composer.json
+++ b/recipes/drupal_cms_google_analytics/composer.json
@@ -5,6 +5,6 @@
     "require": {
         "drupal/core": ">=10.4",
         "drupal/google_tag": "^2.0.7",
-        "drupal/drupal_cms_privacy_basic": "*"
+        "drupal/drupal_cms_privacy_basic": "1.0.x-dev"
     }
 }
diff --git a/recipes/drupal_cms_news/composer.json b/recipes/drupal_cms_news/composer.json
index a38f4e2fe..486f63cd6 100644
--- a/recipes/drupal_cms_news/composer.json
+++ b/recipes/drupal_cms_news/composer.json
@@ -6,7 +6,7 @@
     "require": {
         "drupal/core": ">=10.4",
         "drupal/add_content_by_bundle": "^1.2.2",
-        "drupal/drupal_cms_page": "*",
+        "drupal/drupal_cms_page": "1.0.x-dev",
         "drupal/better_exposed_filters": "^7",
         "drupal/selective_better_exposed_filters": "^3"
     }
diff --git a/recipes/drupal_cms_page/composer.json b/recipes/drupal_cms_page/composer.json
index 6232b87db..9f4d88f22 100644
--- a/recipes/drupal_cms_page/composer.json
+++ b/recipes/drupal_cms_page/composer.json
@@ -5,6 +5,6 @@
     "license": ["GPL-2.0-or-later"],
     "require": {
         "drupal/core": ">=10.4",
-        "drupal/drupal_cms_content_type_base": "*"
+        "drupal/drupal_cms_content_type_base": "1.0.x-dev"
     }
 }
diff --git a/recipes/drupal_cms_person/composer.json b/recipes/drupal_cms_person/composer.json
index 1c6e1ea24..5ba5790a3 100644
--- a/recipes/drupal_cms_person/composer.json
+++ b/recipes/drupal_cms_person/composer.json
@@ -5,6 +5,6 @@
     "license": ["GPL-2.0-or-later"],
     "require": {
         "drupal/core": ">=10.4",
-        "drupal/drupal_cms_content_type_base": "*"
+        "drupal/drupal_cms_content_type_base": "1.0.x-dev"
     }
 }
diff --git a/recipes/drupal_cms_privacy_basic/composer.json b/recipes/drupal_cms_privacy_basic/composer.json
index 705fbda80..329283e26 100644
--- a/recipes/drupal_cms_privacy_basic/composer.json
+++ b/recipes/drupal_cms_privacy_basic/composer.json
@@ -7,7 +7,7 @@
         "drupal/bpmn_io": "^2.0.3",
         "drupal/core": ">=10.4",
         "drupal/eca": "^2.1",
-        "drupal/drupal_cms_page": "*",
+        "drupal/drupal_cms_page": "1.0.x-dev",
         "drupal/klaro": "^3-rc16",
         "drupal/menu_link_attributes": "^1.5"
     }
diff --git a/recipes/drupal_cms_project/composer.json b/recipes/drupal_cms_project/composer.json
index 2debc5605..e2cabb54f 100644
--- a/recipes/drupal_cms_project/composer.json
+++ b/recipes/drupal_cms_project/composer.json
@@ -6,6 +6,6 @@
     "require": {
         "drupal/core": ">=10.4",
         "drupal/add_content_by_bundle": "^1.2.2",
-        "drupal/drupal_cms_page": "*"
+        "drupal/drupal_cms_page": "1.0.x-dev"
     }
 }
diff --git a/recipes/drupal_cms_remote_video/composer.json b/recipes/drupal_cms_remote_video/composer.json
index 312e265b3..04a7e73ed 100644
--- a/recipes/drupal_cms_remote_video/composer.json
+++ b/recipes/drupal_cms_remote_video/composer.json
@@ -5,6 +5,6 @@
     "license": ["GPL-2.0-or-later"],
     "require": {
         "drupal/core": ">=10.4",
-        "drupal/drupal_cms_privacy_basic": "*"
+        "drupal/drupal_cms_privacy_basic": "1.0.x-dev"
     }
 }
diff --git a/recipes/drupal_cms_starter/composer.json b/recipes/drupal_cms_starter/composer.json
index 53372dd03..37ac0d85c 100644
--- a/recipes/drupal_cms_starter/composer.json
+++ b/recipes/drupal_cms_starter/composer.json
@@ -9,15 +9,15 @@
         "drupal/core": ">=10.4",
         "drupal/eca": "^2.1",
         "drupal/dashboard": "^2-beta1",
-        "drupal/drupal_cms_admin_ui": "*",
-        "drupal/drupal_cms_anti_spam": "*",
-        "drupal/drupal_cms_authentication": "*",
-        "drupal/drupal_cms_olivero": "*",
-        "drupal/drupal_cms_page": "*",
-        "drupal/drupal_cms_privacy_basic": "*",
-        "drupal/drupal_cms_remote_video": "*",
-        "drupal/drupal_cms_search": "*",
-        "drupal/drupal_cms_seo_basic": "*",
+        "drupal/drupal_cms_admin_ui": "1.0.x-dev",
+        "drupal/drupal_cms_anti_spam": "1.0.x-dev",
+        "drupal/drupal_cms_authentication": "1.0.x-dev",
+        "drupal/drupal_cms_olivero": "1.0.x-dev",
+        "drupal/drupal_cms_page": "1.0.x-dev",
+        "drupal/drupal_cms_privacy_basic": "1.0.x-dev",
+        "drupal/drupal_cms_remote_video": "1.0.x-dev",
+        "drupal/drupal_cms_search": "1.0.x-dev",
+        "drupal/drupal_cms_seo_basic": "1.0.x-dev",
         "drupal/easy_email_express": "^1.0.2",
         "drupal/project_browser": "^2-alpha7",
         "drupal/token": "^1"
-- 
GitLab