blob: af03a556652d9ce21b49eb9912cdedf5f2b8665e [file] [log] [blame] [edit]
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"