This is an automated email from the ASF dual-hosted git repository.

av pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new 20aa572d275 IGNITE-28018 Github action hook to control changes inside 
the messages. (#12853)
20aa572d275 is described below

commit 20aa572d2751e6b68870b7829ebd6cb601ff99d6
Author: Alexey Abashev <[email protected]>
AuthorDate: Tue Mar 10 18:58:50 2026 +0300

    IGNITE-28018 Github action hook to control changes inside the messages. 
(#12853)
---
 .github/workflows/check-protected-classes.yml | 113 ++++++++++++++++++++++++++
 1 file changed, 113 insertions(+)

diff --git a/.github/workflows/check-protected-classes.yml 
b/.github/workflows/check-protected-classes.yml
new file mode 100644
index 00000000000..ce6538e234f
--- /dev/null
+++ b/.github/workflows/check-protected-classes.yml
@@ -0,0 +1,113 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+name: Check Protected Classes
+on:
+  pull_request:
+
+concurrency:
+  group: ${{ github.workflow }}-${{ github.event.pull_request.number }}
+  cancel-in-progress: true
+
+jobs:
+  check-protected-classes:
+    runs-on: ubuntu-latest
+    name: Check protected classes
+    steps:
+      - uses: actions/checkout@v6
+        with:
+          ref: ${{ github.event.pull_request.head.sha }}
+          fetch-depth: 0
+
+      - name: Check for protected class modifications
+        id: check
+        run: |
+          BASE_SHA=${{ github.event.pull_request.base.sha }}
+          HEAD_SHA=${{ github.event.pull_request.head.sha }}
+
+          HITS=""
+
+          # New and deleted files: check diff content for @Order annotation.
+          for file in $(git diff --name-only --no-renames --diff-filter=AD 
"$BASE_SHA"..."$HEAD_SHA" -- '*.java'); do
+            if git diff "$BASE_SHA"..."$HEAD_SHA" -- "$file" | grep -q 
'org.apache.ignite.internal.Order'; then
+              HITS="${HITS}${file}\n"
+            fi
+          done
+
+          # Modified files: check base version content for @Order annotation.
+          for file in $(git diff --name-only --no-renames --diff-filter=M 
"$BASE_SHA"..."$HEAD_SHA" -- '*.java'); do
+            if git show "${BASE_SHA}:${file}" 2>/dev/null | grep -q 
'org.apache.ignite.internal.Order'; then
+              HITS="${HITS}${file}\n"
+            fi
+          done
+
+          if [ -n "$HITS" ]; then
+            echo "affected=true" >> "$GITHUB_OUTPUT"
+            printf '%b' "$HITS" > /tmp/protected-hits.txt
+          fi
+
+      - name: Comment on PR
+        if: steps.check.outputs.affected == 'true'
+        uses: actions/github-script@v8
+        with:
+          script: |
+            const fs = require('fs');
+            const hits = fs.readFileSync('/tmp/protected-hits.txt', 
'utf8').trim();
+            const body = [
+              '## Protected Classes Review Required',
+              '',
+              'This PR modifies protected classes (with @Order annotation).',
+              'Changes to these classes can break rolling upgrade 
compatibility.',
+              '',
+              '**Affected files:**',
+              hits.split('\n').map(f => '- `' + f.trim() + '`').join('\n'),
+              '',
+            ].join('\n');
+
+            const { data: comments } = await github.rest.issues.listComments({
+              owner: context.repo.owner,
+              repo: context.repo.repo,
+              issue_number: context.issue.number,
+            });
+
+            const existing = comments.find(c => c.body.includes('Protected 
Classes Review Required'));
+
+            if (existing) {
+              await github.rest.issues.updateComment({
+                owner: context.repo.owner,
+                repo: context.repo.repo,
+                comment_id: existing.id,
+                body,
+              });
+            } else {
+              await github.rest.issues.createComment({
+                owner: context.repo.owner,
+                repo: context.repo.repo,
+                issue_number: context.issue.number,
+                body,
+              });
+            }
+
+      - name: Add label
+        if: steps.check.outputs.affected == 'true'
+        uses: actions/github-script@v8
+        with:
+          script: |
+            await github.rest.issues.addLabels({
+              owner: context.repo.owner,
+              repo: context.repo.repo,
+              issue_number: context.issue.number,
+              labels: ['protected-classes'],
+            });

Reply via email to