| name: "update project version" |
| |
| on: |
| workflow_dispatch: |
| inputs: |
| target_version: |
| description: 'next version (e.g., 1.9.7 or 1.9.7.12)' |
| required: true |
| default: '1.9.7' |
| target_soversion: |
| description: 'next soversion (e.g., 28). leave blank to keep current.' |
| required: false |
| |
| jobs: |
| bump-and-verify: |
| runs-on: ubuntu-latest |
| permissions: |
| contents: write |
| pull-requests: write |
| steps: |
| - name: checkout code |
| uses: actions/checkout@v4 |
| |
| - name: update project files |
| run: | |
| VER="${{ github.event.inputs.target_version }}" |
| SOVER="${{ github.event.inputs.target_soversion }}" |
| echo "bumping to $VER" |
| |
| # 1. cmakelists.txt |
| if [ -f CMakeLists.txt ]; then |
| 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 |
| if [ -f meson.build ]; then |
| # targeting the version line directly |
| sed -i "s/version[[:space:]]*:[[:space:]]*['\"][0-9.]*['\"]/version : '$VER'/" meson.build |
| if [ -n "$SOVER" ]; then |
| sed -i "s/soversion[[:space:]]*:[[:space:]]*['\"][0-9]*['\"]/soversion : '$SOVER'/" meson.build |
| fi |
| fi |
| |
| # 3. module.bazel |
| if [ -f MODULE.bazel ]; then |
| # 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 |
| if [ -f vcpkg.json ]; then |
| 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" |