Merge branch 'nd/maint-work-tree-fix' into maint
[gitweb.git] / templates / hooks--update
index 5b82b68e93980924befa9ecc99e099e77da27b5f..d8c76264beaf198f1f3558ca8429349c8eab9ead 100644 (file)
@@ -1,36 +1,16 @@
 #!/bin/sh
 #
-# An example hook script to mail out commit update information.
-# It can also blocks tags that aren't annotated.
+# An example hook script to blocks unannotated tags from entering.
 # Called by git-receive-pack with arguments: refname sha1-old sha1-new
 #
 # To enable this hook, make this file executable by "chmod +x update".
 #
 # Config
 # ------
-# hooks.mailinglist
-#   This is the list that all pushes will go to; leave it blank to not send
-#   emails frequently.  The log email will list every log entry in full between
-#   the old ref value and the new ref value.
-# hooks.announcelist
-#   This is the list that all pushes of annotated tags will go to.  Leave it
-#   blank to just use the mailinglist field.  The announce emails list the
-#   short log summary of the changes since the last annotated tag
 # hooks.allowunannotated
 #   This boolean sets whether unannotated tags will be allowed into the
 #   repository.  By default they won't be.
 #
-# Notes
-# -----
-# All emails have their subjects prefixed with "[SCM]" to aid filtering.
-# All emails include the headers "X-Git-Refname", "X-Git-Oldrev",
-# "X-Git-Newrev", and "X-Git-Reftype" to enable fine tuned filtering and info.
-
-# --- Constants
-EMAILPREFIX="[SCM] "
-LOGBEGIN="- Log -----------------------------------------------------------------"
-LOGEND="-----------------------------------------------------------------------"
-DATEFORMAT="%F %R %z"
 
 # --- Command line
 refname="$1"
@@ -51,235 +31,48 @@ if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then
 fi
 
 # --- Config
-projectdesc=$(cat $GIT_DIR/description)
-recipients=$(git-repo-config hooks.mailinglist)
-announcerecipients=$(git-repo-config hooks.announcelist)
 allowunannotated=$(git-repo-config --bool hooks.allowunannotated)
 
+# check for no description
+projectdesc=$(sed -e '1p' "$GIT_DIR/description")
+if [ -z "$projectdesc" -o "$projectdesc" = "Unnamed repository; edit this file to name it for gitweb" ]; then
+       echo "*** Project description file hasn't been set" >&2
+       exit 1
+fi
+
 # --- Check types
