Add some Git hooks to ease dev. 00/4200/5
Sylvestre Ledru [Sat, 11 Jun 2011 23:43:18 +0000 (01:43 +0200)]
Enabled by:
mv .git/hooks /tmp/
cd .git/
ln -s ../git_hooks/ hooks

Change-Id: I35afa478cb9baef5114e16251811e714f255e00e

git_hooks/commit-msg [new file with mode: 0755]
git_hooks/pre-commit [new file with mode: 0755]
git_hooks/prepare-commit-msg [new file with mode: 0755]

diff --git a/git_hooks/commit-msg b/git_hooks/commit-msg
new file mode 100755 (executable)
index 0000000..0c50f69
--- /dev/null
@@ -0,0 +1,104 @@
+#!/bin/sh
+# From Gerrit Code Review 2.1.5
+#
+# Part of Gerrit Code Review (http://code.google.com/p/gerrit/)
+#
+# Copyright (C) 2009 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+CHANGE_ID_AFTER="Bug|Issue"
+MSG="$1"
+
+# Check for, and add if missing, a unique Change-Id
+#
+add_ChangeId() {
+       clean_message=$(sed -e '
+               /^diff --git a\/.*/{
+                       s///
+                       q
+               }
+               /^Signed-off-by:/d
+               /^#/d
+       ' "$MSG" | git stripspace)
+       if test -z "$clean_message"
+       then
+               return
+       fi
+
+       if grep -i '^Change-Id:' "$MSG" >/dev/null
+       then
+               return
+       fi
+
+       id=$(_gen_ChangeId)
+       perl -e '
+               $MSG = shift;
+               $id = shift;
+               $CHANGE_ID_AFTER = shift;
+
+               undef $/;
+               open(I, $MSG); $_ = <I>; close I;
+               s|^diff --git a/.*||ms;
+               s|^#.*$||mg;
+               exit unless $_;
+
+               @message = split /\n/;
+               $haveFooter = 0;
+               $startFooter = @message;
+               for($line = @message - 1; $line >= 0; $line--) {
+                       $_ = $message[$line];
+
+                       if (/^[a-zA-Z0-9-]+:/ && !m,^[a-z0-9-]+://,) {
+                               $haveFooter++;
+                               next;
+                       }
+                       next if /^[ []/;
+                       $startFooter = $line if ($haveFooter && /^\r?$/);
+                       last;
+               }
+
+               @footer = @message[$startFooter+1..@message];
+               @message = @message[0..$startFooter];
+               push(@footer, "") unless @footer;
+
+               for ($line = 0; $line < @footer; $line++) {
+                       $_ = $footer[$line];
+                       next if /^($CHANGE_ID_AFTER):/i;
+                       last;
+               }
+               splice(@footer, $line, 0, "Change-Id: I$id");
+
+               $_ = join("\n", @message, @footer);
+               open(O, ">$MSG"); print O; close O;
+       ' "$MSG" "$id" "$CHANGE_ID_AFTER"
+}
+_gen_ChangeIdInput() {
+       echo "tree $(git write-tree)"
+       if parent=$(git rev-parse HEAD^0 2>/dev/null)
+       then
+               echo "parent $parent"
+       fi
+       echo "author $(git var GIT_AUTHOR_IDENT)"
+       echo "committer $(git var GIT_COMMITTER_IDENT)"
+       echo
+       printf '%s' "$clean_message"
+}
+_gen_ChangeId() {
+       _gen_ChangeIdInput |
+       git hash-object -t commit --stdin
+}
+
+
+add_ChangeId
diff --git a/git_hooks/pre-commit b/git_hooks/pre-commit
new file mode 100755 (executable)
index 0000000..f7f0c99
--- /dev/null
@@ -0,0 +1,96 @@
+#!/bin/sh
+#
+# Hook used to indent all xcos files before commiting
+#
+
+XMLLINT="$(git config hooks.xmllint)"
+if test ! -x "$XMLLINT"
+then
+       echo "Unable to find xmllint executable on the configuration."
+       echo
+       echo "Please configure it with :"
+       echo "  git config hooks.xmllint C:/path/to/xmllint"
+       echo
+fi
+
+INDENT="$(git config hooks.indent)"
+if test ! -x "$INDENT"
+then
+       echo "Unable to find indent executable on the configuration."
+       echo
+       echo "Please configure it with :"
+       echo "  git config hooks.indent C:/path/to/indent"
+       echo
+fi
+
+# indent / format file by type
+indent() {
+       # getting against as the current commit
+       if git rev-parse --verify HEAD >/dev/null 2>&1
+       then
+               local against=HEAD
+       else
+               # Initial commit: diff against an empty tree object
+               local against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
+       fi
+
+       # loop on modified files
+       git diff --cached --name-only $against |while read file;
+       do
+               local ext=$(expr "$file" : ".*\(\..*\)")
+               case $ext in
+               .xcos)
+                       __indent_Xml;
+               ;;
+               .xml)
+                       __indent_Xml;
+               ;;
+               .h)
+                       __indent_C;
+               ;;
+               .c)
+                       __indent_C;
+               ;;
+               .hxx)
+                       __indent_C;
+               ;;
+               .cpp)
+                       __indent_C;
+               ;;
+               esac
+       done
+}
+# Indent the file with xmllint if this is an xcos file
+__indent_Xml() {
+
+       if test ! -x "$XMLLINT"
+       then
+               return;
+       fi
+       if test ! -f $file
+       then
+               return;
+       fi
+
+       echo "Formatting " $file
+       "$XMLLINT" --format -o "$file" "$file"
+       git add "$file"
+}
+# Indent the file with `indent' if this is a C/CPP file
+__indent_C() {
+
+       if test ! -x "$INDENT"
+       then
+               return;
+       fi
+       if test ! -f $file
+       then
+               return;
+       fi
+
+       echo "Indenting " $file
+       "$INDENT" -npro --braces-after-if-line -i4 -ts4 -sob -ss -ncs -sc --no-space-after-parentheses -cp1 --no-tabs -bap -bad -npcs --dont-break-function-decl-args --dont-break-procedure-type -bli0 -l150 -il0 "$file"
+       git add "$file"
+}
+
+indent
diff --git a/git_hooks/prepare-commit-msg b/git_hooks/prepare-commit-msg
new file mode 100755 (executable)
index 0000000..0bfbee9
--- /dev/null
@@ -0,0 +1,21 @@
+#!/bin/sh
+#
+# Hook used to produce a commit message based on CHANGES
+#
+
+FILE="$1"
+SOURCE="$2"
+COMMIT="$3"
+
+case $SOURCE in
+'')
+    TMP=$(mktemp) && \
+    cat $FILE >$TMP && \
+    git diff --cached scilab/CHANGES_* |sed -n '/^+/p' |sed -n '/^+++/!p' |sed 's/^.\{1\}//g' >$FILE && \
+    cat $TMP >>$FILE && \
+    rm $TMP
+  ;;
+*)
+  ;;
+esac
+