Skip to content

Suggest clang-format changes on PRs #55

Suggest clang-format changes on PRs

Suggest clang-format changes on PRs #55

name: Check Clang-Format on Diff
on: [pull_request]
jobs:
clang-format:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Import LLVM GPG Key
run: |
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 15CF4D18AF4F7421
- name: Add LLVM Repository
run: |
sudo add-apt-repository "deb http://apt.llvm.org/jammy llvm-toolchain-jammy-17 main"
sudo apt-get update
- name: Install clang-format 17
run: |
sudo apt-get install clang-format-17
- name: Fetch branches to check
run: |
git fetch origin ${{ github.base_ref }}
if [ "${{ github.repository_owner }}" != "${{ github.event.pull_request.head.repo.owner.login }}" ]; then
fork_owner="${{ github.event.pull_request.head.repo.owner.login }}"
fork_url=$(git remote get-url origin)
git remote add fork "$fork_url"
git fetch fork ${{ github.head_ref }}
else
git fetch origin ${{ github.head_ref }}
fi
- name: Apply clang-format locally
if: github.event_name == 'pull_request'
run: |
if [ "${{ github.repository_owner }}" != "${{ github.event.pull_request.head.repo.owner.login }}" ]; then
./clang-format-apply.sh origin/${{ github.base_ref }} fork/${{ github.head_ref }}
else
./clang-format-apply.sh origin/${{ github.base_ref }} origin/${{ github.head_ref }}
fi
- name: Save clang-format changes as patch
run: |
git diff -U0
git diff -U0 > clang_format.patch
- name: Generate suggestions
run: |
echo "[]" > comments.json
echo "Created comments.json"
while IFS= read -r line; do
echo "Processing line: $line"
if [[ "$line" =~ ^diff ]]; then
echo "Processing diff header line: $line"
# Extract file names from the diff header
changed_file=$(echo "$line" | awk '{print $3}' | sed 's/^a\///')
echo "File: $changed_file"
elif [[ "$line" =~ ^@@ ]]; then
echo "Line matches diff hunk header"
position=$(echo "$line" | grep -oP '(?<=@@ -).*?(?= @@)' | awk '{split($0, a, " "); print a[2]}')
echo "Got line number: $position"
# Construct JSON manually
comment="{\"path\":\"$changed_file\",\"position\":$position,\"body\":\"Please apply the suggested clang-format changes.\"}"
echo "Generated comment: $comment"
# Read existing comments.json and append new comment
existing_comments=$(cat comments.json)
new_comments=$(echo "$existing_comments" | sed -e 's/]//')
new_comments+="$comment,]"
echo "$new_comments" > comments.json
echo "Appended comment to comments.json"
fi
done < clang_format.patch
- name: Suggest changes via GitHub API
run: |
echo "Post review comments via GitHub API"
PR_NUMBER="${{ github.event.pull_request.number }}"
COMMIT_ID=$(git rev-parse HEAD)
REVIEW_BODY="Please make the changes suggested by clang-format"
COMMENTS=$(cat comments.json)
curl -L \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN_CLANG }}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/${{ github.repository }}/pulls/$PR_NUMBER/reviews \
-d "$(jq -n --arg commit_id "$COMMIT_ID" --arg body "$REVIEW_BODY" --argjson comments "$COMMENTS" '{commit_id: $commit_id, body: $body, event: "REQUEST_CHANGES", comments: $comments}')"