SDL: build-scripts: Added update-version.sh (15496)

From 15496201c931bb1aecf38ce16e129d37587fcc01 Mon Sep 17 00:00:00 2001
From: "Ryan C. Gordon" <[EMAIL REDACTED]>
Date: Tue, 27 Sep 2022 22:03:26 -0400
Subject: [PATCH] build-scripts: Added update-version.sh

Fixes #6171.

(cherry picked from commit 8e14647759da0fbe90b32a798f55c58a406f1a69)
---
 build-scripts/update-version.sh | 88 +++++++++++++++++++++++++++++++++
 docs/release_checklist.md       | 54 +++++---------------
 2 files changed, 99 insertions(+), 43 deletions(-)
 create mode 100755 build-scripts/update-version.sh

diff --git a/build-scripts/update-version.sh b/build-scripts/update-version.sh
new file mode 100755
index 000000000000..d7036959716a
--- /dev/null
+++ b/build-scripts/update-version.sh
@@ -0,0 +1,88 @@
+#!/bin/sh
+
+#set -x
+
+cd `dirname $0`/..
+
+ARGSOKAY=1
+if [ -z $1 ]; then
+    ARGSOKAY=0
+fi
+if [ -z $2 ]; then
+    ARGSOKAY=0
+fi
+if [ -z $3 ]; then
+    ARGSOKAY=0
+fi
+
+if [ "x$ARGSOKAY" = "x0" ]; then
+    echo "USAGE: $0 <major> <minor> <patch>" 1>&2
+    exit 1
+fi
+
+MAJOR="$1"
+MINOR="$2"
+PATCH="$3"
+NEWVERSION="$MAJOR.$MINOR.$PATCH"
+
+echo "Updating version to '$NEWVERSION' ..."
+
+# !!! FIXME: This first one is a kinda scary search/replace that might fail later if another X.Y.Z version is added to the file.
+perl -w -pi -e 's/(\<string\>)\d+\.\d+\.\d+/${1}'$NEWVERSION'/;' Xcode/SDL/Info-Framework.plist
+
+DYVER=`expr $MINOR \* 100 + 1`
+perl -w -pi -e 's/(DYLIB_CURRENT_VERSION\s*=\s*)\d+\.\d+\.\d+/${1}'$DYVER'.0.0/;' Xcode/SDL/SDL.xcodeproj/project.pbxproj
+
+# Set compat to major.minor.0 by default.
+perl -w -pi -e 's/(DYLIB_COMPATIBILITY_VERSION\s*=\s*)\d+\.\d+\.\d+/${1}'$DYVER'.0.0/;' Xcode/SDL/SDL.xcodeproj/project.pbxproj
+
+# non-zero patch?
+if [ "x$PATCH" != "x0" ]; then
+    if [ `expr $MINOR % 2` = "0" ]; then
+        # If patch is not zero, but minor is even, it's a bugfix release.
+        perl -w -pi -e 's/(DYLIB_CURRENT_VERSION\s*=\s*)\d+\.\d+\.\d+/${1}'$DYVER'.'$PATCH'.0/;' Xcode/SDL/SDL.xcodeproj/project.pbxproj
+
+    else
+        # If patch is not zero, but minor is odd, it's a development prerelease.
+        DYVER=`expr $MINOR \* 100 + $PATCH + 1`
+        perl -w -pi -e 's/(DYLIB_CURRENT_VERSION\s*=\s*)\d+\.\d+\.\d+/${1}'$DYVER'.0.0/;' Xcode/SDL/SDL.xcodeproj/project.pbxproj
+        perl -w -pi -e 's/(DYLIB_COMPATIBILITY_VERSION\s*=\s*)\d+\.\d+\.\d+/${1}'$DYVER'.0.0/;' Xcode/SDL/SDL.xcodeproj/project.pbxproj
+    fi
+fi
+
+perl -w -pi -e 's/\A(SDL_MAJOR_VERSION=)\d+/${1}'$MAJOR'/;' configure.ac
+perl -w -pi -e 's/\A(SDL_MINOR_VERSION=)\d+/${1}'$MINOR'/;' configure.ac
+perl -w -pi -e 's/\A(SDL_MICRO_VERSION=)\d+/${1}'$PATCH'/;' configure.ac
+
+perl -w -pi -e 's/\A(set\(SDL_MAJOR_VERSION\s+)\d+/${1}'$MAJOR'/;' CMakeLists.txt
+perl -w -pi -e 's/\A(set\(SDL_MINOR_VERSION\s+)\d+/${1}'$MINOR'/;' CMakeLists.txt
+perl -w -pi -e 's/\A(set\(SDL_MICRO_VERSION\s+)\d+/${1}'$PATCH'/;' CMakeLists.txt
+
+perl -w -pi -e 's/\A(MAJOR_VERSION\s*=\s*)\d+/${1}'$MAJOR'/;' Makefile.os2
+perl -w -pi -e 's/\A(MINOR_VERSION\s*=\s*)\d+/${1}'$MINOR'/;' Makefile.os2
+perl -w -pi -e 's/\A(MICRO_VERSION\s*=\s*)\d+/${1}'$PATCH'/;' Makefile.os2
+
+perl -w -pi -e 's/\A(MAJOR_VERSION\s*=\s*)\d+/${1}'$MAJOR'/;' Makefile.w32
+perl -w -pi -e 's/\A(MINOR_VERSION\s*=\s*)\d+/${1}'$MINOR'/;' Makefile.w32
+perl -w -pi -e 's/\A(MICRO_VERSION\s*=\s*)\d+/${1}'$PATCH'/;' Makefile.w32
+
+perl -w -pi -e 's/(\#define SDL_MAJOR_VERSION\s+)\d+/${1}'$MAJOR'/;' include/SDL_version.h
+perl -w -pi -e 's/(\#define SDL_MINOR_VERSION\s+)\d+/${1}'$MINOR'/;' include/SDL_version.h
+perl -w -pi -e 's/(\#define SDL_PATCHLEVEL\s+)\d+/${1}'$PATCH'/;' include/SDL_version.h
+
+perl -w -pi -e 's/(FILEVERSION\s+)\d+,\d+,\d+/${1}'$MAJOR','$MINOR','$PATCH'/;' src/main/windows/version.rc
+perl -w -pi -e 's/(PRODUCTVERSION\s+)\d+,\d+,\d+/${1}'$MAJOR','$MINOR','$PATCH'/;' src/main/windows/version.rc
+perl -w -pi -e 's/(VALUE "FileVersion", ")\d+, \d+, \d+/${1}'$MAJOR', '$MINOR', '$PATCH'/;' src/main/windows/version.rc
+perl -w -pi -e 's/(VALUE "ProductVersion", ")\d+, \d+, \d+/${1}'$MAJOR', '$MINOR', '$PATCH'/;' src/main/windows/version.rc
+
+echo "Regenerating configure script with new version..."
+./autogen.sh |grep -v 'Now you are ready to run ./configure'
+
+echo "Running test/versioning.sh to verify changes..."
+./test/versioning.sh
+
+echo "All done."
+echo "Run 'git diff' and make sure this looks correct, before 'git commit'."
+
+exit 0
+
diff --git a/docs/release_checklist.md b/docs/release_checklist.md
index 33769949e013..b66ac0ac9f79 100644
--- a/docs/release_checklist.md
+++ b/docs/release_checklist.md
@@ -4,26 +4,10 @@
 
 * Update `WhatsNew.txt`
 
