From ab75a4617466aca603d3d906b1d0668966db9a8b Mon Sep 17 00:00:00 2001 From: Alessandro Arcangeli Date: Sat, 22 Feb 2025 17:37:50 +0100 Subject: [PATCH] Update clang-format binary with a workflow --- .github/workflows/update-clang.yml | 144 ++++++++++++++++++ .gitignore | 1 + schemaGenerator/generate_schema.py | 15 +- .../clang-format-linux-aarch64/clang-format | 3 - .../clang-format-linux-armv7a/clang-format | 3 - .../clang-format-macos-arm64/clang-format | 3 - .../clang-format-macos-x64/clang-format | 3 - src/main/resources/clang-format-tag.txt | 2 +- .../clang-format-win/clang-format.exe | 3 - 9 files changed, 157 insertions(+), 20 deletions(-) create mode 100644 .github/workflows/update-clang.yml delete mode 100644 src/main/resources/clang-format-linux-aarch64/clang-format delete mode 100644 src/main/resources/clang-format-linux-armv7a/clang-format delete mode 100644 src/main/resources/clang-format-macos-arm64/clang-format delete mode 100644 src/main/resources/clang-format-macos-x64/clang-format delete mode 100644 src/main/resources/clang-format-win/clang-format.exe diff --git a/.github/workflows/update-clang.yml b/.github/workflows/update-clang.yml new file mode 100644 index 0000000..4ef8c42 --- /dev/null +++ b/.github/workflows/update-clang.yml @@ -0,0 +1,144 @@ +name: Update Clang +on: + workflow_dispatch: + schedule: + - cron: '6 6 * * *' + +# Cancel outdated jobs +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + +permissions: + pull-requests: write + contents: write + +jobs: + + # Prepare environment and build the plugin + update-clang: + name: Update Clang + runs-on: ubuntu-latest + outputs: + version: ${{ steps.properties.outputs.version }} + changelog: ${{ steps.properties.outputs.changelog }} + pluginVerifierHomeDir: ${{ steps.properties.outputs.pluginVerifierHomeDir }} + steps: + + - name: Fetch Sources + uses: actions/checkout@v4 + + - name: Check for updates + id: check-for-updates + run: | + latest_tag=$(gh release view --repo llvm/llvm-project --json tagName --jq .tagName) + echo "Latest tag: $latest_tag" + branch_name="autoupdate-clang-$latest_tag" + current_version=$(cat src/main/resources/clang-format-tag.txt) + found_branch=$(gh api repos/llvm/llvm-project/branches/$branch_name --jq .name 2> /dev/null || true) + echo "Branch found: $found_branch" + # We need to update if: 1. The current branch is outdated and 2. There is no other branch with the same name + if [ "$latest_tag" != "$current_version" ] && [ "$found_branch" != "$branch_name" ]; then + echo -e "\033[31mUpdate to $latest_tag is needed\033[0m" + echo "update_needed=true" >> $GITHUB_OUTPUT + echo "version=$latest_tag" >> $GITHUB_OUTPUT + else + echo -e "\033[32mUpdate to $latest_tag is not needed\033[0m" + echo "update_needed=false" >> $GITHUB_OUTPUT + fi + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Setup Python + uses: actions/setup-python@v5 + if: steps.check-for-updates.outputs.update_needed == 'true' + with: + python-version: '3.13' + + - name: Generate schema + if: steps.check-for-updates.outputs.update_needed == 'true' + run: | + latest_tag=${{ steps.check-for-updates.outputs.version }} + cd schemaGenerator + python generate_schema.py --download --clang-tag $latest_tag + + - name: Update clang-format Binary + if: steps.check-for-updates.outputs.update_needed == 'true' + run: | + latest_tag=${{ steps.check-for-updates.outputs.version }} + + echo "Downloading windows binary" + echo "::group::Download Details" + gh release download $latest_tag --repo llvm/llvm-project --pattern "clang+llvm-*windows-msvc.tar.xz" --dir clang + tar -xvf clang/clang+llvm-*windows-msvc.tar.xz --strip-components=2 -C clang --wildcards --no-anchored 'clang-format.exe' + mkdir -p src/main/resources/clang-format-win + mv clang/clang-format.exe src/main/resources/clang-format-win/clang-format.exe + rm clang/clang+llvm-* + echo "::endgroup::" + + echo "Downloading linux aarch64 binary" + echo "::group::Download Details" + gh release download $latest_tag --repo llvm/llvm-project --pattern "clang+llvm-*-aarch64-linux-gnu.tar.xz" --dir clang + tar -xvf clang/clang+llvm-*-aarch64-linux-gnu.tar.xz --strip-components=2 -C clang --wildcards --no-anchored 'clang-format' + mkdir -p src/main/resources/clang-format-linux-aarch64 + mv clang/clang-format src/main/resources/clang-format-linux-aarch64/clang-format + chmod +x src/main/resources/clang-format-linux-aarch64/clang-format + rm clang/clang+llvm-* + echo "::endgroup::" + + echo "Downloading linux armv7a binary" + echo "::group::Download Details" + gh release download $latest_tag --repo llvm/llvm-project --pattern "clang+llvm-*-armv7a-linux-*.tar.gz" --dir clang + tar -xvf clang/clang+llvm-*-armv7a-linux-*.tar.gz --strip-components=2 -C clang --wildcards --no-anchored 'clang-format' + mkdir -p src/main/resources/clang-format-linux-armv7a + mv clang/clang-format src/main/resources/clang-format-linux-armv7a/clang-format + chmod +x src/main/resources/clang-format-linux-armv7a/clang-format + rm clang/clang+llvm-* + echo "::endgroup::" + + echo "Downloading macos x64 binary" + echo "::group::Download Details" + gh release download $latest_tag --repo llvm/llvm-project --pattern "LLVM-*-macOS-X64.tar.xz" --dir clang + tar -xvf clang/LLVM-*-macOS-X64.tar.xz --strip-components=2 -C clang --wildcards --no-anchored 'clang-format' + mkdir -p src/main/resources/clang-format-macos-x64 + mv clang/clang-format src/main/resources/clang-format-macos-x64/clang-format + chmod +x src/main/resources/clang-format-macos-x64/clang-format + rm clang/LLVM-* + echo "::endgroup::" + + echo "Downloading macos arm64 binary" + echo "::group::Download Details" + gh release download $latest_tag --repo llvm/llvm-project --pattern "LLVM-*-macOS-ARM64.tar.xz" --dir clang + tar -xvf clang/LLVM-*-macOS-ARM64.tar.xz --strip-components=2 -C clang --wildcards --no-anchored 'clang-format' + mkdir -p src/main/resources/clang-format-macos-arm64 + mv clang/clang-format src/main/resources/clang-format-macos-arm64/clang-format + chmod +x src/main/resources/clang-format-macos-arm64/clang-format + rm clang/LLVM-* + echo "::endgroup::" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Create branch and commit + if: steps.check-for-updates.outputs.update_needed == 'true' + run: | + latest_tag=${{ steps.check-for-updates.outputs.version }} + echo $latest_tag > src/main/resources/clang-format-tag.txt + git config --global user.email "alessandroarcangeli.rm@gmail.com" + git config --global user.name "Alessandro Arcangeli (bot)" + branch_name="autoupdate-clang-$latest_tag" + git checkout -b $branch_name + git add src/* + git add schemaGenerator/* + git status + git commit -m "Update clang-format to $latest_tag" + + - name: Create Pull Request + if: steps.check-for-updates.outputs.update_needed == 'true' + run: | + latest_tag=${{ steps.check-for-updates.outputs.version }} + branch_name="autoupdate-clang-$latest_tag" + echo "Pushing branch $branch_name" + git push origin $branch_name + echo "Creating pull request" + gh pr create --title "Update clang-format to $latest_tag" --body "Update clang-format to $latest_tag" --base main --head $branch_name + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index ffabde6..abe0cd3 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ .intellijPlatform .qodana build +__pycache__ diff --git a/schemaGenerator/generate_schema.py b/schemaGenerator/generate_schema.py index ff2978b..33b2de4 100755 --- a/schemaGenerator/generate_schema.py +++ b/schemaGenerator/generate_schema.py @@ -20,8 +20,7 @@ # Based on dump_format_style.py # Update the CLANG_BRANCH to the latest version -CLANG_BRANCH = "release/19.x" -CLANG_ROOT = f"https://raw.githubusercontent.com/llvm/llvm-project/{CLANG_BRANCH}/clang" +CLANG_ROOT = f"https://raw.githubusercontent.com/llvm/llvm-project/__branch__/clang" PROJECT_ROOT = Path(__file__).parent.parent OUTPUT_FILE = str(PROJECT_ROOT / "src/main/resources/schemas/clangFormat-options.json") @@ -231,13 +230,21 @@ def main(): help="Download the latest version of the schema from the GitHub", ) + parser.add_argument( + "--clang-tag", + type=str, + default="main", + help="The tag of the clang-format repository", + ) + args = parser.parse_args() # Download the latest version of the schema from the GitHub if args.download: - download_file(f"{CLANG_ROOT}/include/clang/Format/Format.h", "clang/Format.h") + root = CLANG_ROOT.replace("__branch__", args.clang_tag) + download_file(f"{root}/include/clang/Format/Format.h", "clang/Format.h") download_file( - f"{CLANG_ROOT}/include/clang/Tooling/Inclusions/IncludeStyle.h", + f"{root}/include/clang/Tooling/Inclusions/IncludeStyle.h", "clang/IncludeStyle.h", ) diff --git a/src/main/resources/clang-format-linux-aarch64/clang-format b/src/main/resources/clang-format-linux-aarch64/clang-format deleted file mode 100644 index bb4df58..0000000 --- a/src/main/resources/clang-format-linux-aarch64/clang-format +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6c60764d5f1426f6f11a033262a9975bed2edbf517eb32840d6aa39164c1f674 -size 4127552 diff --git a/src/main/resources/clang-format-linux-armv7a/clang-format b/src/main/resources/clang-format-linux-armv7a/clang-format deleted file mode 100644 index 96776b2..0000000 --- a/src/main/resources/clang-format-linux-armv7a/clang-format +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89f5e0eb994427662758dd233a1a326e5831bfb6f873d969d82e2b4dd8523602 -size 3794828 diff --git a/src/main/resources/clang-format-macos-arm64/clang-format b/src/main/resources/clang-format-macos-arm64/clang-format deleted file mode 100644 index 8c0b83e..0000000 --- a/src/main/resources/clang-format-macos-arm64/clang-format +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4d738128bee94025e7f5580a1d29ddcf89ef4c186bd7660a1f04ecefdee3e1cd -size 3672416 diff --git a/src/main/resources/clang-format-macos-x64/clang-format b/src/main/resources/clang-format-macos-x64/clang-format deleted file mode 100644 index 6653b66..0000000 --- a/src/main/resources/clang-format-macos-x64/clang-format +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:694def3f71888349f4aaad76f7edb60e39073a6b212406d132aa47b8373342c6 -size 3824672 diff --git a/src/main/resources/clang-format-tag.txt b/src/main/resources/clang-format-tag.txt index 0e5541b..d741fa3 100644 --- a/src/main/resources/clang-format-tag.txt +++ b/src/main/resources/clang-format-tag.txt @@ -1 +1 @@ -llvmorg-19.1.7 +FORCE_REBUILD diff --git a/src/main/resources/clang-format-win/clang-format.exe b/src/main/resources/clang-format-win/clang-format.exe deleted file mode 100644 index a8ce06f..0000000 --- a/src/main/resources/clang-format-win/clang-format.exe +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a7b393b46257cc375d5832a44ff37fe52cf64f60a92880e6977fca5227810a20 -size 3685888