#! /usr/bin/env python2

"""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, e:
    sys.exit(str(e))


# 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)
