#! /usr/bin/env python

"""Example post-receive hook based on git-multimail.

The simplest way to use git-multimail is to use the script
git_multimail.py directly as a post-receive hook, and to configure it
using Git's configuration files and command-line parameters.  You can
also write your own Python wrapper for more advanced configurability,
using git_multimail.py as a Python module.

This script is a simple example of such a post-receive hook.  It is
intended to be customized before use; see the comments in the script
to help you get started.

Using git-multimail as a Python module as done here provides more
flexibility.  It has the following advantages:

* The tool's behavior can be customized using arbitrary Python code,
  without having to edit git_multimail.py.

* Configuration settings can be read from other sources; for example,
  user names and email addresses could be read from LDAP or from a
  database.  Or the settings can even be hardcoded in the importing
  Python script, if this is preferred.

This script is a very basic example of how to use git_multimail.py as
a module.  The comments below explain some of the points at which the
script's behavior could be changed or customized.

"""

import sys
import os

# If necessary, add the path to the directory containing
# git_multimail.py to the Python path as follows.  (This is not
# necessary if git_multimail.py is in the same directory as this
# script):

#LIBDIR = 'path/to/directory/containing/module'
#sys.path.insert(0, LIBDIR)

import git_multimail

# It is possible to modify the output templates here; e.g.:

#git_multimail.FOOTER_TEMPLATE = """\
#
#-- \n\
#This email was generated by the wonderful git-multimail tool.
#"""


# Specify which "git config" section contains the configuration for
# git-multimail:
config = git_multimail.Config('multimailhook')


# Select the type of environment:
try:
    environment = git_multimail.GenericEnvironment(config=config)
    #environment = git_multimail.GitoliteEnvironment(config=config)
except git_multimail.ConfigurationException:
    sys.stderr.write('*** %s\n' % sys.exc_info()[1])
    sys.exit(1)


# Choose the method of sending emails based on the git config:
mailer = git_multimail.choose_mailer(config, environment)

# Alternatively, you may hardcode the mailer using code like one of
# the following:

# Use "/usr/sbin/sendmail -oi -t" to send emails.  The envelopesender
# argument is optional:
#mailer = git_multimail.SendMailer(
#    command=['/usr/sbin/sendmail', '-oi', '-t'],
#    envelopesender='git-repo@example.com',
#    )

# Use Python's smtplib to send emails.  Both arguments are required.
#mailer = git_multimail.SMTPMailer(
#    envelopesender='git-repo@example.com',
#    # The smtpserver argument can also include a port number; e.g.,
#    #     smtpserver='mail.example.com:25'
#    smtpserver='mail.example.com',
#    )

# OutputMailer is intended only for testing; it writes the emails to
# the specified file stream.
#mailer = git_multimail.OutputMailer(sys.stdout)


# Read changes from stdin and send notification emails:
git_multimail.run_as_post_receive_hook(environment, mailer)
