From ba35102408c2c412d6d284f2d42b6a8099bedfa9 Mon Sep 17 00:00:00 2001 From: Jonathan Lebon Date: Thu, 11 May 2017 14:28:49 -0400 Subject: [PATCH] import ci/ci-commitmessage-submodules.sh from ostree This would be useful here as well. Added small tweaks that I intend to upstream (using realpath and --no-merges). Closes: #773 Approved by: cgwalters --- .redhat-ci.yml | 1 + ci/ci-commitmessage-submodules.sh | 55 +++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100755 ci/ci-commitmessage-submodules.sh diff --git a/.redhat-ci.yml b/.redhat-ci.yml index e36f82b9..e599aa4e 100644 --- a/.redhat-ci.yml +++ b/.redhat-ci.yml @@ -11,6 +11,7 @@ container: image: registry.fedoraproject.org/fedora:25 tests: + - ci/ci-commitmessage-submodules.sh - ci/build-check.sh timeout: 30m diff --git a/ci/ci-commitmessage-submodules.sh b/ci/ci-commitmessage-submodules.sh new file mode 100755 index 00000000..858d70cf --- /dev/null +++ b/ci/ci-commitmessage-submodules.sh @@ -0,0 +1,55 @@ +#!/bin/bash +set -xeuo pipefail + +# Copyright 2017 Colin Walters +# Licensed under the new-BSD license (http://www.opensource.org/licenses/bsd-license.php) + +# This script is intended to be used as a CI gating check +# that if a submodule is changed, the commit message contains +# the text: +# +# Update submodule: submodulepath +# +# It's very common for people to accidentally change submodules, and having this +# requirement is a small hurdle to pass. + +# if running under RHCI, use the branch/PR HEAD actually +# being tested rather than the merge sha +HEAD=${RHCI_COMMIT:-HEAD} + +tmpd=$(mktemp -d) +touch ${tmpd}/.tmpdir +cleanup_tmp() { + # This sanity check ensures we don't delete something else + if test -f ${tmpd}/.tmpdir; then + rm -rf ${tmpd} + fi +} +trap cleanup_tmp EXIT + +gitdir=$(realpath $(pwd)) +# Create a temporary copy of this (using cp not git clone) so git doesn't +# try to read the submodules from the Internet again. If we wanted to +# require a newer git, we could use `git worktree`. +cp -a ${gitdir} ${tmpd}/workdir +cd ${tmpd}/workdir +git log --pretty=oneline origin/master..$HEAD | while read logline; do + commit=$(echo ${logline} | cut -f 1 -d ' ') + git diff --name-only ${commit}^..${commit} > ${tmpd}/diff.txt + git log -1 ${commit} > ${tmpd}/log.txt + echo "Validating commit for submodules: $commit" + sed -e 's,^,# ,' < ${tmpd}/log.txt + git checkout -q "${commit}" + git submodule update --init + git submodule foreach --quiet 'echo $path'| while read submodule; do + if grep -q -e '^'${submodule} ${tmpd}/diff.txt; then + echo "Commit $commit modifies submodule: $submodule" + expected_match="Update submodule: $submodule" + if ! grep -q -e "$expected_match" ${tmpd}/log.txt; then + echo "error: Commit message for ${commit} changes a submodule, but does not match regex ${expected_match}" + exit 1 + fi + echo "Verified commit $commit matches regexp ${expected_match}" + fi + done +done