This is an automated email from the ASF dual-hosted git repository.
luzhijing pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris-website.git
The following commit(s) were added to refs/heads/master by this push:
new 7ba7fedbdada Add maintainer check (#541)
7ba7fedbdada is described below
commit 7ba7fedbdada69bc4ec6bca1dc690acd495c7b2b
Author: caoliang-web <[email protected]>
AuthorDate: Thu Apr 11 23:00:59 2024 +0800
Add maintainer check (#541)
* Add maintainer check
* Core modules require maintainer review
---
.github/workflows/approve-check.yml | 43 +++++++++++++++++
tools/check_review.py | 96 +++++++++++++++++++++++++++++++++++++
tools/maintainers.json | 11 +++++
3 files changed, 150 insertions(+)
diff --git a/.github/workflows/approve-check.yml
b/.github/workflows/approve-check.yml
new file mode 100644
index 000000000000..1693ff9d70b8
--- /dev/null
+++ b/.github/workflows/approve-check.yml
@@ -0,0 +1,43 @@
+# 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: Need_2_Approval
+
+on:
+ pull_request_review:
+ types: [ submitted ]
+
+jobs:
+ Need_2_Approval:
+ runs-on: ubuntu-latest
+ timeout-minutes: 5
+ steps:
+ - uses: actions/checkout@v3
+ - name: Install Python dependencies
+ uses: actions/setup-python@v5
+ with:
+ python-version: '3.10' # Adjust if needed
+ - name: Install match library
+ run: |
+ pip install --upgrade pip
+ pip install match
+ pip install requests
+ - name: Run Python script
+ run: |
+ python tools/check_review.py ${{ github.event.pull_request.number
}} ${{secrets.GITHUB_TOKEN}}
+env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
\ No newline at end of file
diff --git a/tools/check_review.py b/tools/check_review.py
new file mode 100644
index 000000000000..443d49e099b2
--- /dev/null
+++ b/tools/check_review.py
@@ -0,0 +1,96 @@
+# 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.
+import os
+import requests
+import json
+import match
+import sys
+
+def check_review_pass(pr_num, maintainers_file, token):
+ """
+ Checks if all necessary files have been reviewed by maintainers.
+
+ Args:
+ pr_num (int): PR number.
+ maintainers_file (str): Path to maintainers.json.
+ token (str): GitHub token.
+
+ Returns:
+ bool: True if all files are reviewed, False otherwise.
+ """
+ headers = {'Authorization': f'{token}'}
+
+ # Get PR review information and extract reviewers and statuses
+ response =
requests.get(f"https://api.github.com/repos/apache/doris-website/pulls/{pr_num}/reviews?per_page=100",
headers=headers)
+ reviews = response.json()
+ reviewers = [review['user']['login'] for review in reviews]
+ statuses = [review['state'] for review in reviews]
+ print(reviewers)
+ print(statuses)
+ # Create a dictionary with the latest status for each reviewer
+ latest_statuses = {reviewer: status for reviewer, status in zip(reviewers,
statuses)}
+
+ # Create a list of reviewers who have approved
+ approves = [reviewer for reviewer, status in latest_statuses.items() if
status == 'APPROVED']
+
+ # Get list of changed files
+ response =
requests.get(f"https://api.github.com/repos/apache/doris-website/pulls/{pr_num}/files",
headers=headers)
+ file_changes = response.json()
+ file_change_names = [file['filename'] for file in file_changes]
+
+ # Read maintainers.json
+ with open(maintainers_file) as f:
+ data = json.load(f)
+ need_maintainers_review_path = [item['path'] for item in data['paths']]
+
+ # Check if each path's files have been reviewed by a maintainer
+ has_maintainer_review = True
+ for file in file_change_names:
+ path_found = False
+ for path_item in data['paths']:
+ path = path_item['path']
+ maintainers = path_item['maintainers']
+
+ if match.match(file, path):
+ path_found = True
+ if maintainers:
+ if not any(maintainer in approves for maintainer in
maintainers):
+ has_maintainer_review = False
+ break
+ else:
+ continue
+
+ if not path_found:
+ continue
+ print(approves)
+ if len(approves) < 2:
+ print("PR has not been approved by at least 2 reviewers")
+ exit(1)
+
+ return has_maintainer_review
+
+if __name__ == "__main__":
+
+ pr_num = sys.argv[1]
+ token = sys.argv[2]
+ maintainers_file = 'tools/maintainers.json' # Adjust path if needed
+
+ if check_review_pass(pr_num, maintainers_file, token):
+ print("Thanks for your contribution to Doris.")
+ else:
+ print("PR has file changes that need to be reviewed by maintainers.")
+ exit(1)
\ No newline at end of file
diff --git a/tools/maintainers.json b/tools/maintainers.json
new file mode 100644
index 000000000000..236dff51a9b8
--- /dev/null
+++ b/tools/maintainers.json
@@ -0,0 +1,11 @@
+{
+ "paths":[
+ {
+ "path":"docs/*",
+ "maintainers": [
+ "luzhijing",
+ "morningman"
+ ]
+ }
+ ]
+ }
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]