From 830d462bd8ee948c00fc4d07de59076c227686e7 Mon Sep 17 00:00:00 2001 From: Michele Locati Date: Thu, 12 Apr 2018 09:17:21 +0200 Subject: [PATCH] Let TravisCI automatically rebuild README.md when pushing --- .travis.yml | 17 ++++++++ scripts/common | 26 ++++++++++++ scripts/travisci-update-readme | 77 ++++++++++++++++++++++++++++++++++ 3 files changed, 120 insertions(+) create mode 100644 .travis.yml create mode 100755 scripts/travisci-update-readme diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..540ab47 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,17 @@ +sudo: false + +services: + - docker + +env: + global: + - secure: "52OvxqyWxE2xRP+6+QqbYBJD8qMqgid4SPAWM70GOaksDMOtwuA7eJ+wY4qX69d8m8OwG5UTr7PUuYSYoCjKspgO9Uj5e1jX/u/LpsT+/C4WnwC/7mmQJ5LEOFEULDRzV0YarArsI3R9hfi1Dfs8Aym9wQ4fzL5L/b8gNLpwB9BYXd7F0vaKi0w+aDXCFGOVrD8+TrSFtRL3jN+ssx6iiBDISZOhcNnJwEKwe8SJryWttYHs6xPZrqCZ8pcev2K1UHt5Gyq5Rd5Nqz8ha1M73X0y2SuCxeAVPzg+wejU/KazPUkQpUCaftxOv2ilB6LlYLYpp/hr/bhX86tGkzi3Vx+lXyxXXzYS4vwDLXRjIX/EExG07rPM+tKU/tZGeQM3mxyK1pGMSvxHmUqjD/21WBze+oCChqhnZdPMsH4/XaKqZL2rDFMiEiQy1qyAkZajw5AUvfRuXxQhAzBmEzoep5p+6fgnmUTjqvNY0ateSOQLr3QHG2fQcIurKjSNjNHfhPfNeA1mi+Aulk1LR8eKaE4o7Q88TqG0QhCdRUfoNHgi8vQ+G3Vsaz9JM5wP3aUrjMMLOTR/PgY97HgqJvbwZM0efu1+kNfDm1ihYmHwR/6IhLu0yrZ7x8JAhD3uLMfhPxeuwY5Q7nzIH9JI7JnAwR4St997SdZY44xMluF1y0k=" + +install: + - true + +script: + - if test "${TRAVIS_EVENT_TYPE:-}" = 'push'; then ./scripts/travisci-update-readme; fi + +notifications: + email: false \ No newline at end of file diff --git a/scripts/common b/scripts/common index b19af4f..0914b89 100755 --- a/scripts/common +++ b/scripts/common @@ -26,3 +26,29 @@ stringInList () { done return 1 } + +# Return the strings that are present in two space-separated strings +# +# Arguments: +# $1: the first space-separated string +# $2: the first second-separated string +# +# Output: +# The space-separated list of strings that are present in both lists +commonElements () { + commonElements_result='' + resetIFS + for commonElements_inA in ${1} + do + if stringInList "${commonElements_inA}" "${2}" + then + if test -z "${commonElements_result}" + then + commonElements_result="${commonElements_inA}" + else + commonElements_result="${commonElements_result} ${commonElements_inA}" + fi + fi + done + echo "${commonElements_result}" +} diff --git a/scripts/travisci-update-readme b/scripts/travisci-update-readme new file mode 100755 index 0000000..6e50452 --- /dev/null +++ b/scripts/travisci-update-readme @@ -0,0 +1,77 @@ +#!/bin/sh + +# Let's set a sane environment +set -o errexit +set -o nounset + +UPDATE_README_COMMIT_AUTHOR_NAME='Travis CI' +UPDATE_README_COMMIT_AUTHOR_EMAIL='michele@locati.it' +UPDATE_README_COMMIT_MESSAGE='Automatically update README.md' +WATCHED_FILES='data/special-requirements data/supported-extensions scripts/common scripts/update-readme scripts/travisci-update-readme' + + +echo 'Checking environment' +if test -z "${TRAVIS_BUILD_DIR:-}" -o -z "${TRAVIS_BRANCH:-}" -o -z "${TRAVIS_EVENT_TYPE:-}" -o -z "${TRAVIS_REPO_SLUG:-}" +then + echo 'Not in a TravisCI environment' >&2 + exit 1 +fi +if test -z "${GUTHUB_ACCESS_TOKEN:-}" +then + + echo 'GitHub access token not set' >&2 + # To create it: + # - go to https://github.com/settings/tokens/new?scopes=repo + # - create a new token + # - sudo apt install -y build-essential ruby ruby-dev + # - sudo gem install travis + # - travis encrypt -r / GUTHUB_ACCESS_TOKEN= + # - Add to .travis.yml: + # env: + # global: + # - secure: "encrypted string" + exit 1 +fi +if test "${TRAVIS_EVENT_TYPE}" != 'push' +then + echo 'This script should only be run in push builds' >&2 + exit 1 +fi + +LAST_AUTO_UPDATED_IN="$(git -C "${TRAVIS_BUILD_DIR}" rev-list --max-count 1 --author "<${UPDATE_README_COMMIT_AUTHOR_EMAIL}>" --grep "${UPDATE_README_COMMIT_MESSAGE}" "${TRAVIS_BRANCH}")" +if test -z "${LAST_AUTO_UPDATED_IN}" +then + printf 'Rebuild of README.md enabled (no previous automatic refresh of it in branch %s)\n' "${TRAVIS_BRANCH}" +else + MODIFIED_FILES_SINCE="$(git -C "${TRAVIS_BUILD_DIR}" diff --name-only "${LAST_AUTO_UPDATED_IN}...${TRAVIS_BRANCH}")" + if test -z "$(commonElements "${WATCHED_FILES}" "${MODIFIED_FILES_SINCE}")" + then + printf 'Rebuild of README.md not needed (no relevant files changed in branch %s since commit %s)\n' "${TRAVIS_BRANCH}" "${LAST_AUTO_UPDATED_IN}" + exit 0 + fi + printf 'Rebuild of README.md enabled (relevant files changed in branch %s since commit %s)\n' "${TRAVIS_BRANCH}" "${LAST_AUTO_UPDATED_IN}" +fi + +echo 'Updating README.md' +"${TRAVIS_BUILD_DIR}/scripts/update-readme" +set -x +if test -z "$(git -C "${TRAVIS_BUILD_DIR}" ls-files -m | grep -E '^README\.md$')" +then + echo 'README.md has not been changed' + exit 0 +fi + +echo 'Committing changes to README.md' +git -C "${TRAVIS_BUILD_DIR}" config user.name "${UPDATE_README_COMMIT_AUTHOR_NAME}" +git -C "${TRAVIS_BUILD_DIR}" config user.email "${UPDATE_README_COMMIT_AUTHOR_EMAIL}" +git -C "${TRAVIS_BUILD_DIR}" add README.md +git -C "${TRAVIS_BUILD_DIR}" commit -m "${UPDATE_README_COMMIT_MESSAGE}" + +printf 'Adding %s remote\n' "${TRAVIS_REPO_SLUG}" +git remote add deploy "https://${GUTHUB_ACCESS_TOKEN}@github.com/${TRAVIS_REPO_SLUG}.git" + +printf 'Pushing to %s\n' "${TRAVIS_REPO_SLUG}" +git push deploy "${TARGET_BRANCH}" +git -C "${TRAVIS_BUILD_DIR}" push add deploy "https://${GUTHUB_ACCESS_TOKEN}@github.com/${TRAVIS_REPO_SLUG}.git" + +echo 'Done.'