-* Bump version number to 2.EVEN.0 in all these locations:
-
-    * `configure.ac`, `CMakeLists.txt`: `SDL_*_VERSION`
-    * `Xcode/SDL/Info-Framework.plist`: `CFBundleShortVersionString`,
-        `CFBundleVersion`
-    * `Makefile.os2`: `VERSION`
-    * `Makefile.w32`: `*_VERSION`
-    * `include/SDL_version.h`: `SDL_*_VERSION`, `SDL_PATCHLEVEL`
-    * `src/main/windows/version.rc`: `FILEVERSION`, `PRODUCTVERSION`,
-        `FileVersion`, `ProductVersion`
-
-* Bump ABI version information
-
-    * `CMakeLists.txt`, `Xcode/SDL/SDL.xcodeproj/project.pbxproj`:
-        `DYLIB_CURRENT_VERSION`, `DYLIB_COMPATIBILITY_VERSION`
-        * set first number in `DYLIB_CURRENT_VERSION` to
-            (100 * *minor*) + 1
-        * set second number in `DYLIB_CURRENT_VERSION` to 0
-        * if backwards compatibility has been broken,
-            increase `DYLIB_COMPATIBILITY_VERSION` (?)
+* Bump version number to 2.EVEN.0:
+
+    * `./build-scripts/update-version.sh 2 EVEN 0`
+    * (spaces between each component of the version, and `EVEN` will be a real number in real life.
 
 * Run test/versioning.sh to verify that everything is consistent
 
@@ -39,13 +23,8 @@
 
 * Bump version number from 2.Y.Z to 2.Y.(Z+1) (Y is even)
 
-    * Same places as listed above
-
-* Bump ABI version information
-
-    * `CMakeLists.txt`, `Xcode/SDL/SDL.xcodeproj/project.pbxproj`:
-        `DYLIB_CURRENT_VERSION`, `DYLIB_COMPATIBILITY_VERSION`
-        * set second number in `DYLIB_CURRENT_VERSION` to *patchlevel*
+    * `./build-scripts/update-version.sh 2 Y Z+1`
+    * (spaces between each component of the version, and `Y` and `Z+1` will be real numbers in real life.
 
 * Run test/versioning.sh to verify that everything is consistent
 
@@ -59,12 +38,8 @@
 
 * Bump version number to 2.ODD.0 for next development branch
 
-    * Same places as listed above
-
-* Bump ABI version information
-
-    * Same places as listed above
-    * Assume that the next feature release will contain new API/ABI
+    * `./build-scripts/update-version.sh 2 ODD 0`
+    * (spaces between each component of the version, and `ODD` will be a real number in real life.
 
 * Run test/versioning.sh to verify that everything is consistent
 
@@ -72,17 +47,10 @@
 
 * Bump version number from 2.Y.Z to 2.Y.(Z+1) (Y is odd)
 
-    * Same places as listed above
-
-* Bump ABI version information
+    * `./build-scripts/update-version.sh 2 Y Z+1`
+    * (spaces between each component of the version, and `Y` and `Z+1` will be real numbers in real life.
 
-    * `CMakeLists.txt`, `Xcode/SDL/SDL.xcodeproj/project.pbxproj`:
-        `DYLIB_CURRENT_VERSION`, `DYLIB_COMPATIBILITY_VERSION`
-        * set first number in `DYLIB_CURRENT_VERSION` to
-            (100 * *minor*) + *patchlevel* + 1
-        * set second number in `DYLIB_CURRENT_VERSION` to 0
-        * if backwards compatibility has been broken,
-            increase `DYLIB_COMPATIBILITY_VERSION` (?)
+* Regenerate `configure`
 
 * Run test/versioning.sh to verify that everything is consistent