home

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit e15ccf203d8c99f5bdbf4dc0e6864512bd6633b6
parent 9506b3afc3bfdde696da8262c58d2131ae7fbd77
Author: Vincent Demeester <vincent@sbr.pm>
Date:   Sat,  9 May 2020 14:05:23 +0200

Add .githooks and a Makefile target…

… to install them

Signed-off-by: Vincent Demeester <vincent@sbr.pm>

Diffstat:
A.githooks/pre-commit | 4++++
A.githooks/pre-push | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A.githooks/prepare-commit-msg | 30++++++++++++++++++++++++++++++
MMakefile | 3+++
4 files changed, 99 insertions(+), 0 deletions(-)

diff --git a/.githooks/pre-commit b/.githooks/pre-commit @@ -0,0 +1,4 @@ +#!/bin/sh +unset NIX_BUILD_SHELL +export NIX_BUILD_SHELL +nix-shell -p gnumake --run 'make update-docs' diff --git a/.githooks/pre-push b/.githooks/pre-push @@ -0,0 +1,62 @@ +#!/bin/sh + +# Based on https://gist.github.com/Quintok/815396509ff79d886656b2855e1a8a46 + +# A pre-push hook based on the git template. This will verify that no WIP or +# autosquash commits are present. If such a commit is present, pushing will not +# be possible. + +# This hook is called with the following parameters: +# +# $1 -- Name of the remote to which the push is being done +# $2 -- URL to which the push is being done +# +# If pushing without using a named remote those arguments will be equal. +# +# Information about the commits which are being pushed is supplied as lines to +# the standard input in the form: +# +# <local ref> <local sha1> <remote ref> <remote sha1> + +z40=0000000000000000000000000000000000000000 + +IFS=' ' +while read -r local_ref local_sha remote_ref remote_sha +do + echo "$remote_ref" > /dev/null + + if [ "$local_sha" = $z40 ] + then + # Ignore delete + : + else + if [ "$remote_sha" = $z40 ] + then + # New branch, examine all commits since master + range="$(git merge-base $local_sha master)..$local_sha" + else + # Update to existing branch, examine new commits + range="$remote_sha..$local_sha" + fi + + # Check for WIP commits + commit=$(git rev-list -n 1 --grep '^WIP' "$range") + if [ "${local_ref}" = refs/heads/master ] && [ -n "$commit" ] + then + printf "\nPush rejected: WIP commit detected\n\n" + exit 1 + fi + + # Check for autosquash commits + commit=$(git rev-list -n 1 --grep '^\(fixup\|squash\)!' "$range") + if [ -n "$commit" ] + then + printf "\nPush rejected: autosquash commit detected\n\n" + exit 1 + fi + fi +done + +# Local Variables: +# sh-basic-offset: 2 +# End: diff --git a/.githooks/prepare-commit-msg b/.githooks/prepare-commit-msg @@ -0,0 +1,30 @@ +#!/usr/bin/env bash + +if [ -n "$2" ]; then + exit +fi + +# Skip if a string like 'squash!' is included in the original message +if grep --quiet -P "^\\w+!" "$1"; then + exit 0 +fi +COMMIT=$(git symbolic-ref HEAD) + +# Generate a commit message from the diff of the commit +IFS=$'\n' +for s in $(git --no-pager diff --cached --name-status "$COMMIT"); do + FILENAME=$(echo "$s" | cut -f2) + STATUS=${s:0:1} + # Insert a line into the message depending on the status of the file + case ${STATUS} in + M) + SED_COMMAND="1i${FILENAME}: \n" ;; + A) + SED_COMMAND="1i${FILENAME}: Init\n" ;; + esac + sed -i "${SED_COMMAND}" "$1" +done + +# Local Variables: +# sh-basic-offset: 2 +# End: diff --git a/Makefile b/Makefile @@ -61,6 +61,9 @@ switch: assets setup home-manager switch;\ fi +install-hooks: + if [ -e .git ]; then nix-shell -p git --run 'git config core.hooksPath .githooks'; fi + # Cleaning .PHONY: clean clean: