From bd0f66308c971796e01c7f624907115e32f84256 Mon Sep 17 00:00:00 2001 From: "Xinwei Xiong(cubxxw)" <3293172751nss@gmail.com> Date: Mon, 15 May 2023 15:50:39 +0800 Subject: [PATCH] feat: supports and optimizes git hooks Signed-off-by: Xinwei Xiong(cubxxw) <3293172751nss@gmail.com> --- script/githooks/commit-msg | 2 +- script/githooks/pre-commit | 31 ++++++++++++++++++++++++++----- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/script/githooks/commit-msg b/script/githooks/commit-msg index add13ac52..ca0d93e69 100644 --- a/script/githooks/commit-msg +++ b/script/githooks/commit-msg @@ -67,6 +67,6 @@ test "" = "$(grep '^Signed-off-by: ' "$1" | if [ $? -ne 0 ] then printError "Please fix your commit message to match OpenIM coding standards" - printError "https://OpenIM.gitbook.io/docs/essential-documentation/contribute-to-OpenIM/software-contributions/submitting-code/code-submission-guidelines#commit-message-guidelines" + printError "https://gist.github.com/cubxxw/126b72104ac0b0ca484c9db09c3e5694" exit 1 fi \ No newline at end of file diff --git a/script/githooks/pre-commit b/script/githooks/pre-commit index 26e014346..91c331b79 100644 --- a/script/githooks/pre-commit +++ b/script/githooks/pre-commit @@ -46,7 +46,9 @@ printMessage "Running local OpenIM pre-commit hook." # flutter format . # https://gist.github.com/cubxxw/126b72104ac0b0ca484c9db09c3e5694 # TODO! GIT_FILE_SIZE_LIMIT=50000000 git commit -m "test: this commit is allowed file sizes up to 50MB" -limit=$(( 2 * 2**20 )) # 2MB +# Maximum file size limit in bytes +limit=${GIT_FILE_SIZE_LIMIT:-2000000} # Default 2MB +limitInMB=$(( $limit / 1000000 )) function file_too_large(){ filename=$0 @@ -57,22 +59,41 @@ function file_too_large(){ File $filename is $filesize MB, which is larger than github's maximum file size (2 MB). We will not be able to push this file to GitHub. Commit aborted + HEREDOC + git status } +# Move to the repo root so git files paths make sense +repo_root=$( git rev-parse --show-toplevel ) +cd $repo_root + empty_tree=$( git hash-object -t tree /dev/null ) + if git rev-parse --verify HEAD > /dev/null 2>&1 then against=HEAD else - against=empty_tree + against="$empty_tree" fi +# Set split so that for loop below can handle spaces in file names by splitting on line breaks +IFS=' +' + +shouldFail=false for file in $( git diff-index --cached --name-only $against ); do - file_size=$( ls -la $file | awk '{ print $5 }') + file_size=$(([ ! -f $file ] && echo 0) || (ls -la $file | awk '{ print $5 }')) if [ "$file_size" -gt "$limit" ]; then - file_too_large $filename $file_size - exit 1; + printError "File $file is $(( $file_size / 10**6 )) MB, which is larger than our configured limit of $limitInMB MB" + shouldFail=true fi done + +if $shouldFail +then + printMessage "If you really need to commit this file, you can override the size limit by setting the GIT_FILE_SIZE_LIMIT environment variable, e.g. GIT_FILE_SIZE_LIMIT=42000000 for 42MB. Or, commit with the --no-verify switch to skip the check entirely." + printError "Commit aborted" + exit 1; +fi \ No newline at end of file