diff --git a/.travis.yml b/.travis.yml index 21ec6dab70f994..dce15b7ab16851 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 00000000000000..1998026a16ae39 --- /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 " + 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