#!/usr/bin/env bash # Library for easier Git hook scripting # Copyright (C) 2019 Aaron Ball # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . set -eou pipefail export OLDREV NEWREV REFNAME declare -a TAGS declare -a REFS declare -a FILES_A declare -a FILES_M declare -a FILES_D declare -a FILES_R export IFS=$' \n\t' read OLDREV NEWREV REFNAME export IFS=$'\n' [ ${OLDREV} = '0000000000000000000000000000000000000000' ] && OLDREV=${NEWREV} [ ${NEWREV} = '0000000000000000000000000000000000000000' ] && NEWREV=${OLDREV} # load_tags: # Loads any tags into the TAGS array that were created within the changed refs. load_tags() { if [ "${REFNAME:0:10}" = 'refs/tags/' ]; then if [ -f "${REFNAME}" ]; then printf '[tag] created %s\n' "$(basename ${REFNAME})" TAGS+=("$(basename ${REFNAME})") elif [ ! -f "${REFNAME}" ]; then printf '[tag] deleted %s\n' "$(basename ${REFNAME})" else printf '[tag] Something went wrong with "%s"\n' "${REFNAME}" fi fi } # load_refs: # Loads the list of new refs into the REFS array load_refs() { REFS=($(git rev-list "^${OLDREV}" "${NEWREV}")) } # load_file_actions: # Reads the changed refs list and loads file paths into their respective files # arrays (eg: FILES_A (added), FILES_D (deleted), FILES_M (modified), and # FILES_R (renamed)). load_file_actions() { local changes=($(git diff --name-status "^${OLDREV}" "${NEWREV}")) for change in ${changes[@]}; do if [ "${change:0:1}" = 'A' ]; then # File is added FILES_A+=(${change#* }) elif [ "${change:0:1}" = 'M' ]; then # File is modified FILES_M+=(${change#* }) elif [ "${change:0:1}" = 'D' ]; then # File is deleted FILES_D+=(${change#* }) elif [ "${change:0:4}" = 'R100' ]; then # File is moved/renamed FILES_R+=(${change#* }) fi done } # dump_sess: # Dumps all gathered info about the git operation to stdout so clients can see # the changes that were detected. This includes dumping the files arrays, tags # arrays and the ref information. dump_sess() { printf '\n' printf 'OLD: %s\n' "${OLDREV}" printf 'NEW: %s\n' "${NEWREV}" printf 'NAME: %s\n\n' "${REFNAME}" printf 'Files added:\n' printf ' %s\n' "${FILES_A[@]}" printf 'Files modified:\n' printf ' %s\n' "${FILES_M[@]}" printf 'Files deleted:\n' printf ' %s\n' "${FILES_D[@]}" printf 'Files renamed:\n' printf ' %s\n' "${FILES_R[@]}" printf 'Tags created:\n' printf ' %s\n' "${TAGS[@]}" printf '\n' }