Bug 362363 - Better policy ... provide hooks to allow a committer to delete committerId/branchname branches

Store the hook in an SCM
diff --git a/org.eclipse.e4.builder/scripts/pre-receive b/org.eclipse.e4.builder/scripts/pre-receive
new file mode 100755
index 0000000..804ba42
--- /dev/null
+++ b/org.eclipse.e4.builder/scripts/pre-receive
@@ -0,0 +1,107 @@
+#!/bin/sh
+
+#
+#	For each ref, validate the commit.
+#
+validate_ref()
+{
+	# --- Arguments
+	oldrev=$(git rev-parse $1)
+	newrev=$(git rev-parse $2)
+	refname="$3"
+
+	allownonffpush=$( git config --bool hooks.allownonffpush )
+	allowdeletebranch=$( git config --bool hooks.allowdeletebranch )
+	allowdeletetag=$( git config --bool hooks.allowdeletetag )
+	allowcreatenottopicbranch=$( git config --bool hooks.allowcreatenottopicbranch )
+	# oldrev could be 0s which means creating refname
+	# newrev could be 0s which means deleting refname
+
+	case "$refname" in
+		refs/heads/*)
+			branch=$(expr "$refname" : "refs/heads/\(.*\)")
+			topicbranch=$(expr "$branch" : "\(.*/.*\)")
+			topicuser=$(expr "$branch" : "\(.*\)/.*")
+			if [ 0 -ne $(expr "$newrev" : "0*$") ]; then # deleting
+				# only topic branches can be deleted
+				if [ "$allowdeletebranch" != "true" -a -z "$topicbranch" ]; then
+					fail=1
+					echo >&2 "*** Deleting the branch $branch is not permitted. ***"
+					return
+				fi
+				if [  "$allowdeletebranch" != "true" -a "$USER" != "$topicuser" ]; then
+					fail=1
+					echo >&2 "*** Deleting the branch $branch is not permitted by $USER. ***"
+					return
+				fi
+				return # Don't need to validate old revision
+			else #updating
+				if [ 0 -ne $(expr "$oldrev" : "0*$") ]; then # pushing a new branch
+					if [ "$allowcreatenottopicbranch" != "true" -a -z "$topicbranch" ]; then
+						fail=1
+						echo >&2 "*** creation of branch $branch is not permitted. ***"
+					fi
+					return # it's not a FF merge
+				fi
+				if [ $oldrev != $(git merge-base $oldrev $newrev) ]; then # non fast-forward
+					# only topic branches can be non fast-forwarded
+					if [ "$allownonffpush" != "true" -a -z "$topicbranch" ]; then
+						fail=1
+						echo >&2 "*** Non fast-forward of branch $branch is not permitted. ***"
+						return
+					fi
+					if [  "$allownonffpush" != "true" -a "$USER" != "$topicuser" ]; then
+						fail=1
+						echo >&2 "*** Non fast-forward of branch $branch is not permitted by $USER. ***"
+						return
+					fi
+				fi
+			fi
+			;;
+		refs/tags/*)
+		    tag=$(expr "$refname" : "refs/tags/\(.*\)")
+			topictag=$(expr "$tag" : "\(.*/.*\)")
+			topicuser=$(expr "$tag" : "\(.*\)/.*")
+			if [ 0 -ne $(expr "$newrev" : "0*$") ]; then # deleting
+				# only topic tags can be deleted
+				if [ "$allowdeletetag" != "true" -a -z "$topictag" ]; then
+					fail=1
+					echo >&2 "*** Deleting the tag $tag is not permitted. ***"
+					return
+				fi
+				if [  "$allowdeletetag" != "true" -a "$USER" != "$topicuser" ]; then
+					fail=1
+					echo >&2 "*** Deleting the tag $tag is not permitted by $USER. ***"
+					return
+				fi
+				return
+			fi
+			;;
+		*)
+			fail=1
+			echo >&2 "*** pre-receive hook does not understand ref $refname in this repository. ***"
+			echo >&2 "*** Contact the repository administrator. ***"
+			;;
+	esac
+}
+
+fail=""
+
+# Allow dual mode: run from the command line just like the update hook, or
+# if no arguments are given then run as a hook script
+if [ -n "$1" -a -n "$2" -a -n "$3" ]; then
+	# Output to the terminal in command line mode - if someone wanted to
+	# resend an email; they could redirect the output to sendmail
+	# themselves
+	PAGER= validate_ref $2 $3 $1
+else
+	while read oldrev newrev refname
+	do
+		validate_ref $oldrev $newrev $refname
+	done
+fi
+
+if [ -n "$fail" ]; then
+	exit $fail
+fi
+