summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.travis.yml2
-rw-r--r--tools/lint-pr-commit-message.sh45
2 files changed, 46 insertions, 1 deletions
diff --git a/.travis.yml b/.travis.yml
index 21ec6dab70..dce15b7ab1 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -11,7 +11,7 @@ matrix:
script:
- make lint
# Lint the first commit in the PR.
- - \[ -z "$TRAVIS_COMMIT_RANGE" \] || (echo -e '\nLinting the commit message according to the guidelines at https://goo.gl/p2fr5Q\n' && git log $TRAVIS_COMMIT_RANGE --pretty=format:'%h' --no-merges | tail -1 | xargs npx -q core-validate-commit --no-validate-metadata)
+ - \[ "${TRAVIS_PULL_REQUEST}" != "false" \] && PR_ID=${TRAVIS_PULL_REQUEST}; bash tools/lint-pr-commit-message.sh ${PR_ID}
- name: "Test Suite"
addons:
apt:
diff --git a/tools/lint-pr-commit-message.sh b/tools/lint-pr-commit-message.sh
new file mode 100644
index 0000000000..1998026a16
--- /dev/null
+++ b/tools/lint-pr-commit-message.sh
@@ -0,0 +1,45 @@
+#!/usr/bin/env bash
+
+# Shell script to lint the message of the first commit in a pull request.
+#
+# Depends on curl, git, node, npm and npx being in $PATH.
+#
+# The pull request is either:
+# 1) supplied as an argument to this shell script
+# 2) derived from the HEAD commit via the GitHub API
+
+GH_API_URL="https://api.github.com"
+PR_ID=$1;
+if [ -z "${PR_ID}" ]; then
+ # Attempt to work out the PR number based on current HEAD
+ if HEAD_COMMIT="$( git rev-parse HEAD )"; then
+ if SEARCH_RESULTS="$( curl -s ${GH_API_URL}/search/issues?q=sha:${HEAD_COMMIT}+type:pr+repo:nodejs/node )"; then
+ if FOUND_PR="$( node -p 'JSON.parse(process.argv[1]).items[0].number' "${SEARCH_RESULTS}" 2> /dev/null )"; then
+ PR_ID=${FOUND_PR}
+ fi
+ fi
+ fi
+fi
+if [ -z "${PR_ID}" ]; then
+ echo "Unable to determine the pull request number to check. Please specify, "
+ echo " e.g. $0 <PR_NUMBER>"
+ exit 1
+fi
+# Retrieve the first commit of the pull request via GitHub API
+# TODO: If we teach core-validate-commit to ignore "fixup!" and "squash!"
+# commits and lint messages for all commits in the pull request
+# we could simplify the following to:
+# npx -q core-validate-commit --no-validate-metadata ${GH_API_URL}/repos/nodejs/node/pulls/${PR_ID}/commits
+if PR_COMMITS="$( curl -s ${GH_API_URL}/repos/nodejs/node/pulls/${PR_ID}/commits )"; then
+ if FIRST_COMMIT="$( node -p 'JSON.parse(process.argv[1])[0].url' "${PR_COMMITS}" 2> /dev/null )"; then
+ echo "Linting the first commit message for pull request ${PR_ID}"
+ echo "according to the guidelines at https://goo.gl/p2fr5Q."
+ # Print the commit message to make it more obvious what is being checked.
+ echo "Commit message for ${FIRST_COMMIT##*/} is:"
+ node -p 'JSON.parse(process.argv[1])[0].commit.message' "${PR_COMMITS}" 2> /dev/null
+ npx -q core-validate-commit --no-validate-metadata "${FIRST_COMMIT}"
+ else
+ echo "Unable to determine the first commit for pull request ${PR_ID}."
+ exit 1
+ fi
+fi