| #!/bin/sh |
| |
| # https://bugs.eclipse.org/362363 : Better policy ... provide hooks to allow a committer to delete <userid>/branchname branches |
| # Latest version is at http://git.eclipse.org/c/e4/org.eclipse.e4.releng.git/tree/org.eclipse.e4.builder/scripts/pre-receive |
| |
| # |
| # 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. Use <committerId>/<branchname> for topic branches, or ask your project lead or PMC to temporarily set hooks.allowcreatenottopicbranch to true. ***" |
| 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. Use <committerId>/<branchname> for topic branches, or ask your project lead or PMC to temporarily set hooks.allownonffpush to true. ***" |
| 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 |
| |