Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
tools: add script to lint first PR commit message
Decouple first commit in pull request linting from Travis by using
the GitHub API to work out the first commit.

The shell script obtains the pull request number in one of the
following ways:
 1) supplied on the command line (use this to test against any PR)
 2) derived from the HEAD commit via the GitHub API
  • Loading branch information
richardlau committed Nov 2, 2018
commit 38f2b1e8e6788928b098355ddb6e98864533ae5c
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
46 changes: 46 additions & 0 deletions tools/lint-pr-commit-message.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
#!/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