aboutsummaryrefslogtreecommitdiff
path: root/git-hooks
diff options
context:
space:
mode:
authorBenjamin C Meyer <ben@meyerhome.net>2010-03-17 00:13:44 -0400
committerBenjamin C Meyer <ben@meyerhome.net>2010-03-17 01:56:18 -0400
commit87b670fb4bdf465cf2fe68d7dce0cc0db47f7110 (patch)
tree0d6664eaec205ef89e91d28070f93833cc1ad3aa /git-hooks
parenta51f1cc2155a59190c2ed2ee13d8824e892eecfd (diff)
downloadgit-hooks-87b670fb4bdf465cf2fe68d7dce0cc0db47f7110.tar.gz
git-hooks-87b670fb4bdf465cf2fe68d7dce0cc0db47f7110.tar.bz2
Initial stab at the git-hooks script that will run user, application, and global hooks.
Signed-off-by: Benjamin C Meyer <ben@meyerhome.net>
Diffstat (limited to 'git-hooks')
-rwxr-xr-xgit-hooks150
1 files changed, 150 insertions, 0 deletions
diff --git a/git-hooks b/git-hooks
new file mode 100755
index 0000000..1448348
--- /dev/null
+++ b/git-hooks
@@ -0,0 +1,150 @@
+#!/bin/bash
+#
+# Copyright (c) 2010, Benjamin C. Meyer <ben@meyerhome.net>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+# 3. All advertising materials mentioning features or use of this software
+# must display the following acknowledgement:
+# This product includes software developed by Benjamin C. Meyer.
+# 4. Neither the name of the project nor the
+# names of its contributors may be used to endorse or promote products
+# derived from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY
+# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+
+GHD=`dirname \`which git-hooks\``
+
+function hook_dirs
+{
+ hook="${1}"
+ echo "${HOME}/.git_hooks/${hook}"
+ echo "${PWD}/git_hooks/${hook}"
+ if [ -z ${GLOBAL_GIT_HOOKS} ] ; then
+ echo "${GHD}/contrib/${hook}"
+ else
+ echo "${GLOBAL_GIT_HOOKS}"
+ fi
+}
+
+function list_hooks_in_dir
+{
+ find "${1}" -executable -type f 2>/dev/null | grep -v "^.$" | sort -V
+}
+
+function run_hooks
+{
+ dir="${1}"
+ shift 1
+ for hook in `list_hooks_in_dir "${dir}"`
+ do
+ echo -e "@@ Running hook: `basename "${hook}"`"
+ ${hook} "$@"
+ done
+}
+
+function run_hook
+{
+ set -e
+ hook=`basename "${1}"`
+ shift 1
+ for dir in `hook_dirs "${hook}"`; do
+ if [ ! -d "${dir}" ] ; then
+ continue
+ fi
+ run_hooks "${dir}" "$@"
+ done
+ set +e
+}
+
+function install_hooks
+{
+ if [ ! -d ".git" ] ; then
+ echo "$1 must be run in the same directory as .git/"
+ return 1
+ fi
+ cd .git/
+ if [ "${1}" = "--install" ] ; then
+ mv hooks hooks.old
+ mkdir hooks
+ cd hooks
+ for file in applypatch-msg commit-msg post-applypatch post-checkout post-commit post-merge post-receive pre-applypatch pre-auto-gc pre-commit prepare-commit-msg pre-rebase pre-receive update
+ do
+ echo '#!/bin/bash
+git-hooks run "$0" "$@"' > "${file}"
+ chmod +x "${file}"
+ done
+ else
+ if [ ! -d hooks.old ] ; then
+ echo "Error, hooks.old doesn't exists, aborting uninstall to not destroy something"
+ return 1
+ fi
+ rm -rf hooks
+ mv hooks.old hooks
+ fi
+}
+
+function list_hooks
+{
+ while [ ! -d ".git" ] ; do
+ cd ..
+ done
+ cat .git/hooks/pre-commit | grep 'git-hooks' > /dev/null 2> /dev/null
+ if [ $? = 0 ] ; then
+ echo -n "Git hooks ARE installed in this project."
+ else
+ echo -n "Git hooks are NOT installed."
+ fi
+
+ echo ' Listing User, Project, and Global hooks:'
+ echo '---'
+ for dir in `hook_dirs`; do
+ echo "${dir}:"
+ for hook in `list_hooks_in_dir "${dir}"` ; do
+ echo -n `basename \`dirname "${hook}"\``
+ echo -e "/`basename "${hook}"` \t- `${hook} --about`"
+ done
+ echo ""
+ done
+}
+
+case $1 in
+ run )
+ if [ ! -z "${GIT_DIR}" ] ; then
+ unset GIT_DIR
+ fi
+ shift
+ run_hook "$@"
+ ;;
+ --install|--uninstall )
+ install_hooks "$1"
+ ;;
+ -h|--help )
+ echo "Git Hooks"
+ echo ""
+ echo "Options:"
+ echo " --install Show all achievements."
+ echo " --uninstall Publish existing achievements and push to origin."
+ echo " run [cmd] Run the hooks for cmd such as pre-commit"
+ echo " (no arguments) Show current hooks"
+ ;;
+ * )
+ list_hooks
+ ;;
+esac