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 <71004656+caoliang-...@users.noreply.github.com> 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: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org