Commit 87dc1579 authored by Dom Sekotill's avatar Dom Sekotill
Browse files

Added a '-k|--keep' argument to init command

init command has a new --keep argument that packs any old hook.d
directories that do not appear to be from git-hooks into tar files.
--force now simply removes old versions so --keep is effectively doing
what --force used to do.
parent 9dd968da
Loading
Loading
Loading
Loading
+22 −7
Original line number Diff line number Diff line
@@ -53,27 +53,42 @@ full_usage ()
	done
}

mv_unique ()
{
	local src="$1" pattern="$2"
	local i=0
	while ! ln "$src" "`printf "$pattern" $i`" 2>/dev/null; do
		i=$((i+1))
	done
	rm "$src"
}

cmd_init ()
{
	summary="set up git-hook directories in a repository"
	local force skip
	local force keep skip
	local hook tmp
	add_arg FLAG -f force; add_arg_alias force --force
	add_arg FLAG -k keep; add_arg_alias keep --keep
	add_arg FLAG -s skip; add_arg_alias skip --skip
	parse_args "$@" || return

	cd "$GIT_DIR"/hooks
	for hook in $HOOKS; do
		[ $hook -ef "$LIBDIR"/run-hooks ] && continue
		if ! mkdir $hook.d 2>/dev/null; then
			if [ x$force == xyes ]; then
				mv $hook.d $hook.d.old
				mv $hook $hook.old
				chmod -x $hook.old
				mkdir $hook.d
			if [ x$keep == xyes ]; then
				tmp=`mktemp $hook-XXX.tar`
				tar -cf $tmp $hook $hook.d
				mv_unique $tmp "$hook.`date +%Y-%m-%d`.%02i.tar"
			elif [ x$skip == xyes ]; then
				continue
			else
			elif [ x$force != xyes ]; then
				die "$hook.d already exists"
			fi
			rm -r $hook.d
			rm $hook
			mkdir $hook.d
		fi
		[ -e $hook ] && mv $hook $hook.d/org_$hook
		ln -s "$LIBDIR"/run-hooks $hook