fixup project version updater (#1649)
* fixup project version updater
* Enhance version bumping workflow in YAML
Updated the versioning script to handle version bumps in various files, including CMakeLists.txt, meson.build, MODULE.bazel, vcpkg.json, and include/json/version.h. Improved echo statements and jq command usage.
* fix meson inclusion probably.
* Refactor update-project-version workflow
Removed sanity check and pull request creation steps from the workflow.
* Add version verification and pull request creation steps
* Simplify version update workflow
Refactor version update logic and remove unnecessary checks.
* Refactor version extraction in workflow script
* Enhance workflow with CMake sanity check and version bump
Add sanity check for CMake configuration and automate version bump process.
* Fix regex patterns for version updates in YAML
* Refactor version update script for clarity and efficiency
* Fix label formatting in update-project-version.yml
diff --git a/.github/workflows/update-project-version.yml b/.github/workflows/update-project-version.yml
index 16a413d..af03a55 100644
--- a/.github/workflows/update-project-version.yml
+++ b/.github/workflows/update-project-version.yml
@@ -22,39 +22,103 @@
uses: actions/checkout@v4
- name: update project files
- id: update_files
run: |
VER="${{ github.event.inputs.target_version }}"
SOVER="${{ github.event.inputs.target_soversion }}"
- echo "bumping version to $VER"
+ echo "bumping to $VER"
- # 1. CMakeLists.txt: Only update version inside the project() block
+ # 1. cmakelists.txt
if [ -f CMakeLists.txt ]; then
- echo "updating cmakelists.txt"
- sed -i "/project[[:space:]]*([[:space:]]*jsoncpp/,/)/ s/VERSION [0-9.]*/VERSION $VER/" CMakeLists.txt
+ sed -i "/project.*jsoncpp/,/)/ s/VERSION [0-9.]*/VERSION $VER/" CMakeLists.txt
if [ -n "$SOVER" ]; then
sed -i "s/set(PROJECT_SOVERSION [0-9]*/set(PROJECT_SOVERSION $SOVER/" CMakeLists.txt
fi
fi
- # 2. meson.build: Only update version inside the project() block
+ # 2. meson.build
if [ -f meson.build ]; then
- echo "updating meson.build"
- sed -i "/project('jsoncpp'/,/)/ s/version[[:space:]]*:[[:space:]]*['\"][0-9.]*['\"]/version : '$VER'/" meson.build
+ # targeting the version line directly
+ sed -i "s/version[[:space:]]*:[[:space:]]*['\"][0-9.]*['\"]/version : '$VER'/" meson.build
if [ -n "$SOVER" ]; then
- # update soversion only within the library() or where defined
sed -i "s/soversion[[:space:]]*:[[:space:]]*['\"][0-9]*['\"]/soversion : '$SOVER'/" meson.build
fi
fi
- # 3. MODULE.bazel: Only update version inside the module() block
+ # 3. module.bazel
if [ -f MODULE.bazel ]; then
- echo "updating MODULE.bazel"
- # match range from 'module(' to the first ')'
- sed -i "/module(/,/)/ s/version[[:space:]]*=[[:space:]]*['\"][0-9.]*['\"]/version = \"$VER\"/" MODULE.bazel
+ # match only the first 'version' occurrence in the file (the module version)
+ sed -i "0,/version[[:space:]]*=[[:space:]]*['\"][0-9.]*['\"]/s//version = \"$VER\"/" MODULE.bazel
fi
- # 4. vcpkg.json: jq is inherently surgical
+ # 4. vcpkg.json
if [ -f vcpkg.json ]; then
- echo "updating vcpkg.json"
- jq ".version = \"$VER\"" vcpkg.json > vcpkg.json.tmp && mv vcpkg.json.
+ jq --arg ver "$VER" '.version = $ver' vcpkg.json > tmp.json && mv tmp.json vcpkg.json
+ fi
+
+ # 5. include/json/version.h
+ if [ -f include/json/version.h ]; then
+ MAJOR=$(echo "$VER" | cut -d. -f1)
+ MINOR=$(echo "$VER" | cut -d. -f2)
+ PATCH=$(echo "$VER" | cut -d. -f3)
+ QUALIFIER=$(echo "$VER" | cut -d. -f4 -s)
+
+ sed -i "s/#define JSONCPP_VERSION_STRING \".*\"/#define JSONCPP_VERSION_STRING \"$VER\"/" include/json/version.h
+ sed -i "s/#define JSONCPP_VERSION_MAJOR [0-9]*/#define JSONCPP_VERSION_MAJOR $MAJOR/" include/json/version.h
+ sed -i "s/#define JSONCPP_VERSION_MINOR [0-9]*/#define JSONCPP_VERSION_MINOR $MINOR/" include/json/version.h
+ sed -i "s/#define JSONCPP_VERSION_PATCH [0-9]*/#define JSONCPP_VERSION_PATCH $PATCH/" include/json/version.h
+
+ if [ -n "$QUALIFIER" ]; then
+ sed -i "s/#define JSONCPP_VERSION_QUALIFIER.*/#define JSONCPP_VERSION_QUALIFIER $QUALIFIER/" include/json/version.h
+ else
+ sed -i "s/#define JSONCPP_VERSION_QUALIFIER.*/#define JSONCPP_VERSION_QUALIFIER/" include/json/version.h
+ fi
+ fi
+
+ - name: verify version macros
+ id: verify
+ run: |
+ FILE="include/json/version.h"
+ if [ -f "$FILE" ]; then
+ # extract clean values by stripping everything except digits and dots
+ V_STR=$(grep "JSONCPP_VERSION_STRING" "$FILE" | head -n 1 | cut -d '"' -f 2)
+ V_MAJ=$(grep "JSONCPP_VERSION_MAJOR" "$FILE" | head -n 1 | awk '{print $3}' | tr -cd '0-9')
+ V_MIN=$(grep "JSONCPP_VERSION_MINOR" "$FILE" | head -n 1 | awk '{print $3}' | tr -cd '0-9')
+ V_PAT=$(grep "JSONCPP_VERSION_PATCH" "$FILE" | head -n 1 | awk '{print $3}' | tr -cd '0-9')
+ V_QUA=$(grep "JSONCPP_VERSION_QUALIFIER" "$FILE" | head -n 1 | awk '{print $3}' | tr -cd '0-9')
+
+ # create a unique delimiter for the multi-line output
+ DELIM=$(dd if=/dev/urandom bs=15 count=1 2>/dev/null | base64)
+ echo "report<<$DELIM" >> $GITHUB_OUTPUT
+ echo "| Macro | Value |" >> $GITHUB_OUTPUT
+ echo "| :--- | :--- |" >> $GITHUB_OUTPUT
+ echo "| STRING | \`$V_STR\` |" >> $GITHUB_OUTPUT
+ echo "| MAJOR | \`$V_MAJ\` |" >> $GITHUB_OUTPUT
+ echo "| MINOR | \`$V_MIN\` |" >> $GITHUB_OUTPUT
+ echo "| PATCH | \`$V_PAT\` |" >> $GITHUB_OUTPUT
+ echo "| QUALIFIER | \`${V_QUA:-empty}\` |" >> $GITHUB_OUTPUT
+ echo "$DELIM" >> $GITHUB_OUTPUT
+ fi
+
+ - name: sanity check (cmake configure)
+ run: |
+ if [ -f CMakeLists.txt ]; then
+ mkdir build_check && cd build_check
+ cmake .. -DJSONCPP_WITH_TESTS=OFF -DJSONCPP_WITH_POST_BUILD_UNITTEST=OFF
+ cd .. && rm -rf build_check
+ fi
+
+ - name: create pull request
+ uses: peter-evans/create-pull-request@v7
+ with:
+ token: ${{ secrets.GITHUB_TOKEN }}
+ commit-message: "chore: bump version to ${{ github.event.inputs.target_version }}"
+ branch: "bump-to-${{ github.event.inputs.target_version }}"
+ title: "chore: bump version to ${{ github.event.inputs.target_version }}"
+ body: |
+ automated version bump.
+ - new version: `${{ github.event.inputs.target_version }}`
+ - new soversion: `${{ github.event.inputs.target_soversion || 'no change' }}`
+
+ ### header verification
+ ${{ steps.verify.outputs.report }}
+ labels: "maintenance"