From f7616ac9d119464b96f3e8e87119367f537fcee4 Mon Sep 17 00:00:00 2001 From: Martin Hansson Date: Thu, 26 Mar 2026 14:50:59 +0000 Subject: [PATCH 1/4] Post the result of improperly formatted files on the PR page --- .circleci/config.yml | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 3d636b0eeb3d..e466928061ab 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -95,11 +95,31 @@ jobs: echo "Checking clang-format results" git diff -U0 "$(git merge-base HEAD target/$BASE_BRANCH)" *.c *.cc *.cpp *.h *.hpp *.i *.ic *.ih | clang-format-diff-$COMPILER_VERSION -style=file -p1 >_GIT_DIFF || true + FORMAT_OK=true if [ ! -s _GIT_DIFF ]; then echo The last git commit is clang-formatted; else cat _GIT_DIFF; - false; + FORMAT_OK=false; + + if [[ -n "${GITHUB_TOKEN:-}" ]] && [[ -n "${PR_NUMBER:-}" ]]; then + DIFF_BODY="$(head -c 60000 _GIT_DIFF)" + if [ "$(wc -c < _GIT_DIFF)" -gt 60000 ]; then + DIFF_BODY="${DIFF_BODY}"$'\n... (truncated, see CI log for full diff)' + fi + + COMMENT_BODY=$(printf '**clang-format check failed** \xE2\x9D\x8C\n\nThe following changes are needed to fix formatting:\n\n```diff\n%s\n```\n\nRun locally to fix:\n```bash\ngit diff -U0 HEAD~1 -- '\''*.c'\'' '\''*.cc'\'' '\''*.cpp'\'' '\''*.h'\'' '\''*.hpp'\'' '\''*.i'\'' '\''*.ic'\'' '\''*.ih'\'' | clang-format-diff -style=file -p1 -i\n```' "$DIFF_BODY") + PAYLOAD=$(jq -n --arg body "$COMMENT_BODY" '{"body": $body}') + + curl -sS -X POST \ + -H "Authorization: token ${GITHUB_TOKEN}" \ + -H "Accept: application/vnd.github.v3+json" \ + "https://api.github.com/repos/${BASE_OWNER}/${BASE_REPO}/issues/${PR_NUMBER}/comments" \ + -d "$PAYLOAD" > /dev/null + echo "Posted clang-format diff as PR comment" + else + echo "Skipping PR comment (no GITHUB_TOKEN or PR_NUMBER)" + fi fi echo "Checking clang-tidy static code analysis results" @@ -112,3 +132,9 @@ jobs: echo The last git commit has clang-tidy warnings; cat _GIT_DIFF_TIDY; fi + + # Fail the job if clang-format found issues + if [ "$FORMAT_OK" = false ]; then + echo "Failing build due to clang-format violations" + exit 1 + fi From 9041c86a71b438bd97fd39c8f50ad73f1141e0e2 Mon Sep 17 00:00:00 2001 From: Martin Hansson Date: Thu, 26 Mar 2026 14:52:09 +0000 Subject: [PATCH 2/4] Formatting mistake for testing --- sql/item_cmpfunc.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index 77f622ef7a78..613a81cec376 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -97,7 +97,7 @@ using std::min; static const enum_walk walk_options = enum_walk::PREFIX | enum_walk::POSTFIX | enum_walk::SUBQUERY; -static bool convert_constant_item(THD *, Item_field *, Item **, bool *); + static bool convert_constant_item(THD *, Item_field *, Item **, bool *); static longlong get_year_value(THD *thd, Item ***item_arg, Item **cache_arg, const Item *warn_item, bool *is_null); static Item **cache_converted_constant(THD *thd, Item **value, From 7cdf5cdebf5369ed064c80a7b4b8b6a1c7a185e2 Mon Sep 17 00:00:00 2001 From: Martin Hansson Date: Thu, 26 Mar 2026 15:02:16 +0000 Subject: [PATCH 3/4] Reworked --- .circleci/config.yml | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index e466928061ab..cab35236f81e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -18,21 +18,15 @@ jobs: UBUNTU_CODE_NAME="noble" BASE_OWNER="percona" BASE_REPO="percona-server" - BASE_BRANCH="8.0" + BASE_BRANCH="trunk" COMPILER_VERSION="19" - BOOST_VERSION="1_77_0" - BOOST_DIR="/home/circleci/my_boost" sudo -E apt-get -yq update >> ~/apt-get-update.log 2>&1 sudo apt-get install -yq --no-install-suggests --allow-unauthenticated --no-install-recommends clang-${COMPILER_VERSION} clang-tidy-${COMPILER_VERSION} clang-format-${COMPILER_VERSION} clang-tools-${COMPILER_VERSION} libc++-${COMPILER_VERSION}-dev libc++abi-${COMPILER_VERSION}-dev libldap2-dev curl libcurl4-openssl-dev bison libudev-dev libkrb5-dev libreadline-dev zlib1g-dev liblz4-dev libedit-dev libevent-dev protobuf-compiler libprotobuf-dev libprotoc-dev libldap2-dev libsasl2-dev libsasl2-modules-gssapi-mit cmake libicu-dev libtirpc-dev - echo "Downloading and extracting Boost." - wget --progress=dot:giga -P ${BOOST_DIR} "https://archives.boost.io/release/${BOOST_VERSION//_/.}/source/boost_${BOOST_VERSION}.tar.gz" - tar -xzf "${BOOST_DIR}/boost_${BOOST_VERSION}.tar.gz" -C "${BOOST_DIR}" - # Prepare compile_commands.json cd ~/project - cmake -B /home/circleci/debug-build -DCMAKE_BUILD_TYPE=Debug -DWITH_BOOST=${BOOST_DIR} -DWITH_SSL=system -DWITH_AUTHENTICATION_LDAP=ON -DWITH_ROCKSDB=ON -DCMAKE_C_COMPILER=clang-${COMPILER_VERSION} -DCMAKE_CXX_COMPILER=clang++-${COMPILER_VERSION} -DCMAKE_CXX_FLAGS="-stdlib=libc++" -DCMAKE_EXE_LINKER_FLAGS="-stdlib=libc++" -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DWITH_SYSTEM_LIBS=ON -DWITH_FIDO=bundled -DWITH_ZSTD=bundled -DWITH_LZ4=bundled -DWITH_PROTOBUF=bundled ~/project + cmake -B /home/circleci/debug-build -DCMAKE_BUILD_TYPE=Debug -DWITH_SSL=system -DWITH_AUTHENTICATION_LDAP=ON -DWITH_ROCKSDB=ON -DCMAKE_C_COMPILER=clang-${COMPILER_VERSION} -DCMAKE_CXX_COMPILER=clang++-${COMPILER_VERSION} -DCMAKE_CXX_FLAGS="-stdlib=libc++" -DCMAKE_EXE_LINKER_FLAGS="-stdlib=libc++" -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DWITH_SYSTEM_LIBS=ON -DWITH_FIDO=bundled -DWITH_ZSTD=bundled -DWITH_LZ4=bundled -DWITH_PROTOBUF=bundled ~/project # Method to fetch JSON from a Github API URL with error handling fetch_json() { @@ -108,8 +102,24 @@ jobs: DIFF_BODY="${DIFF_BODY}"$'\n... (truncated, see CI log for full diff)' fi - COMMENT_BODY=$(printf '**clang-format check failed** \xE2\x9D\x8C\n\nThe following changes are needed to fix formatting:\n\n```diff\n%s\n```\n\nRun locally to fix:\n```bash\ngit diff -U0 HEAD~1 -- '\''*.c'\'' '\''*.cc'\'' '\''*.cpp'\'' '\''*.h'\'' '\''*.hpp'\'' '\''*.i'\'' '\''*.ic'\'' '\''*.ih'\'' | clang-format-diff -style=file -p1 -i\n```' "$DIFF_BODY") - PAYLOAD=$(jq -n --arg body "$COMMENT_BODY" '{"body": $body}') + # Build the JSON payload directly with jq + HEADER="**clang-format check failed**" + HEADER="${HEADER}\n\nThe following changes" + HEADER="${HEADER} are needed to fix formatting:" + FOOTER="\nRun locally to fix:" + FOOTER="${FOOTER}\n\`\`\`bash" + FOOTER="${FOOTER}\ngit diff -U0 HEAD~1" + FOOTER="${FOOTER} -- '*.c' '*.cc' '*.cpp'" + FOOTER="${FOOTER} '*.h' '*.hpp'" + FOOTER="${FOOTER} '*.i' '*.ic' '*.ih'" + FOOTER="${FOOTER} | clang-format-diff" + FOOTER="${FOOTER} -style=file -p1 -i" + FOOTER="${FOOTER}\n\`\`\`" + PAYLOAD=$(jq -n \ + --arg diff "$DIFF_BODY" \ + --arg hdr "$HEADER" \ + --arg ftr "$FOOTER" \ + '{"body": ($hdr + "\n\n```diff\n" + $diff + "\n```\n" + $ftr)}') curl -sS -X POST \ -H "Authorization: token ${GITHUB_TOKEN}" \ From fa820c20ab2f391e23c5b4b716612b99c12f1624 Mon Sep 17 00:00:00 2001 From: Martin Hansson Date: Thu, 26 Mar 2026 15:21:46 +0000 Subject: [PATCH 4/4] Reworked again --- .circleci/config.yml | 53 ++++++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index cab35236f81e..7e65d04ebfc9 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -102,33 +102,38 @@ jobs: DIFF_BODY="${DIFF_BODY}"$'\n... (truncated, see CI log for full diff)' fi - # Build the JSON payload directly with jq - HEADER="**clang-format check failed**" - HEADER="${HEADER}\n\nThe following changes" - HEADER="${HEADER} are needed to fix formatting:" - FOOTER="\nRun locally to fix:" - FOOTER="${FOOTER}\n\`\`\`bash" - FOOTER="${FOOTER}\ngit diff -U0 HEAD~1" - FOOTER="${FOOTER} -- '*.c' '*.cc' '*.cpp'" - FOOTER="${FOOTER} '*.h' '*.hpp'" - FOOTER="${FOOTER} '*.i' '*.ic' '*.ih'" - FOOTER="${FOOTER} | clang-format-diff" - FOOTER="${FOOTER} -style=file -p1 -i" - FOOTER="${FOOTER}\n\`\`\`" - PAYLOAD=$(jq -n \ - --arg diff "$DIFF_BODY" \ - --arg hdr "$HEADER" \ - --arg ftr "$FOOTER" \ - '{"body": ($hdr + "\n\n```diff\n" + $diff + "\n```\n" + $ftr)}') - - curl -sS -X POST \ + # Build JSON payload entirely in jq so \n is handled correctly + PAYLOAD=$(jq -n --arg diff "$DIFF_BODY" \ + '{ body: ( + "**clang-format check failed**\n\n" + + "The following changes are needed to fix formatting:\n\n" + + "```diff\n" + $diff + "\n```\n\n" + + "Run locally to fix:\n" + + "```bash\n" + + "git diff -U0 HEAD~1" + + " -- \"*.c\" \"*.cc\" \"*.cpp\"" + + " \"*.h\" \"*.hpp\"" + + " \"*.i\" \"*.ic\" \"*.ih\"" + + " | clang-format-diff -style=file -p1 -i\n" + + "```" + )}') + + echo "Posting comment to PR #${PR_NUMBER}..." + COMMENT_URL="https://api.github.com/repos/${BASE_OWNER}/${BASE_REPO}/issues/${PR_NUMBER}/comments" + HTTP_CODE=$(curl -sS -w "%{http_code}" -o /tmp/gh_response.json \ + -X POST \ -H "Authorization: token ${GITHUB_TOKEN}" \ -H "Accept: application/vnd.github.v3+json" \ - "https://api.github.com/repos/${BASE_OWNER}/${BASE_REPO}/issues/${PR_NUMBER}/comments" \ - -d "$PAYLOAD" > /dev/null - echo "Posted clang-format diff as PR comment" + "$COMMENT_URL" \ + -d "$PAYLOAD") + if [ "$HTTP_CODE" -ge 200 ] && [ "$HTTP_CODE" -lt 300 ]; then + echo "Posted clang-format diff as PR comment (HTTP $HTTP_CODE)" + else + echo "Failed to post PR comment (HTTP $HTTP_CODE):" + cat /tmp/gh_response.json + fi else - echo "Skipping PR comment (no GITHUB_TOKEN or PR_NUMBER)" + echo "Skipping PR comment (GITHUB_TOKEN=${GITHUB_TOKEN:+set}${GITHUB_TOKEN:-unset}, PR_NUMBER=${PR_NUMBER:-unset})" fi fi