From 0f69164b62c5df0374bc0431de62267e8f2e750a Mon Sep 17 00:00:00 2001 From: Amit Kumar Date: Tue, 27 Apr 2021 22:21:34 +0530 Subject: Make pre-commit executable --- .idea/codeStyles/Project.xml | 15 +++++++------ hooks/pre-commit | 50 ++++++++++++++++++++++++++++++++++++-------- hooks/setup-hooks | 4 ++++ 3 files changed, 52 insertions(+), 17 deletions(-) mode change 100644 => 100755 hooks/pre-commit create mode 100755 hooks/setup-hooks diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index 49f1221..b66e2e7 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -20,7 +20,7 @@ + + - + \ No newline at end of file diff --git a/hooks/pre-commit b/hooks/pre-commit old mode 100644 new mode 100755 index 00d361b..6e0b167 --- a/hooks/pre-commit +++ b/hooks/pre-commit @@ -1,14 +1,46 @@ -#!/bin/sh +#!/bin/bash -./gradlew spotlessCheck -q -EXIT_CODE=$? -if [ $EXIT_CODE -ne 0 ]; then - echo "❌ spotlessCheck failed, running spotlessApply for you..." +filesToAddAfterFormatting=() +containsSpotlessEnabledFormats=0 - ./gradlew spotlessApply -q +# Collect all files currently in staging area, and check if there are any spotless enabled format file +# We currently support only *.kt, *.gradle', '*.md', '.gitignore' files. +for entry in $(git status --porcelain | sed -r 's/[ \t]+/-/g'); do + # entry can be for example: + # MM-src/main/java/net/project/MyController.java + # -M-src/main/java/net/project/AnotherController.java - echo "Formatting done, please try your commit again! If the problem persists, apply fixes manually." - exit $EXIT_CODE + if [[ $entry == M* ]]; then + filesToAddAfterFormatting+=(${entry:2}) # strips the prefix + fi + + if [[ $entry == *.kt ]] || [[ $entry == *.gradle ]] || [[ $entry == *.md ]] || [[ $entry == .gitignore ]]; then + containsSpotlessEnabledFormats=1 + fi +done + +# If any java or kotlin files are found, run spotlessApply +if [ "$containsSpotlessEnabledFormats" == "1" ]; then + echo '[git hook] executing gradle spotlessCheck before commit' + ./gradlew spotlessCheck + EXIT_CODE=$? + if [ $EXIT_CODE -ne 0 ]; then + echo "❌ [git hook] spotlessCheck failed, running spotlessApply for you..." + + ./gradlew spotlessApply + + echo "[git hook] Formatting done, please try your commit again! If the problem persists, apply fixes manually." + exit $EXIT_CODE + fi + echo "✔️ [git hook] Spotless: Everything looks clean!" +else + echo "[git hook] Not running spotless" fi -exit 0 \ No newline at end of file +# Add the files that were in the staging area +for file in "${filesToAddAfterFormatting[@]}"; do + echo "re-adding $file after formatting" + git add "$file" +done + +exit 0 diff --git a/hooks/setup-hooks b/hooks/setup-hooks new file mode 100755 index 0000000..4f48be0 --- /dev/null +++ b/hooks/setup-hooks @@ -0,0 +1,4 @@ +#!/bin/sh + +# This script setups symlink from .git/hooks directory to this directory. +ln -s -f ../../hooks/pre-commit .git/hooks/pre-commit \ No newline at end of file -- cgit v1.2.1