summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichele Calgaro <michele.calgaro@yahoo.it>2024-01-17 12:42:42 +0900
committerMichele Calgaro <michele.calgaro@yahoo.it>2024-01-27 13:50:15 +0900
commitfda421a6f611bfed526f90d01e41271ba2aa33f3 (patch)
treeb3d3c8ff99d7d03ff076c58c011571f7a16d799b
parent0e60f5c6834eb89dec4c62ab67d0a08a87a2ba77 (diff)
downloadscripts-code-format/git-hook-update.tar.gz
scripts-code-format/git-hook-update.zip
Code format: git update hook scriptcode-format/git-hook-update
Signed-off-by: Michele Calgaro <michele.calgaro@yahoo.it>
-rwxr-xr-xcode_format/git-hooks/update93
-rwxr-xr-xcode_format/server-side/srv_format_file37
2 files changed, 130 insertions, 0 deletions
diff --git a/code_format/git-hooks/update b/code_format/git-hooks/update
new file mode 100755
index 0000000..078e2ba
--- /dev/null
+++ b/code_format/git-hooks/update
@@ -0,0 +1,93 @@
+#!/bin/bash
+
+# Hook called when commits are pushed to the remote git server
+# Parameters:
+# $1 - the branch reference
+# $2 - the old branch HEAD hash
+# $3 - the new branch HEAD hash
+#
+# If a branch is newly created, $2 will be all zeros.
+# If a branch is deleted, $3 will be all zeros.
+
+
+# set default encoding to UTF-8
+export LANG=C.UTF-8
+export LC_ALL=C.UTF-8
+
+SCRIPT_DIR=`dirname $(readlink -f "$0")`
+
+# Only run if we are pushing an update on a branch.
+# Any other operation (for example pushing tags) will be allowed normally.
+[[ "$1" =~ ^refs/heads/ ]] || exit 0
+
+# get hook data
+BRANCH_REF=$1
+BRANCH_NAME=${1#"refs/heads/"}
+
+# Only run if we are pushing a commit to TDE main branches (master, r14.#.x).
+# Commits pushed to other branches (for example for PRs) won't be checked here,
+# since gitea actions will take care of checking them prior to allow merging.
+[[ "${BRANCH_NAME}" =~ ^master$ ]] || [[ "${BRANCH_NAME}" =~ ^r14\.[0-9]+\.x$ ]] || exit 0
+
+OLD_HASH=$2
+NEW_HASH=$3
+
+# Do nothing if branch "r14.#.x" is removed (this should never happen anyway)
+[[ "${BRANCH_NAME}" =~ ^r14 ]] && [[ "${NEW_HASH}" =~ ^0+$ ]] && exit 0
+
+# If we are creating the branch "r14.#.x", find the diverge point from master
+if [[ "${BRANCH_NAME}" =~ ^r14 ]] && [[ "${OLD_HASH}" =~ ^0+$ ]]; then
+ OLD_HASH=`git merge-base master ${NEW_HASH}`
+fi
+
+ALL_HASHES=`git rev-list --reverse ${OLD_HASH}..${NEW_HASH}`
+
+echo "-----------------"
+echo "Branch name: ${BRANCH_NAME}"
+echo "Old hash: ${OLD_HASH}"
+echo "New hash: ${NEW_HASH}"
+echo "-----------------"
+
+# Check code format version, if present
+git cat-file -e ${NEW_HASH}:.repo_settings/code_format.txt 2>/dev/null ||
+ { echo "No code format version information file found for repository"; exit 0; }
+
+MOD_CFG_ENTRY=`git show ${NEW_HASH}:.repo_settings/code_format.txt | grep "Version" | grep -v "^\s*#"`
+[ -n "${MOD_CFG_ENTRY}" ] || { echo "No code format version information found for repository"; exit 0; }
+[ `echo "${MOD_CFG_ENTRY}" | wc -l` = 1 ] ||
+ { echo "Multiple versions found in the code format file. Aborting."; exit 1; }
+
+MOD_CFG_VERSION=`echo "${MOD_CFG_ENTRY}" | sed "s|^\s*Version\s\+\([0-9]\+\)\s*$|\1|"`
+MOD_CFG_FILE=${SCRIPT_DIR}/../uncrustify_cfg_files/uncrustify_tde_${MOD_CFG_VERSION}.cfg
+
+# Check whether files adhere to the required code format
+VALID_EXTENSIONS=".h .cpp .c .h.cmake .cpp.cmake .c.cmake .hpp .hxx .hh .cxx .cc .hpp.cmake"
+while read -r COMMIT_HASH; do
+ echo "Validating code format for commit: ${COMMIT_HASH}"
+ echo "-----------------"
+ while read -r FILE_AND_STATUS; do
+ if [[ "${FILE_AND_STATUS}" =~ ([ACMR])[[:space:]]+(.*) ]]; then
+ FILE_STATUS="${BASH_REMATCH[1]}"
+ FILE_NAME="${BASH_REMATCH[2]}"
+ # Only check files of the proper type
+ for FILE_EXT in $VALID_EXTENSIONS; do
+ if [[ "${FILE_NAME}" = *${FILE_EXT} ]]; then
+ echo "File: ${FILE_NAME} --- Git status: ${FILE_STATUS}"
+ ${SCRIPT_DIR}/../server-side/srv_format_file ${MOD_CFG_FILE} ${COMMIT_HASH} ${FILE_NAME}
+ if [ $? -ne 0 ]; then
+ echo -e "\n--------------------------------------------------------"
+ echo " Process aborted due to failed code format verification "
+ echo -e "--------------------------------------------------------\n"
+ exit 1
+ fi
+ echo "------"
+ break
+ fi
+ done
+ fi
+ done < <(git show --pretty="" --name-status ${COMMIT_HASH})
+done < <(git rev-list --reverse ${OLD_HASH}..${NEW_HASH})
+
+echo -e "\n----------------------------------------------"
+echo " All files adhere to the required code format "
+echo "----------------------------------------------"
diff --git a/code_format/server-side/srv_format_file b/code_format/server-side/srv_format_file
new file mode 100755
index 0000000..e201ffb
--- /dev/null
+++ b/code_format/server-side/srv_format_file
@@ -0,0 +1,37 @@
+#!/bin/bash
+
+#
+# This script is intended to run on the gitea server from the git update script.
+# It will extract the required file from the commit hash and filename, then
+# invoke the 'uncrustify_file.sh' script to verify if the file meets the required
+# code format.
+#
+# Parameters:
+# $1: config file
+# $2: commit hash
+# $3: file to verify
+#
+
+SCRIPT_DIR=`dirname $(readlink -f "$0")`
+
+CODE_FORMAT_DIR="/tmp/code-format/"
+[ -d "${CODE_FORMAT_DIR}" ] || mkdir "${CODE_FORMAT_DIR}"
+
+TMP_SRC_FILE=`mktemp -p ${CODE_FORMAT_DIR} "tmp_XXXXXXXX_${3##*/}"`
+
+# Helper function to clean up the temp file on exit
+function do_exit()
+{
+ [ ! -e "$TMP_SRC_FILE" ] || rm "$TMP_SRC_FILE"
+ exit $1
+}
+
+# Get the file to verify
+git show $2:$3 >$TMP_SRC_FILE
+
+${SCRIPT_DIR}/../uncrustify_file "$1" "${TMP_SRC_FILE}" 0
+if [ $? -eq 0 ]; then
+ do_exit 0
+else
+ do_exit 1
+fi