-newrev_type=$(git-cat-file -t $newrev)
+# if $newrev is 0000...0000, it's a commit to delete a branch
+if [ "$newrev" = "0000000000000000000000000000000000000000" ]; then
+       newrev_type=commit
+else
+       newrev_type=$(git-cat-file -t $newrev)
+fi
 
 case "$refname","$newrev_type" in
        refs/tags/*,commit)
                # un-annotated tag
-               refname_type="tag"
                short_refname=${refname##refs/tags/}
                if [ "$allowunannotated" != "true" ]; then
-                       echo "*** The un-annotated tag, $short_refname is not allowed in this repository" >&2
+                       echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2
                        echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2
                        exit 1
                fi
                ;;
        refs/tags/*,tag)
                # annotated tag
-               refname_type="annotated tag"
-               short_refname=${refname##refs/tags/}
-               # change recipients
-               if [ -n "$announcerecipients" ]; then
-                       recipients="$announcerecipients"
-               fi
                ;;
        refs/heads/*,commit)
                # branch
-               refname_type="branch"
-               short_refname=${refname##refs/heads/}
                ;;
        refs/remotes/*,commit)
                # tracking branch
-               refname_type="tracking branch"
-               short_refname=${refname##refs/remotes/}
-               # Should this even be allowed?
-               echo "*** Push-update of tracking branch, $refname.  No email generated." >&2
-               exit 0
                ;;
        *)
                # Anything else (is there anything else?)
-               echo "*** Update hook: unknown type of update, \"$newrev_type\", to ref $refname" >&2
+               echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2
                exit 1
                ;;
 esac
 
-# Check if we've got anyone to send to
-if [ -z "$recipients" ]; then
-       # If the email isn't sent, then at least give the user some idea of what command
-       # would generate the email at a later date
-       echo "*** No recipients found - no email will be sent, but the push will continue" >&2
-       echo "*** for $0 $1 $2 $3" >&2
-       exit 0
-fi
-
-# --- Email parameters
-committer=$(git show --pretty=full -s $newrev | grep "^Commit: " | sed -e "s/^Commit: //")
-describe=$(git describe $newrev 2>/dev/null)
-if [ -z "$describe" ]; then
-       describe=$newrev
-fi
-
-# --- Email (all stdout will be the email)
-(
-# Generate header
-cat <<-EOF
-From: $committer
-To: $recipients
-Subject: ${EMAILPREFIX}$projectdesc $refname_type, $short_refname now at $describe
-X-Git-Refname: $refname
-X-Git-Reftype: $refname_type
-X-Git-Oldrev: $oldrev
-X-Git-Newrev: $newrev
-
-Hello,
-
-This is an automated email from the git hooks/update script, it was
-generated because a ref change was pushed to the repository.
-
-Updating $refname_type, $short_refname,
-EOF
-
-case "$refname_type" in
-       "tracking branch"|branch)
-               if expr "$oldrev" : '0*$' >/dev/null
-               then
-                       # If the old reference is "0000..0000" then this is a new branch
-                       # and so oldrev is not valid
-                       echo "  as a new  $refname_type"
-                   echo "        to  $newrev ($newrev_type)"
-                       echo ""
-                       echo $LOGBEGIN
-                       # This shows all log entries that are not already covered by
-                       # another ref - i.e. commits that are now accessible from this
-                       # ref that were previously not accessible
-                       git log $newrev --not --all
-                       echo $LOGEND
-               else
-                       # oldrev is valid
-                       oldrev_type=$(git-cat-file -t "$oldrev")
-
-                       # Now the problem is for cases like this:
-                       #   * --- * --- * --- * (oldrev)
-                       #          \
-                       #           * --- * --- * (newrev)
-                       # i.e. there is no guarantee that newrev is a strict subset
-                       # of oldrev - (would have required a force, but that's allowed).
-                       # So, we can't simply say rev-list $oldrev..$newrev.  Instead
-                       # we find the common base of the two revs and list from there
-                       baserev=$(git-merge-base $oldrev $newrev)
-
-                       # Commit with a parent
-                       for rev in $(git-rev-list $newrev --not $baserev --all)
-                       do
-                               revtype=$(git-cat-file -t "$rev")
-                               echo "       via  $rev ($revtype)"
-                       done
-                       if [ "$baserev" = "$oldrev" ]; then
-                               echo "      from  $oldrev ($oldrev_type)"
-                       else
-                               echo "  based on  $baserev"
-                               echo "      from  $oldrev ($oldrev_type)"
-                               echo ""
-                               echo "This ref update crossed a branch point; i.e. the old rev is not a strict subset"
-                               echo "of the new rev.  This occurs, when you --force push a change in a situation"
-                               echo "like this:"
-                               echo ""
-                               echo " * -- * -- B -- O -- O -- O ($oldrev)"
-                               echo "            \\"
-                               echo "             N -- N -- N ($newrev)"
-                               echo ""
-                               echo "Therefore, we assume that you've already had alert emails for all of the O"
-                               echo "revisions, and now give you all the revisions in the N branch from the common"
-                               echo "base, B ($baserev), up to the new revision."
-                       fi
-                       echo ""
-                       echo $LOGBEGIN
-                       git log $newrev --not $baserev --all
-                       echo $LOGEND
-                       echo ""
-                       echo "Diffstat:"
-                       git-diff-tree --no-color --stat -M -C --find-copies-harder $baserev..$newrev
-               fi
-               ;;
-       "annotated tag")
-               # Should we allow changes to annotated tags?
-               if expr "$oldrev" : '0*$' >/dev/null
-               then
-                       # If the old reference is "0000..0000" then this is a new atag
-                       # and so oldrev is not valid
-                       echo "        to  $newrev ($newrev_type)"
-               else
-                       echo "        to  $newrev ($newrev_type)"
-                       echo "      from  $oldrev"
-               fi
-
-               # If this tag succeeds another, then show which tag it replaces
-               prevtag=$(git describe $newrev^ 2>/dev/null | sed 's/-g.*//')
-               if [ -n "$prevtag" ]; then
-                       echo "  replaces  $prevtag"
-               fi
-
-               # Read the tag details
-               eval $(git cat-file tag $newrev | \
-                       sed -n '4s/tagger \([^>]*>\)[^0-9]*\([0-9]*\).*/tagger="\1" ts="\2"/p')
-               tagged=$(date --date="1970-01-01 00:00:00 +0000 $ts seconds" +"$DATEFORMAT")
-
-               echo " tagged by  $tagger"
-               echo "        on  $tagged"
-
-               echo ""
-               echo $LOGBEGIN
-               echo ""
-
-               if [ -n "$prevtag" ]; then
-                       git rev-list --pretty=short "$prevtag..$newrev" | git shortlog
-               else
-                       git rev-list --pretty=short $newrev | git shortlog
-               fi
-
-               echo $LOGEND
-               echo ""
-               ;;
-       *)
-               # By default, unannotated tags aren't allowed in; if
-               # they are though, it's debatable whether we would even want an
-               # email to be generated; however, I don't want to add another config
-               # option just for that.
-               #
-               # Unannotated tags are more about marking a point than releasing
-               # a version; therefore we don't do the shortlog summary that we
-               # do for annotated tags above - we simply show that the point has
-               # been marked, and print the log message for the marked point for
-               # reference purposes
-               #
-               # Note this section also catches any other reference type (although
-               # there aren't any) and deals with them in the same way.
-               if expr "$oldrev" : '0*$' >/dev/null
-               then
-                       # If the old reference is "0000..0000" then this is a new tag
-                       # and so oldrev is not valid
-                       echo "  as a new  $refname_type"
-                       echo "        to  $newrev ($newrev_type)"
-               else
-                       echo "        to  $newrev ($newrev_type)"
-                       echo "      from  $oldrev"
-               fi
-               echo ""
-               echo $LOGBEGIN
-               git-show --no-color --root -s $newrev
-               echo $LOGEND
-               echo ""
-               ;;
-esac
-
-# Footer
-cat <<-EOF
-
-hooks/update
----
-Git Source Code Management System
-$0 $1 \\
-  $2 \\
-  $3
-EOF
-#) | cat >&2
-) | /usr/sbin/sendmail -t
-
 # --- Finished
 exit 0