diff --git a/.github/.dir-locals.el b/.github/.dir-locals.el new file mode 100644 index 00000000000..a880e4a6bb6 --- /dev/null +++ b/.github/.dir-locals.el @@ -0,0 +1,19 @@ +;;; 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. + +((js-mode . ((indent-tabs-mode . nil) + (js-indent-level . 2)))) diff --git a/.github/workflows/jira-link.yml b/.github/workflows/jira-link.yml deleted file mode 100644 index d0e566b898d..00000000000 --- a/.github/workflows/jira-link.yml +++ /dev/null @@ -1,92 +0,0 @@ -# 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: JIRA link -on: - schedule: - - cron: | - */15 * * * * -jobs: - comment: - name: Comment - runs-on: ubuntu-latest - steps: - - name: Comment JIRA URL - uses: actions/github-script@0.2.0 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - const {owner: owner, repo: repo} = context.repo; - - function detectJIRAID(title) { - if (!title) { - return null; - } - const matched = /^ARROW-\d+/.exec(title); - if (!matched) { - return null; - } - return matched[0]; - } - - async function haveComment(pullRequestNumber, body) { - const options = { - owner: owner, - repo: repo, - issue_number: pullRequestNumber, - page: 1 - }; - while (true) { - const response = await github.issues.listComments(options); - if (response.data.some(comment => comment.body === body)) { - return true; - } - if (!/;\s*rel="next"/.test(response.headers.link || "")) { - break; - } - options.page++; - } - return false; - } - - async function commentJIRAURL(pullRequestNumber, jiraID) { - const jiraURL = `https://issues.apache.org/jira/browse/${jiraID}`; - if (await haveComment(pullRequestNumber, jiraURL)) { - return; - } - await github.issues.createComment({ - owner: owner, - repo: repo, - issue_number: pullRequestNumber, - body: jiraURL - }); - } - - (async () => { - const {data: pulls} = await github.pulls.list({ - owner: owner, - repo: repo, - }); - pulls.forEach(async (pull) => { - const pullRequestNumber = pull.number; - const title = pull.title; - const jiraID = detectJIRAID(title); - if (jiraID) { - await commentJIRAURL(pullRequestNumber, jiraID); - } - }); - })(); diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml new file mode 100644 index 00000000000..2cdc49e6934 --- /dev/null +++ b/.github/workflows/pull_request.yml @@ -0,0 +1,53 @@ +# 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: Pull request +on: + schedule: + - cron: | + */15 * * * * +jobs: + jira-link: + name: JIRA link + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - name: Comment + uses: actions/github-script@master + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const require = global.process.mainModule.constructor._load; + const fs = require("fs"); + const path = ".github/workflows/pull_request/jira_link.js"; + const script = fs.readFileSync(path).toString(); + eval(script); + title-check: + name: Title check + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - name: Check + uses: actions/github-script@master + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const require = global.process.mainModule.constructor._load; + const fs = require("fs"); + const path = ".github/workflows/pull_request/title_check.js"; + const script = fs.readFileSync(path).toString(); + eval(script); diff --git a/.github/workflows/pull_request/jira_link.js b/.github/workflows/pull_request/jira_link.js new file mode 100644 index 00000000000..c32a08453ef --- /dev/null +++ b/.github/workflows/pull_request/jira_link.js @@ -0,0 +1,77 @@ +// 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. + +const {owner: owner, repo: repo} = context.repo; + +function detectJIRAID(title) { + if (!title) { + return null; + } + const matched = /^ARROW-\d+/.exec(title); + if (!matched) { + return null; + } + return matched[0]; +} + +async function haveComment(pullRequestNumber, body) { + const options = { + owner: owner, + repo: repo, + issue_number: pullRequestNumber, + page: 1 + }; + while (true) { + const response = await github.issues.listComments(options); + if (response.data.some(comment => comment.body === body)) { + return true; + } + if (!/;\s*rel="next"/.test(response.headers.link || "")) { + break; + } + options.page++; + } + return false; +} + +async function commentJIRAURL(pullRequestNumber, jiraID) { + const jiraURL = `https://issues.apache.org/jira/browse/${jiraID}`; + if (await haveComment(pullRequestNumber, jiraURL)) { + return; + } + await github.issues.createComment({ + owner: owner, + repo: repo, + issue_number: pullRequestNumber, + body: jiraURL + }); +} + +(async () => { + const {data: pulls} = await github.pulls.list({ + owner: owner, + repo: repo, + }); + pulls.forEach(async (pull) => { + const pullRequestNumber = pull.number; + const title = pull.title; + const jiraID = detectJIRAID(title); + if (jiraID) { + await commentJIRAURL(pullRequestNumber, jiraID); + } + }); +})(); diff --git a/.github/workflows/pull_request/title_check.js b/.github/workflows/pull_request/title_check.js new file mode 100644 index 00000000000..23e488958e5 --- /dev/null +++ b/.github/workflows/pull_request/title_check.js @@ -0,0 +1,63 @@ +// 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. + +console.log("title-check"); + +const fs = require("fs"); + +const {owner: owner, repo: repo} = context.repo; + +function haveJIRAID(title) { + if (!title) { + return false; + } + return /^ARROW-\d+/.test(title); +} + +async function commentOpenJIRAIssue(pullRequestNumber) { + const {data: comments} = await github.issues.listComments({ + owner: owner, + repo: repo, + issue_number: pullRequestNumber, + per_page: 1 + }); + if (comments.length > 0) { + return; + } + const commentPath = ".github/workflows/pull_request/title_check.md"; + const comment = fs.readFileSync(commentPath).toString(); + await github.issues.createComment({ + owner: owner, + repo: repo, + issue_number: pullRequestNumber, + body: comment + }); +} + +(async () => { + const {data: pulls} = await github.pulls.list({ + owner: owner, + repo: repo, + }); + pulls.forEach(async (pull) => { + const pullRequestNumber = pull.number; + const title = pull.title; + if (!haveJIRAID(title)) { + await commentOpenJIRAIssue(pullRequestNumber); + } + }); +})(); diff --git a/.github/workflows/pull_request/title_check.md b/.github/workflows/pull_request/title_check.md new file mode 100644 index 00000000000..f008f55620a --- /dev/null +++ b/.github/workflows/pull_request/title_check.md @@ -0,0 +1,32 @@ + + +Thanks for opening a pull request! + +Could you open an issue for this pull request on JIRA? +https://issues.apache.org/jira/browse/ARROW + +Then could you also rename pull request title in the following format? + + ARROW-${JIRA_ID}: [${COMPONENT}] ${SUMMARY} + +See also: + + * [Other pull requests](https://github.com/apache/arrow/pulls/) + * [Contribution Guidelines - How to contribute patches](https://arrow.apache.org/docs/developers/contributing.html#how-to-contribute-patches)