[PATCH] add automatic git hook setting in autogen.sh
Fridrich Strba (via Code Review)
gerrit at gerrit.libreoffice.org
Mon Sep 2 01:33:26 PDT 2013
Hi,
I would like you to review the following patch:
https://gerrit.libreoffice.org/5749
To pull it, you can do:
git pull ssh://gerrit.libreoffice.org:29418/libmspub refs/changes/49/5749/1
add automatic git hook setting in autogen.sh
Change-Id: I95eb02dc2d347337d7b85f85d6459353278fb137
---
A .git-hooks/README
A .git-hooks/commit-msg
A .git-hooks/post-merge
A .git-hooks/pre-commit
M autogen.sh
5 files changed, 366 insertions(+), 7 deletions(-)
diff --git a/.git-hooks/README b/.git-hooks/README
new file mode 100644
index 0000000..c6612bc
--- /dev/null
+++ b/.git-hooks/README
@@ -0,0 +1,9 @@
+Git hooks are executable scripts you can place in $GIT_DIR/hooks directory to trigger action at certain points.
+
+There are two groups of these hooks: client side and server side.
+The client-side hooks:
+are for client operations such as committing and merging.
+The server-side hooks:
+are for Git server operations such as receiving pushed commits.
+
+See Also [ http://git-scm.com/book/en/Customizing-Git-Git-Hooks ]
\ No newline at end of file
diff --git a/.git-hooks/commit-msg b/.git-hooks/commit-msg
new file mode 100755
index 0000000..e3dfe69
--- /dev/null
+++ b/.git-hooks/commit-msg
@@ -0,0 +1,181 @@
+#!/bin/sh
+#
+# An example hook script to check the commit log message.
+# Called by git-commit with one argument, the name of the file
+# that has the commit message. The hook should exit with non-zero
+# status after issuing an appropriate message if it wants to stop the
+# commit. The hook is allowed to edit the commit message file.
+#
+# To enable this hook, make this file executable.
+
+# Uncomment the below to add a Signed-off-by line to the message.
+# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
+# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
+
+# This example catches duplicate Signed-off-by lines.
+
+base_dir=$(dirname $0)
+MSG="$1"
+
+abort() {
+ cp $1 $1.save
+ cat >&2 <<EOF
+Commit aborted, your commit message was saved as '$1.save'.
+
+Reason: $2
+
+EOF
+ exit 1
+}
+
+test "" = "$(grep '^Signed-off-by: ' "$1" |
+ sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || {
+ abort "$1" "Duplicate Signed-off-by lines."
+}
+
+# Check that the first line exists, and is not an asterisk
+
+if [ -z "`head -n 1 $1 | grep -v '^[[:blank:]]*\*$'`" ] ; then
+ abort "$1" "Please provide the general description on the first line."
+fi
+
+# ...and that it is not too long
+
+if [ "`head -n 1 $1 | wc -c`" -gt 79 ] ; then
+ abort "$1" "The first line is too long, please try to fit into 79 characters."
+fi
+
+# ...and that it does not continue on the second line
+if [ "`wc -l < $1`" -gt 1 -a -n "`head -n 2 $1 | tail -n 1 | sed 's/^#.*//'`" ] ; then
+ abort "$1" "The second line is not empty - maybe the first line continues there?"
+fi
+
+# Check that the message is not a ChangeLog-like one
+
+if [ -n "`head -n 1 $1 | grep '^[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}.*<.*@.*>'`" ] ; then
+ abort "$1" "The commit message looks like ChangeLog, please use the git form."
+fi
+
+# Check for whitespace in front of *'s
+
+if [ -n "`sed '/^#/,$d' $1 | grep '^[[:space:]]\+\*.*:'`" -a -z "`grep '^\*' $1`" ] ; then
+ abort "$1" "Please don't use whitespace in front of '* file: Description.' entries."
+fi
+
+# Check that lines do not start with '#<something>' (possibly accidental commit,
+# such as starting the message with '#ifdef', git commits start with '#<whitespace>'.
+
+if [ -n "`grep '^#[^[:blank:]]' $1`" ] ; then
+ abort "$1" "Possible accidental comment in the commit message (leading # without space)."
+fi
+
+
+#------------------ copied gerrit commit-msg hook to handle ChangeId -->
+# From Gerrit Code Review 2.3
+#
+# 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"
+
+# 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
+
+ id=`grep -i '^Change-Id:' "$MSG" | sed -e "s/.*: I//"`
+ temp_msg=`grep -v -i '^Change-Id:' "$MSG"`
+ echo "$temp_msg" > "$MSG"
+
+ if test -z "$id"
+ then
+ id=`_gen_ChangeId`
+ fi
+ 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-]+: /) {
+ $haveFooter++;
+ next;
+ }
+ next if /^[ []/;
+ $startFooter = $line if ($haveFooter && /^\r?$/);
+ last;
+ }
+
+ @footer = @message[$startFooter+1.. at 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
+#------------------ copied gerrit commit-msg hook to handle ChangeId <--
+
+
+exit 0
diff --git a/.git-hooks/post-merge b/.git-hooks/post-merge
new file mode 100755
index 0000000..25e62ed
--- /dev/null
+++ b/.git-hooks/post-merge
@@ -0,0 +1,12 @@
+#!/bin/bash
+
+# Do not warn if there were no real merge
+git rev-parse -q --verify HEAD^2 >/dev/null || exit
+
+echo
+echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
+echo "! You probably used 'git pull' instead of 'git pull -r' !"
+echo "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
+echo
+echo "You can still fix it - please do 'git pull -r' now."
+echo
diff --git a/.git-hooks/pre-commit b/.git-hooks/pre-commit
new file mode 100755
index 0000000..fdd07ad
--- /dev/null
+++ b/.git-hooks/pre-commit
@@ -0,0 +1,139 @@
+#!/usr/bin/env perl
+
+# A hook script to verify what is about to be committed.
+# Called by "git commit" with no arguments. The hook should
+# exit with non-zero status after issuing an appropriate message
+# if it wants to stop the commit.
+
+use strict;
+#use File::Copy;
+#use Cwd;
+
+$ENV{LC_ALL} = "C";
+
+sub check_whitespaces($)
+{
+ my ($h) = @_;
+ my $src_limited = "c|cpp|cxx|h|hrc|hxx|idl|inl|java|map|MK|pmk|pl|pm|sdi|sh|src|tab|ui|xcu|xml";
+ my $src_full = "c|cpp|cxx|h|hrc|hxx|idl|inl|java|map|mk|MK|pmk|pl|pm|sdi|sh|src|tab|ui|xcu|xml";
+
+ my $found_bad = 0;
+ my $filename;
+ my $reported_filename = "";
+ my $lineno;
+ sub bad_line
+ {
+ my ($why, $line, $file_filter) = @_;
+ if (!defined $file_filter || $filename =~ /\.($file_filter)$/)
+ {
+ if (!$found_bad)
+ {
+ print STDERR "*\n";
+ print STDERR "* You have some suspicious patch lines:\n";
+ print STDERR "*\n";
+ $found_bad = 1;
+ }
+ if ($reported_filename ne $filename)
+ {
+ print STDERR "* In $filename\n";
+ $reported_filename = $filename;
+ }
+ print STDERR "* $why (line $lineno)\n";
+ print STDERR "$filename:$lineno:$line\n";
+ }
+ }
+ open( FILES, "git-diff-index -p -M --cached $h |" ) || die "Cannot run git diff-index.";
+ while (<FILES>)
+ {
+ if (m|^diff --git a/(.*) b/\1$|)
+ {
+ $filename = $1;
+ next;
+ }
+ if (/^@@ -\S+ \+(\d+)/)
+ {
+ $lineno = $1 - 1;
+ next;
+ }
+ if (/^ /)
+ {
+ $lineno++;
+ next;
+ }
+ if (s/^\+//)
+ {
+ $lineno++;
+ chomp;
+ if (/\s$/)
+ {
+ bad_line("trailing whitespace", $_ , $src_limited);
+ }
+ if (/\s* /)
+ {
+ bad_line("indent with Tab", $_, $src_limited);
+ }
+ if (/^(?:[<>=]){7}$/)
+ {
+ bad_line("unresolved merge conflict", $src_full);
+ }
+ if (/SAL_DEBUG/)
+ {
+ bad_line("temporary debug in commit", $_, $src_limited);
+ }
+ if (/<property name="use_markup">True<\/property>/)
+ {
+ bad_line("use font attributes instead of use-markup", $_, $src_limited);
+ }
+ }
+ }
+ if ( $found_bad)
+ {
+ exit($found_bad);
+ }
+}
+
+# Do the work :-)
+
+# Initial commit: diff against an empty tree object
+my $against="4b825dc642cb6eb9a060e54bf8d69288fbee4904";
+if ( system( "git rev-parse --verify HEAD >/dev/null 2>&1" ) == 0 )
+{
+ $against="HEAD"
+}
+
+# If you want to allow non-ascii filenames set this variable to true.
+my $allownonascii=`git config hooks.allownonascii`;
+
+# Cross platform projects tend to avoid non-ascii filenames; prevent
+# them from being added to the repository. We exploit the fact that the
+# printable range starts at the space character and ends with tilde.
+if ( $allownonascii ne "true" &&
+ # Note that the use of brackets around a tr range is ok here, (it's
+ # even required, for portability to Solaris 10's /usr/bin/tr), since
+ # the square bracket bytes happen to fall in the designated range.
+ `git diff --cached --name-only --diff-filter=A -z $against | \
+ LC_ALL=C tr -d '[ -~]\\0'` ne "" )
+{
+ print <<EOM;
+Error: Attempt to add a non-ascii file name.
+
+This can cause problems if you want to work
+with people on other platforms.
+
+To be portable it is advisable to rename the file ...
+
+If you know what you are doing you can disable this
+check using:
+
+ git config hooks.allownonascii true
+
+EOM
+ exit( 1 );
+}
+
+# fix whitespace in code
+check_whitespaces( $against);
+
+# all OK
+exit( 0 );
+# vi:set shiftwidth=4 expandtab:
diff --git a/autogen.sh b/autogen.sh
index 25eef51..252f93d 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -1,4 +1,20 @@
#!/bin/sh
+
+set_git_hooks()
+{
+ # assume that the current directory is the source tree
+ if [ -d ".git" ] ; then
+ for hook in $(ls -1 .git-hooks) ; do
+ cd .git/hooks
+ if [ ! -e "${hook?}" -o -L "${hook?}" ] ; then
+ rm -f "${hook?}"
+ ln -sf "../../.git-hooks/${hook?}" "${hook?}"
+ fi
+ cd - > /dev/null
+ done
+ fi
+}
+
TESTLIBTOOLIZE="glibtoolize libtoolize"
LIBTOOLIZEFOUND="0"
@@ -8,6 +24,8 @@
olddir=`pwd`
cd $srcdir
+
+set_git_hooks
aclocal --version > /dev/null 2> /dev/null || {
echo "error: aclocal not found"
@@ -19,16 +37,16 @@
}
for i in $TESTLIBTOOLIZE; do
- if which $i > /dev/null 2>&1; then
- LIBTOOLIZE=$i
- LIBTOOLIZEFOUND="1"
- break
- fi
+ if which $i > /dev/null 2>&1; then
+ LIBTOOLIZE=$i
+ LIBTOOLIZEFOUND="1"
+ break
+ fi
done
if [ "$LIBTOOLIZEFOUND" = "0" ]; then
- echo "$0: need libtoolize tool to build libmspub" >&2
- exit 1
+ echo "$0: need libtoolize tool to build libmspub" >&2
+ exit 1
fi
amcheck=`automake --version | grep 'automake (GNU automake) 1.5'`
--
To view, visit https://gerrit.libreoffice.org/5749
To unsubscribe, visit https://gerrit.libreoffice.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I95eb02dc2d347337d7b85f85d6459353278fb137
Gerrit-PatchSet: 1
Gerrit-Project: libmspub
Gerrit-Branch: master
Gerrit-Owner: Fridrich Strba <fridrich at documentfoundation.org>
Gerrit-Reviewer: Norbert Thiebaud <nthiebaud at gmail.com>
More information about the LibreOffice
mailing list