diff --git a/.dir-locals.el b/.dir-locals.el index d0440a730161f..5631c962fca3b 100644 --- a/.dir-locals.el +++ b/.dir-locals.el @@ -15,6 +15,8 @@ ;;; specific language governing permissions and limitations ;;; under the License. -((sh-mode . ((indent-tabs-mode . nil) +((js-mode . ((indent-tabs-mode . nil) + (js-indent-level . 2))) + (sh-mode . ((indent-tabs-mode . nil) (sh-indentation . 2) (sh-basic-offset . 2)))) diff --git a/.github/workflows/jira-link.yml b/.github/workflows/jira-link.yml deleted file mode 100644 index d0e566b898d28..0000000000000 --- 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 0000000000000..ea0f1041ea579 --- /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 fs = require("fs"); + const path = ".github/workflows/pull_request/jira_link.js"; + const script = await fs.readFile(path); + const run = new Function("github", "context", script); + run(github, context); + 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 fs = require("fs"); + const path = ".github/workflows/pull_request/title_check.js"; + const script = await fs.readFile(path); + const run = new Function("github", "context", script); + run(github, context); diff --git a/.github/workflows/pull_request/jira_link.js b/.github/workflows/pull_request/jira_link.js new file mode 100644 index 0000000000000..3a8e9463da675 --- /dev/null +++ b/.github/workflows/pull_request/jira_link.js @@ -0,0 +1,60 @@ +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 0000000000000..addfcefd12f0a --- /dev/null +++ b/.github/workflows/pull_request/title_check.js @@ -0,0 +1,44 @@ +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 = await fs.readFile(commentPath); + 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 0000000000000..6ad06405625b9 --- /dev/null +++ b/.github/workflows/pull_request/title_check.md @@ -0,0 +1,13 @@ +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)