Advertisement
arulrajnet

hooks/post-receive-email

Dec 21st, 2012
401
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 21.58 KB | None | 0 0
  1. #!/bin/sh
  2. #
  3. # Copyright (c) 2007 Andy Parkins
  4. #
  5. # An example hook script to mail out commit update information.  This hook
  6. # sends emails listing new revisions to the repository introduced by the
  7. # change being reported.  The rule is that (for branch updates) each commit
  8. # will appear on one email and one email only.
  9. #
  10. # This hook is stored in the contrib/hooks directory.  Your distribution
  11. # will have put this somewhere standard.  You should make this script
  12. # executable then link to it in the repository you would like to use it in.
  13. # For example, on debian the hook is stored in
  14. # /usr/share/doc/git-core/contrib/hooks/post-receive-email:
  15. #
  16. #  chmod a+x post-receive-email
  17. #  cd /path/to/your/repository.git
  18. #  ln -sf /usr/share/doc/git-core/contrib/hooks/post-receive-email hooks/post-receive
  19. #
  20. # This hook script assumes it is enabled on the central repository of a
  21. # project, with all users pushing only to it and not between each other.  It
  22. # will still work if you don't operate in that style, but it would become
  23. # possible for the email to be from someone other than the person doing the
  24. # push.
  25. #
  26. # To help with debugging and use on pre-v1.5.1 git servers, this script will
  27. # also obey the interface of hooks/update, taking its arguments on the
  28. # command line.  Unfortunately, hooks/update is called once for each ref.
  29. # To avoid firing one email per ref, this script just prints its output to
  30. # the screen when used in this mode.  The output can then be redirected if
  31. # wanted.
  32. #
  33. # Config
  34. # ------
  35. # hooks.mailinglist
  36. #   This is the list that all pushes will go to; leave it blank to not send
  37. #   emails for every ref update.
  38. # hooks.announcelist
  39. #   This is the list that all pushes of annotated tags will go to.  Leave it
  40. #   blank to default to the mailinglist field.  The announce emails lists
  41. #   the short log summary of the changes since the last annotated tag.
  42. # hooks.envelopesender
  43. #   If set then the -f option is passed to sendmail to allow the envelope
  44. #   sender address to be set
  45. # hooks.emailprefix
  46. #   All emails have their subjects prefixed with this prefix, or "[SCM]"
  47. #   if emailprefix is unset, to aid filtering
  48. # hooks.showrev
  49. #   The shell command used to format each revision in the email, with
  50. #   "%s" replaced with the commit id.  Defaults to "git rev-list -1
  51. #   --pretty %s", displaying the commit id, author, date and log
  52. #   message.  To list full patches separated by a blank line, you
  53. #   could set this to "git show -C %s; echo".
  54. #   To list a gitweb/cgit URL *and* a full patch for each change set, use this:
  55. #     "t=%s; printf 'http://.../?id=%%s' \$t; echo;echo; git show -C \$t; echo"
  56. #   Be careful if "..." contains things that will be expanded by shell "eval"
  57. #   or printf.
  58. # hooks.emailmaxlines
  59. #   The maximum number of lines that should be included in the generated
  60. #   email body. If not specified, there is no limit.
  61. #   Lines beyond the limit are suppressed and counted, and a final
  62. #   line is added indicating the number of suppressed lines.
  63. #
  64. # Notes
  65. # -----
  66. # All emails include the headers "X-Git-Refname", "X-Git-Oldrev",
  67. # "X-Git-Newrev", and "X-Git-Reftype" to enable fine tuned filtering and
  68. # give information for debugging.
  69. #
  70.  
  71. # ---------------------------- Functions
  72.  
  73. #
  74. # Function to prepare for email generation. This decides what type
  75. # of update this is and whether an email should even be generated.
  76. #
  77. prep_for_email()
  78. {
  79.     # --- Arguments
  80.     oldrev=$(git rev-parse $1)
  81.     newrev=$(git rev-parse $2)
  82.     refname="$3"
  83.     maxlines=$4
  84.  
  85.     # --- Interpret
  86.     # 0000->1234 (create)
  87.     # 1234->2345 (update)
  88.     # 2345->0000 (delete)
  89.     if expr "$oldrev" : '0*$' >/dev/null
  90.     then
  91.         change_type="create"
  92.     else
  93.         if expr "$newrev" : '0*$' >/dev/null
  94.         then
  95.             change_type="delete"
  96.         else
  97.             change_type="update"
  98.         fi
  99.     fi
  100.  
  101.     # --- Get the revision types
  102.     newrev_type=$(git cat-file -t $newrev 2> /dev/null)
  103.     oldrev_type=$(git cat-file -t "$oldrev" 2> /dev/null)
  104.     case "$change_type" in
  105.     create|update)
  106.         rev="$newrev"
  107.         rev_type="$newrev_type"
  108.         ;;
  109.     delete)
  110.         rev="$oldrev"
  111.         rev_type="$oldrev_type"
  112.         ;;
  113.     esac
  114.  
  115.     # The revision type tells us what type the commit is, combined with
  116.     # the location of the ref we can decide between
  117.     #  - working branch
  118.     #  - tracking branch
  119.     #  - unannoted tag
  120.     #  - annotated tag
  121.     case "$refname","$rev_type" in
  122.         refs/tags/*,commit)
  123.             # un-annotated tag
  124.             refname_type="tag"
  125.             short_refname=${refname##refs/tags/}
  126.             ;;
  127.         refs/tags/*,tag)
  128.             # annotated tag
  129.             refname_type="annotated tag"
  130.             short_refname=${refname##refs/tags/}
  131.             # change recipients
  132.             if [ -n "$announcerecipients" ]; then
  133.                 recipients="$announcerecipients"
  134.             fi
  135.             ;;
  136.         refs/heads/*,commit)
  137.             # branch
  138.             refname_type="branch"
  139.             short_refname=${refname##refs/heads/}
  140.             ;;
  141.         refs/remotes/*,commit)
  142.             # tracking branch
  143.             refname_type="tracking branch"
  144.             short_refname=${refname##refs/remotes/}
  145.             echo >&2 "*** Push-update of tracking branch, $refname"
  146.             echo >&2 "***  - no email generated."
  147.             return 1
  148.             ;;
  149.         *)
  150.             # Anything else (is there anything else?)
  151.             echo >&2 "*** Unknown type of update to $refname ($rev_type)"
  152.             echo >&2 "***  - no email generated"
  153.             return 1
  154.             ;;
  155.     esac
  156.  
  157.     # Check if we've got anyone to send to
  158.     if [ -z "$recipients" ]; then
  159.         case "$refname_type" in
  160.             "annotated tag")
  161.                 config_name="hooks.announcelist"
  162.                 ;;
  163.             *)
  164.                 config_name="hooks.mailinglist"
  165.                 ;;
  166.         esac
  167.         echo >&2 "*** $config_name is not set so no email will be sent"
  168.         echo >&2 "*** for $refname update $oldrev->$newrev"
  169.         return 1
  170.     fi
  171.  
  172.     return 0
  173. }
  174.  
  175. #
  176. # Top level email generation function.  This calls the appropriate
  177. # body-generation routine after outputting the common header.
  178. #
  179. # Note this function doesn't actually generate any email output, that is
  180. # taken care of by the functions it calls:
  181. #  - generate_email_header
  182. #  - generate_create_XXXX_email
  183. #  - generate_update_XXXX_email
  184. #  - generate_delete_XXXX_email
  185. #  - generate_email_footer
  186. #
  187. # Note also that this function cannot 'exit' from the script; when this
  188. # function is running (in hook script mode), the send_mail() function
  189. # is already executing in another process, connected via a pipe, and
  190. # if this function exits without, whatever has been generated to that
  191. # point will be sent as an email... even if nothing has been generated.
  192. #
  193. generate_email()
  194. {
  195.     # Email parameters
  196.     # The email subject will contain the best description of the ref
  197.     # that we can build from the parameters
  198.     describe=$(git describe $rev 2>/dev/null)
  199.     if [ -z "$describe" ]; then
  200.         describe=$rev
  201.     fi
  202.  
  203.     generate_email_header
  204.  
  205.     # Call the correct body generation function
  206.     fn_name=general
  207.     case "$refname_type" in
  208.     "tracking branch"|branch)
  209.         fn_name=branch
  210.         ;;
  211.     "annotated tag")
  212.         fn_name=atag
  213.         ;;
  214.     esac
  215.  
  216.     if [ -z "$maxlines" ]; then
  217.         generate_${change_type}_${fn_name}_email
  218.     else
  219.         generate_${change_type}_${fn_name}_email | limit_lines $maxlines
  220.     fi
  221.  
  222.     generate_email_footer
  223. }
  224.  
  225. generate_email_header()
  226. {
  227.     # --- Email (all stdout will be the email)
  228.     # Generate header
  229.     cat <<-EOF
  230.     To: $recipients
  231.     Subject: ${emailprefix}$projectdesc $refname_type $short_refname ${change_type}d. $describe
  232.     X-Git-Refname: $refname
  233.     X-Git-Reftype: $refname_type
  234.     X-Git-Oldrev: $oldrev
  235.     X-Git-Newrev: $newrev
  236.  
  237.     This is an automated email from the git hooks/post-receive script. It was
  238.     generated because a ref change was pushed to the repository containing
  239.     the project "$projectdesc".
  240.  
  241.     The $refname_type, $short_refname has been ${change_type}d
  242.     EOF
  243. }
  244.  
  245. generate_email_footer()
  246. {
  247.     SPACE=" "
  248.     cat <<-EOF
  249.  
  250.  
  251.     hooks/post-receive
  252.     --${SPACE}
  253.     $projectdesc
  254.     EOF
  255. }
  256.  
  257. # --------------- Branches
  258.  
  259. #
  260. # Called for the creation of a branch
  261. #
  262. generate_create_branch_email()
  263. {
  264.     # This is a new branch and so oldrev is not valid
  265.     echo "        at  $newrev ($newrev_type)"
  266.     echo ""
  267.  
  268.     echo $LOGBEGIN
  269.     show_new_revisions
  270.     echo $LOGEND
  271. }
  272.  
  273. #
  274. # Called for the change of a pre-existing branch
  275. #
  276. generate_update_branch_email()
  277. {
  278.     # Consider this:
  279.     #   1 --- 2 --- O --- X --- 3 --- 4 --- N
  280.     #
  281.     # O is $oldrev for $refname
  282.     # N is $newrev for $refname
  283.     # X is a revision pointed to by some other ref, for which we may
  284.     #   assume that an email has already been generated.
  285.     # In this case we want to issue an email containing only revisions
  286.     # 3, 4, and N.  Given (almost) by
  287.     #
  288.     #  git rev-list N ^O --not --all
  289.     #
  290.     # The reason for the "almost", is that the "--not --all" will take
  291.     # precedence over the "N", and effectively will translate to
  292.     #
  293.     #  git rev-list N ^O ^X ^N
  294.     #
  295.     # So, we need to build up the list more carefully.  git rev-parse
  296.     # will generate a list of revs that may be fed into git rev-list.
  297.     # We can get it to make the "--not --all" part and then filter out
  298.     # the "^N" with:
  299.     #
  300.     #  git rev-parse --not --all | grep -v N
  301.     #
  302.     # Then, using the --stdin switch to git rev-list we have effectively
  303.     # manufactured
  304.     #
  305.     #  git rev-list N ^O ^X
  306.     #
  307.     # This leaves a problem when someone else updates the repository
  308.     # while this script is running.  Their new value of the ref we're
  309.     # working on would be included in the "--not --all" output; and as
  310.     # our $newrev would be an ancestor of that commit, it would exclude
  311.     # all of our commits.  What we really want is to exclude the current
  312.     # value of $refname from the --not list, rather than N itself.  So:
  313.     #
  314.     #  git rev-parse --not --all | grep -v $(git rev-parse $refname)
  315.     #
  316.     # Get's us to something pretty safe (apart from the small time
  317.     # between refname being read, and git rev-parse running - for that,
  318.     # I give up)
  319.     #
  320.     #
  321.     # Next problem, consider this:
  322.     #   * --- B --- * --- O ($oldrev)
  323.     #          \
  324.     #           * --- X --- * --- N ($newrev)
  325.     #
  326.     # That is to say, there is no guarantee that oldrev is a strict
  327.     # subset of newrev (it would have required a --force, but that's
  328.     # allowed).  So, we can't simply say rev-list $oldrev..$newrev.
  329.     # Instead we find the common base of the two revs and list from
  330.     # there.
  331.     #
  332.     # As above, we need to take into account the presence of X; if
  333.     # another branch is already in the repository and points at some of
  334.     # the revisions that we are about to output - we don't want them.
  335.     # The solution is as before: git rev-parse output filtered.
  336.     #
  337.     # Finally, tags: 1 --- 2 --- O --- T --- 3 --- 4 --- N
  338.     #
  339.     # Tags pushed into the repository generate nice shortlog emails that
  340.     # summarise the commits between them and the previous tag.  However,
  341.     # those emails don't include the full commit messages that we output
  342.     # for a branch update.  Therefore we still want to output revisions
  343.     # that have been output on a tag email.
  344.     #
  345.     # Luckily, git rev-parse includes just the tool.  Instead of using
  346.     # "--all" we use "--branches"; this has the added benefit that
  347.     # "remotes/" will be ignored as well.
  348.  
  349.     # List all of the revisions that were removed by this update, in a
  350.     # fast-forward update, this list will be empty, because rev-list O
  351.     # ^N is empty.  For a non-fast-forward, O ^N is the list of removed
  352.     # revisions
  353.     fast_forward=""
  354.     rev=""
  355.     for rev in $(git rev-list $newrev..$oldrev)
  356.     do
  357.         revtype=$(git cat-file -t "$rev")
  358.         echo "  discards  $rev ($revtype)"
  359.     done
  360.     if [ -z "$rev" ]; then
  361.         fast_forward=1
  362.     fi
  363.  
  364.     # List all the revisions from baserev to newrev in a kind of
  365.     # "table-of-contents"; note this list can include revisions that
  366.     # have already had notification emails and is present to show the
  367.     # full detail of the change from rolling back the old revision to
  368.     # the base revision and then forward to the new revision
  369.     for rev in $(git rev-list $oldrev..$newrev)
  370.     do
  371.         revtype=$(git cat-file -t "$rev")
  372.         echo "       via  $rev ($revtype)"
  373.     done
  374.  
  375.     if [ "$fast_forward" ]; then
  376.         echo "      from  $oldrev ($oldrev_type)"
  377.     else
  378.         #  1. Existing revisions were removed.  In this case newrev
  379.         #     is a subset of oldrev - this is the reverse of a
  380.         #     fast-forward, a rewind
  381.         #  2. New revisions were added on top of an old revision,
  382.         #     this is a rewind and addition.
  383.  
  384.         # (1) certainly happened, (2) possibly.  When (2) hasn't
  385.         # happened, we set a flag to indicate that no log printout
  386.         # is required.
  387.  
  388.         echo ""
  389.  
  390.         # Find the common ancestor of the old and new revisions and
  391.         # compare it with newrev
  392.         baserev=$(git merge-base $oldrev $newrev)
  393.         rewind_only=""
  394.         if [ "$baserev" = "$newrev" ]; then
  395.             echo "This update discarded existing revisions and left the branch pointing at"
  396.             echo "a previous point in the repository history."
  397.             echo ""
  398.             echo " * -- * -- N ($newrev)"
  399.             echo "            \\"
  400.             echo "             O -- O -- O ($oldrev)"
  401.             echo ""
  402.             echo "The removed revisions are not necessarilly gone - if another reference"
  403.             echo "still refers to them they will stay in the repository."
  404.             rewind_only=1
  405.         else
  406.             echo "This update added new revisions after undoing existing revisions.  That is"
  407.             echo "to say, the old revision is not a strict subset of the new revision.  This"
  408.             echo "situation occurs when you --force push a change and generate a repository"
  409.             echo "containing something like this:"
  410.             echo ""
  411.             echo " * -- * -- B -- O -- O -- O ($oldrev)"
  412.             echo "            \\"
  413.             echo "             N -- N -- N ($newrev)"
  414.             echo ""
  415.             echo "When this happens we assume that you've already had alert emails for all"
  416.             echo "of the O revisions, and so we here report only the revisions in the N"
  417.             echo "branch from the common base, B."
  418.         fi
  419.     fi
  420.  
  421.     echo ""
  422.     if [ -z "$rewind_only" ]; then
  423.         echo "Those revisions listed above that are new to this repository have"
  424.         echo "not appeared on any other notification email; so we list those"
  425.         echo "revisions in full, below."
  426.  
  427.         echo ""
  428.         echo $LOGBEGIN
  429.         show_new_revisions
  430.  
  431.         # XXX: Need a way of detecting whether git rev-list actually
  432.         # outputted anything, so that we can issue a "no new
  433.         # revisions added by this update" message
  434.  
  435.         echo $LOGEND
  436.     else
  437.         echo "No new revisions were added by this update."
  438.     fi
  439.  
  440.     # The diffstat is shown from the old revision to the new revision.
  441.     # This is to show the truth of what happened in this change.
  442.     # There's no point showing the stat from the base to the new
  443.     # revision because the base is effectively a random revision at this
  444.     # point - the user will be interested in what this revision changed
  445.     # - including the undoing of previous revisions in the case of
  446.     # non-fast-forward updates.
  447.     echo ""
  448.     echo "Summary of changes:"
  449.     git diff-tree --stat --summary --find-copies-harder $oldrev..$newrev
  450.    
  451.     echo ""
  452.     echo "Line of changes:"
  453.     git diff --diff-filter=M --find-copies-harder --no-prefix --unified=2 $oldrev..$newrev
  454. }
  455.  
  456. #
  457. # Called for the deletion of a branch
  458. #
  459. generate_delete_branch_email()
  460. {
  461.     echo "       was  $oldrev"
  462.     echo ""
  463.     echo $LOGEND
  464.     git show -s --pretty=oneline $oldrev
  465.     echo $LOGEND
  466. }
  467.  
  468. # --------------- Annotated tags
  469.  
  470. #
  471. # Called for the creation of an annotated tag
  472. #
  473. generate_create_atag_email()
  474. {
  475.     echo "        at  $newrev ($newrev_type)"
  476.  
  477.     generate_atag_email
  478. }
  479.  
  480. #
  481. # Called for the update of an annotated tag (this is probably a rare event
  482. # and may not even be allowed)
  483. #
  484. generate_update_atag_email()
  485. {
  486.     echo "        to  $newrev ($newrev_type)"
  487.     echo "      from  $oldrev (which is now obsolete)"
  488.  
  489.     generate_atag_email
  490. }
  491.  
  492. #
  493. # Called when an annotated tag is created or changed
  494. #
  495. generate_atag_email()
  496. {
  497.     # Use git for-each-ref to pull out the individual fields from the
  498.     # tag
  499.     eval $(git for-each-ref --shell --format='
  500.     tagobject=%(*objectname)
  501.     tagtype=%(*objecttype)
  502.     tagger=%(taggername)
  503.     tagged=%(taggerdate)' $refname
  504.     )
  505.  
  506.     echo "   tagging  $tagobject ($tagtype)"
  507.     case "$tagtype" in
  508.     commit)
  509.  
  510.         # If the tagged object is a commit, then we assume this is a
  511.         # release, and so we calculate which tag this tag is
  512.         # replacing
  513.         prevtag=$(git describe --abbrev=0 $newrev^ 2>/dev/null)
  514.  
  515.         if [ -n "$prevtag" ]; then
  516.             echo "  replaces  $prevtag"
  517.         fi
  518.         ;;
  519.     *)
  520.         echo "    length  $(git cat-file -s $tagobject) bytes"
  521.         ;;
  522.     esac
  523.     echo " tagged by  $tagger"
  524.     echo "        on  $tagged"
  525.  
  526.     echo ""
  527.     echo $LOGBEGIN
  528.  
  529.     # Show the content of the tag message; this might contain a change
  530.     # log or release notes so is worth displaying.
  531.     git cat-file tag $newrev | sed -e '1,/^$/d'
  532.  
  533.     echo ""
  534.     case "$tagtype" in
  535.     commit)
  536.         # Only commit tags make sense to have rev-list operations
  537.         # performed on them
  538.         if [ -n "$prevtag" ]; then
  539.             # Show changes since the previous release
  540.             git rev-list --pretty=short "$prevtag..$newrev" | git shortlog
  541.         else
  542.             # No previous tag, show all the changes since time
  543.             # began
  544.             git rev-list --pretty=short $newrev | git shortlog
  545.         fi
  546.         ;;
  547.     *)
  548.         # XXX: Is there anything useful we can do for non-commit
  549.         # objects?
  550.         ;;
  551.     esac
  552.  
  553.     echo $LOGEND
  554. }
  555.  
  556. #
  557. # Called for the deletion of an annotated tag
  558. #
  559. generate_delete_atag_email()
  560. {
  561.     echo "       was  $oldrev"
  562.     echo ""
  563.     echo $LOGEND
  564.     git show -s --pretty=oneline $oldrev
  565.     echo $LOGEND
  566. }
  567.  
  568. # --------------- General references
  569.  
  570. #
  571. # Called when any other type of reference is created (most likely a
  572. # non-annotated tag)
  573. #
  574. generate_create_general_email()
  575. {
  576.     echo "        at  $newrev ($newrev_type)"
  577.  
  578.     generate_general_email
  579. }
  580.  
  581. #
  582. # Called when any other type of reference is updated (most likely a
  583. # non-annotated tag)
  584. #
  585. generate_update_general_email()
  586. {
  587.     echo "        to  $newrev ($newrev_type)"
  588.     echo "      from  $oldrev"
  589.  
  590.     generate_general_email
  591. }
  592.  
  593. #
  594. # Called for creation or update of any other type of reference
  595. #
  596. generate_general_email()
  597. {
  598.     # Unannotated tags are more about marking a point than releasing a
  599.     # version; therefore we don't do the shortlog summary that we do for
  600.     # annotated tags above - we simply show that the point has been
  601.     # marked, and print the log message for the marked point for
  602.     # reference purposes
  603.     #
  604.     # Note this section also catches any other reference type (although
  605.     # there aren't any) and deals with them in the same way.
  606.  
  607.     echo ""
  608.     if [ "$newrev_type" = "commit" ]; then
  609.         echo $LOGBEGIN
  610.         git show --no-color --root -s --pretty=medium $newrev
  611.         echo $LOGEND
  612.     else
  613.         # What can we do here?  The tag marks an object that is not
  614.         # a commit, so there is no log for us to display.  It's
  615.         # probably not wise to output git cat-file as it could be a
  616.         # binary blob.  We'll just say how big it is
  617.         echo "$newrev is a $newrev_type, and is $(git cat-file -s $newrev) bytes long."
  618.     fi
  619. }
  620.  
  621. #
  622. # Called for the deletion of any other type of reference
  623. #
  624. generate_delete_general_email()
  625. {
  626.     echo "       was  $oldrev"
  627.     echo ""
  628.     echo $LOGEND
  629.     git show -s --pretty=oneline $oldrev
  630.     echo $LOGEND
  631. }
  632.  
  633.  
  634. # --------------- Miscellaneous utilities
  635.  
  636. #
  637. # Show new revisions as the user would like to see them in the email.
  638. #
  639. show_new_revisions()
  640. {
  641.     # This shows all log entries that are not already covered by
  642.     # another ref - i.e. commits that are now accessible from this
  643.     # ref that were previously not accessible
  644.     # (see generate_update_branch_email for the explanation of this
  645.     # command)
  646.  
  647.     # Revision range passed to rev-list differs for new vs. updated
  648.     # branches.
  649.     if [ "$change_type" = create ]
  650.     then
  651.         # Show all revisions exclusive to this (new) branch.
  652.         revspec=$newrev
  653.     else
  654.         # Branch update; show revisions not part of $oldrev.
  655.         revspec=$oldrev..$newrev
  656.     fi
  657.  
  658.     other_branches=$(git for-each-ref --format='%(refname)' refs/heads/ |
  659.         grep -F -v $refname)
  660.     git rev-parse --not $other_branches |
  661.     if [ -z "$custom_showrev" ]
  662.     then
  663.         git rev-list --pretty --stdin $revspec
  664.     else
  665.         git rev-list --stdin $revspec |
  666.         while read onerev
  667.         do
  668.             eval $(printf "$custom_showrev" $onerev)
  669.         done
  670.     fi
  671. }
  672.  
  673.  
  674. limit_lines()
  675. {
  676.     lines=0
  677.     skipped=0
  678.     while IFS="" read -r line; do
  679.         lines=$((lines + 1))
  680.         if [ $lines -gt $1 ]; then
  681.             skipped=$((skipped + 1))
  682.         else
  683.             printf "%s\n" "$line"
  684.         fi
  685.     done
  686.     if [ $skipped -ne 0 ]; then
  687.         echo "... $skipped lines suppressed ..."
  688.     fi
  689. }
  690.  
  691.  
  692. send_mail()
  693. {
  694.     if [ -n "$envelopesender" ]; then
  695.         /usr/sbin/sendmail -t -f "$envelopesender"
  696.     else
  697.         /usr/sbin/sendmail -t
  698.     fi
  699. }
  700.  
  701. # ---------------------------- main()
  702.  
  703. # --- Constants
  704. LOGBEGIN="- Log -----------------------------------------------------------------"
  705. LOGEND="-----------------------------------------------------------------------"
  706.  
  707. # --- Config
  708. # Set GIT_DIR either from the working directory, or from the environment
  709. # variable.
  710. GIT_DIR=$(git rev-parse --git-dir 2>/dev/null)
  711. if [ -z "$GIT_DIR" ]; then
  712.     echo >&2 "fatal: post-receive: GIT_DIR not set"
  713.     exit 1
  714. fi
  715.  
  716. projectdesc=$(sed -ne '1p' "$GIT_DIR/description" 2>/dev/null)
  717. # Check if the description is unchanged from it's default, and shorten it to
  718. # a more manageable length if it is
  719. if expr "$projectdesc" : "Unnamed repository.*$" >/dev/null
  720. then
  721.     projectdesc="UNNAMED PROJECT"
  722. fi
  723.  
  724. recipients=$(git config hooks.mailinglist)
  725. announcerecipients=$(git config hooks.announcelist)
  726. envelopesender=$(git config hooks.envelopesender)
  727. emailprefix=$(git config hooks.emailprefix || echo '[SCM] ')
  728. custom_showrev=$(git config hooks.showrev)
  729. maxlines=$(git config hooks.emailmaxlines)
  730.  
  731. # --- Main loop
  732. # Allow dual mode: run from the command line just like the update hook, or
  733. # if no arguments are given then run as a hook script
  734. if [ -n "$1" -a -n "$2" -a -n "$3" ]; then
  735.     # Output to the terminal in command line mode - if someone wanted to
  736.     # resend an email; they could redirect the output to sendmail
  737.     # themselves
  738.     prep_for_email $2 $3 $1 && PAGER= generate_email
  739. else
  740.     while read oldrev newrev refname
  741.     do
  742.         prep_for_email $oldrev $newrev $refname || continue
  743.         generate_email $maxlines | send_mail
  744.     done
  745. fi
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement