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"