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

xuanwo pushed a commit to branch reviewer
in repository https://gitbox.apache.org/repos/asf/incubator-opendal.git

commit 99ac1452eb5738bf65178f2163cbea4dff28bfe9
Author: Xuanwo <[email protected]>
AuthorDate: Wed Jan 17 16:18:41 2024 +0800

    ci: Pick random reviewers from committer list
    
    Signed-off-by: Xuanwo <[email protected]>
---
 .github/CODEOWNERS                  |  5 +++
 .github/scripts/assign_reviewers.js | 70 +++++++++++++++++++++++++++++++++++++
 .github/workflows/ci_review.yml     | 38 ++++++++++++++++++++
 3 files changed, 113 insertions(+)

diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 57cae29796..0c2decab5b 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -8,3 +8,8 @@
 /bindings/nodejs/ @suyanhanx
 /bindings/python/ @messense @Zheaoli
 /bindings/ruby/ @PsiACE
+
+# This is a place holder for all committers who what to join the review of not 
owned code.
+#
+# More details could be found at 
<https://github.com/apache/incubator-opendal/issues/3967>
+COMMITTERS_PLACEHOLDER @Xuanwo @Ji-Xinyou @morristai @dqhl76 @ClSlaid 
@Young-Flash @G-XD @oowl @silver-ymz
diff --git a/.github/scripts/assign_reviewers.js 
b/.github/scripts/assign_reviewers.js
new file mode 100644
index 0000000000..6f9e9a9526
--- /dev/null
+++ b/.github/scripts/assign_reviewers.js
@@ -0,0 +1,70 @@
+/*
+ * 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.
+ */
+
+async function run(github, context, fs) {
+  try {
+    const token = core.getInput('github-token', {required: true});
+    const octokit = github.getOctokit(token);
+
+    // Pick two reviewers from list
+    const numberOfReviewers = 2;
+    const repo = github.context.repo;
+
+    // Read CODEOWNERS
+    const codeownersContent = fs.readFileSync('.github/CODEOWNERS', 'utf8');
+    const lines = codeownersContent.split('\n');
+
+    // Search COMMITTERS
+    const placeholderLine = lines.find(line => 
line.startsWith('COMMITTERS_PLACEHOLDER'));
+    if (!placeholderLine) {
+      throw new Error("No COMMITTERS found in CODEOWNERS");
+    }
+
+    // Extract committers from placeholder line
+    const committers = placeholderLine.match(/@[\w-]+/g).map(u => 
u.substring(1));
+    if (committers.length === 0) {
+      throw new Error("No committer found in COMMITTERS_PLACEHOLDER");
+    }
+
+    // Pick reviewers
+    const selectedReviewers = [];
+    while (selectedReviewers.length < numberOfReviewers && committers.length > 
0) {
+      const randomIndex = Math.floor(Math.random() * committers.length);
+      selectedReviewers.push(committers.splice(randomIndex, 1)[0]);
+    }
+
+    // Assign reviewers Pull Request
+    if (github.context.payload.pull_request) {
+      const pullRequestNumber = github.context.payload.pull_request.number;
+      await octokit.rest.pulls.requestReviewers({
+        owner: repo.owner,
+        repo: repo.repo,
+        pull_number: pullRequestNumber,
+        reviewers: selectedReviewers,
+      });
+      console.log(`Assigned reviewers: ${selectedReviewers.join(', ')}`);
+    }
+  } catch (error) {
+    core.setFailed(`Action failed with error: ${error}`);
+  }
+}
+
+module.exports = ({github, context, fs}) => {
+  return run(github, context, fs)
+}
diff --git a/.github/workflows/ci_review.yml b/.github/workflows/ci_review.yml
new file mode 100644
index 0000000000..ab53eb7a71
--- /dev/null
+++ b/.github/workflows/ci_review.yml
@@ -0,0 +1,38 @@
+# 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: Assign Reviewers from COMMITTERS in CODEOWNERS
+
+on:
+  pull_request_target:
+    types: [opened, reopened]
+
+jobs:
+  assign-reviewers:
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout code
+        uses: actions/checkout@v4
+
+      - name: Assign Reviewers
+        uses: actions/github-script@v7
+        with:
+          script: |
+            const fs = require('fs');
+            const script = require('.github/scripts/assign-reviewers.js')
+            script({github, context, fs})
+          github-token: ${{ secrets.GITHUB_TOKEN }}

Reply via email to