.git/hooks/update.sample
changeset 762 0147c0a9ce2b
equal deleted inserted replaced
761:e4e656f19771 762:0147c0a9ce2b
       
     1 #!/bin/sh
       
     2 #
       
     3 # An example hook script to block unannotated tags from entering.
       
     4 # Called by "git receive-pack" with arguments: refname sha1-old sha1-new
       
     5 #
       
     6 # To enable this hook, rename this file to "update".
       
     7 #
       
     8 # Config
       
     9 # ------
       
    10 # hooks.allowunannotated
       
    11 #   This boolean sets whether unannotated tags will be allowed into the
       
    12 #   repository.  By default they won't be.
       
    13 # hooks.allowdeletetag
       
    14 #   This boolean sets whether deleting tags will be allowed in the
       
    15 #   repository.  By default they won't be.
       
    16 # hooks.allowmodifytag
       
    17 #   This boolean sets whether a tag may be modified after creation. By default
       
    18 #   it won't be.
       
    19 # hooks.allowdeletebranch
       
    20 #   This boolean sets whether deleting branches will be allowed in the
       
    21 #   repository.  By default they won't be.
       
    22 # hooks.denycreatebranch
       
    23 #   This boolean sets whether remotely creating branches will be denied
       
    24 #   in the repository.  By default this is allowed.
       
    25 #
       
    26 
       
    27 # --- Command line
       
    28 refname="$1"
       
    29 oldrev="$2"
       
    30 newrev="$3"
       
    31 
       
    32 # --- Safety check
       
    33 if [ -z "$GIT_DIR" ]; then
       
    34 	echo "Don't run this script from the command line." >&2
       
    35 	echo " (if you want, you could supply GIT_DIR then run" >&2
       
    36 	echo "  $0 <ref> <oldrev> <newrev>)" >&2
       
    37 	exit 1
       
    38 fi
       
    39 
       
    40 if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then
       
    41 	echo "usage: $0 <ref> <oldrev> <newrev>" >&2
       
    42 	exit 1
       
    43 fi
       
    44 
       
    45 # --- Config
       
    46 allowunannotated=$(git config --type=bool hooks.allowunannotated)
       
    47 allowdeletebranch=$(git config --type=bool hooks.allowdeletebranch)
       
    48 denycreatebranch=$(git config --type=bool hooks.denycreatebranch)
       
    49 allowdeletetag=$(git config --type=bool hooks.allowdeletetag)
       
    50 allowmodifytag=$(git config --type=bool hooks.allowmodifytag)
       
    51 
       
    52 # check for no description
       
    53 projectdesc=$(sed -e '1q' "$GIT_DIR/description")
       
    54 case "$projectdesc" in
       
    55 "Unnamed repository"* | "")
       
    56 	echo "*** Project description file hasn't been set" >&2
       
    57 	exit 1
       
    58 	;;
       
    59 esac
       
    60 
       
    61 # --- Check types
       
    62 # if $newrev is 0000...0000, it's a commit to delete a ref.
       
    63 zero=$(git hash-object --stdin </dev/null | tr '[0-9a-f]' '0')
       
    64 if [ "$newrev" = "$zero" ]; then
       
    65 	newrev_type=delete
       
    66 else
       
    67 	newrev_type=$(git cat-file -t $newrev)
       
    68 fi
       
    69 
       
    70 case "$refname","$newrev_type" in
       
    71 	refs/tags/*,commit)
       
    72 		# un-annotated tag
       
    73 		short_refname=${refname##refs/tags/}
       
    74 		if [ "$allowunannotated" != "true" ]; then
       
    75 			echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2
       
    76 			echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2
       
    77 			exit 1
       
    78 		fi
       
    79 		;;
       
    80 	refs/tags/*,delete)
       
    81 		# delete tag
       
    82 		if [ "$allowdeletetag" != "true" ]; then
       
    83 			echo "*** Deleting a tag is not allowed in this repository" >&2
       
    84 			exit 1
       
    85 		fi
       
    86 		;;
       
    87 	refs/tags/*,tag)
       
    88 		# annotated tag
       
    89 		if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1
       
    90 		then
       
    91 			echo "*** Tag '$refname' already exists." >&2
       
    92 			echo "*** Modifying a tag is not allowed in this repository." >&2
       
    93 			exit 1
       
    94 		fi
       
    95 		;;
       
    96 	refs/heads/*,commit)
       
    97 		# branch
       
    98 		if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then
       
    99 			echo "*** Creating a branch is not allowed in this repository" >&2
       
   100 			exit 1
       
   101 		fi
       
   102 		;;
       
   103 	refs/heads/*,delete)
       
   104 		# delete branch
       
   105 		if [ "$allowdeletebranch" != "true" ]; then
       
   106 			echo "*** Deleting a branch is not allowed in this repository" >&2
       
   107 			exit 1
       
   108 		fi
       
   109 		;;
       
   110 	refs/remotes/*,commit)
       
   111 		# tracking branch
       
   112 		;;
       
   113 	refs/remotes/*,delete)
       
   114 		# delete tracking branch
       
   115 		if [ "$allowdeletebranch" != "true" ]; then
       
   116 			echo "*** Deleting a tracking branch is not allowed in this repository" >&2
       
   117 			exit 1
       
   118 		fi
       
   119 		;;
       
   120 	*)
       
   121 		# Anything else (is there anything else?)
       
   122 		echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2
       
   123 		exit 1
       
   124 		;;
       
   125 esac
       
   126 
       
   127 # --- Finished
       
   128 exit 0