| git-multimail version 1.5.0 |
| =========================== |
| |
| .. image:: https://travis-ci.org/git-multimail/git-multimail.svg?branch=master |
| :target: https://travis-ci.org/git-multimail/git-multimail |
| |
| git-multimail is a tool for sending notification emails on pushes to a |
| Git repository. It includes a Python module called ``git_multimail.py``, |
| which can either be used as a hook script directly or can be imported |
| as a Python module into another script. |
| |
| git-multimail is derived from the Git project's old |
| contrib/hooks/post-receive-email, and is mostly compatible with that |
| script. See README.migrate-from-post-receive-email for details about |
| the differences and for how to migrate from post-receive-email to |
| git-multimail. |
| |
| git-multimail, like the rest of the Git project, is licensed under |
| GPLv2 (see the COPYING file for details). |
| |
| Please note: although, as a convenience, git-multimail may be |
| distributed along with the main Git project, development of |
| git-multimail takes place in its own, separate project. Please, read |
| `<CONTRIBUTING.rst>`__ for more information. |
| |
| |
| By default, for each push received by the repository, git-multimail: |
| |
| 1. Outputs one email summarizing each reference that was changed. |
| These "reference change" (called "refchange" below) emails describe |
| the nature of the change (e.g., was the reference created, deleted, |
| fast-forwarded, etc.) and include a one-line summary of each commit |
| that was added to the reference. |
| |
| 2. Outputs one email for each new commit that was introduced by the |
| reference change. These "commit" emails include a list of the |
| files changed by the commit, followed by the diffs of files |
| modified by the commit. The commit emails are threaded to the |
| corresponding reference change email via "In-Reply-To". This style |
| (similar to the "git format-patch" style used on the Git mailing |
| list) makes it easy to scan through the emails, jump to patches |
| that need further attention, and write comments about specific |
| commits. Commits are handled in reverse topological order (i.e., |
| parents shown before children). For example:: |
| |
| [git] branch master updated |
| + [git] 01/08: doc: fix xref link from api docs to manual pages |
| + [git] 02/08: api-credentials.txt: show the big picture first |
| + [git] 03/08: api-credentials.txt: mention credential.helper explicitly |
| + [git] 04/08: api-credentials.txt: add "see also" section |
| + [git] 05/08: t3510 (cherry-pick-sequence): add missing '&&' |
| + [git] 06/08: Merge branch 'rr/maint-t3510-cascade-fix' |
| + [git] 07/08: Merge branch 'mm/api-credentials-doc' |
| + [git] 08/08: Git 1.7.11-rc2 |
| |
| By default, each commit appears in exactly one commit email, the |
| first time that it is pushed to the repository. If a commit is later |
| merged into another branch, then a one-line summary of the commit |
| is included in the reference change email (as usual), but no |
| additional commit email is generated. See |
| `multimailhook.refFilter(Inclusion|Exclusion|DoSend|DontSend)Regex` |
| below to configure which branches and tags are watched by the hook. |
| |
| By default, reference change emails have their "Reply-To" field set |
| to the person who pushed the change, and commit emails have their |
| "Reply-To" field set to the author of the commit. |
| |
| 3. Output one "announce" mail for each new annotated tag, including |
| information about the tag and optionally a shortlog describing the |
| changes since the previous tag. Such emails might be useful if you |
| use annotated tags to mark releases of your project. |
| |
| |
| Requirements |
| ------------ |
| |
| * Python 2.x, version 2.4 or later. No non-standard Python modules |
| are required. git-multimail has preliminary support for Python 3 |
| (but it has been better tested with Python 2). |
| |
| * The ``git`` command must be in your PATH. git-multimail is known to |
| work with Git versions back to 1.7.1. (Earlier versions have not |
| been tested; if you do so, please report your results.) |
| |
| * To send emails using the default configuration, a standard sendmail |
| program must be located at '/usr/sbin/sendmail' or |
| '/usr/lib/sendmail' and must be configured correctly to send emails. |
| If this is not the case, set multimailhook.sendmailCommand, or see |
| the multimailhook.mailer configuration variable below for how to |
| configure git-multimail to send emails via an SMTP server. |
| |
| * git-multimail is currently tested only on Linux. It may or may not |
| work on other platforms such as Windows and Mac OS. See |
| `<CONTRIBUTING.rst>`__ to improve the situation. |
| |
| |
| Invocation |
| ---------- |
| |
| ``git_multimail.py`` is designed to be used as a ``post-receive`` hook in a |
| Git repository (see githooks(5)). Link or copy it to |
| $GIT_DIR/hooks/post-receive within the repository for which email |
| notifications are desired. Usually it should be installed on the |
| central repository for a project, to which all commits are eventually |
| pushed. |
| |
| For use on pre-v1.5.1 Git servers, ``git_multimail.py`` can also work as |
| an ``update`` hook, taking its arguments on the command line. To use |
| this script in this manner, link or copy it to $GIT_DIR/hooks/update. |
| Please note that the script is not completely reliable in this mode |
| [1]_. |
| |
| Alternatively, ``git_multimail.py`` can be imported as a Python module |
| into your own Python post-receive script. This method is a bit more |
| work, but allows the behavior of the hook to be customized using |
| arbitrary Python code. For example, you can use a custom environment |
| (perhaps inheriting from GenericEnvironment or GitoliteEnvironment) to |
| |
| * change how the user who did the push is determined |
| |
| * read users' email addresses from an LDAP server or from a database |
| |
| * decide which users should be notified about which commits based on |
| the contents of the commits (e.g., for users who want to be notified |
| only about changes affecting particular files or subdirectories) |
| |
| Or you can change how emails are sent by writing your own Mailer |
| class. The ``post-receive`` script in this directory demonstrates how |
| to use ``git_multimail.py`` as a Python module. (If you make interesting |
| changes of this type, please consider sharing them with the |
| community.) |
| |
| |
| Troubleshooting/FAQ |
| ------------------- |
| |
| Please read `<doc/troubleshooting.rst>`__ for frequently asked |
| questions and common issues with git-multimail. |
| |
| |
| Configuration |
| ------------- |
| |
| By default, git-multimail mostly takes its configuration from the |
| following ``git config`` settings: |
| |
| multimailhook.environment |
| This describes the general environment of the repository. In most |
| cases, you do not need to specify a value for this variable: |
| `git-multimail` will autodetect which environment to use. |
| Currently supported values: |
| |
| generic |
| the username of the pusher is read from $USER or $USERNAME and |
| the repository name is derived from the repository's path. |
| |
| gitolite |
| Environment to use when ``git-multimail`` is ran as a gitolite_ |
| hook. |
| |
| The username of the pusher is read from $GL_USER, the repository |
| name is read from $GL_REPO, and the From: header value is |
| optionally read from gitolite.conf (see multimailhook.from). |
| |
| For more information about gitolite and git-multimail, read |
| `<doc/gitolite.rst>`__ |
| |
| stash |
| Environment to use when ``git-multimail`` is ran as an Atlassian |
| BitBucket Server (formerly known as Atlassian Stash) hook. |
| |
| **Warning:** this mode was provided by a third-party contributor |
| and never tested by the git-multimail maintainers. It is |
| provided as-is and may or may not work for you. |
| |
| This value is automatically assumed when the stash-specific |
| flags (``--stash-user`` and ``--stash-repo``) are specified on |
| the command line. When this environment is active, the username |
| and repo come from these two command line flags, which must be |
| specified. |
| |
| gerrit |
| Environment to use when ``git-multimail`` is ran as a |
| ``ref-updated`` Gerrit hook. |
| |
| This value is used when the gerrit-specific command line flags |
| (``--oldrev``, ``--newrev``, ``--refname``, ``--project``) for |
| gerrit's ref-updated hook are present. When this environment is |
| active, the username of the pusher is taken from the |
| ``--submitter`` argument if that command line option is passed, |
| otherwise 'Gerrit' is used. The repository name is taken from |
| the ``--project`` option on the command line, which must be passed. |
| |
| For more information about gerrit and git-multimail, read |
| `<doc/gerrit.rst>`__ |
| |
| If none of these environments is suitable for your setup, then you |
| can implement a Python class that inherits from Environment and |
| instantiate it via a script that looks like the example |
| post-receive script. |
| |
| The environment value can be specified on the command line using |
| the ``--environment`` option. If it is not specified on the |
| command line or by ``multimailhook.environment``, the value is |
| guessed as follows: |
| |
| * If stash-specific (respectively gerrit-specific) command flags |
| are present on the command-line, then ``stash`` (respectively |
| ``gerrit``) is used. |
| |
| * If the environment variables $GL_USER and $GL_REPO are set, then |
| ``gitolite`` is used. |
| |
| * If none of the above apply, then ``generic`` is used. |
| |
| multimailhook.repoName |
| A short name of this Git repository, to be used in various places |
| in the notification email text. The default is to use $GL_REPO |
| for gitolite repositories, or otherwise to derive this value from |
| the repository path name. |
| |
| multimailhook.mailingList |
| The list of email addresses to which notification emails should be |
| sent, as RFC 2822 email addresses separated by commas. This |
| configuration option can be multivalued. Leave it unset or set it |
| to the empty string to not send emails by default. The next few |
| settings can be used to configure specific address lists for |
| specific types of notification email. |
| |
| multimailhook.refchangeList |
| The list of email addresses to which summary emails about |
| reference changes should be sent, as RFC 2822 email addresses |
| separated by commas. This configuration option can be |
| multivalued. The default is the value in |
| multimailhook.mailingList. Set this value to "none" (or the empty |
| string) to prevent reference change emails from being sent even if |
| multimailhook.mailingList is set. |
| |
| multimailhook.announceList |
| The list of email addresses to which emails about new annotated |
| tags should be sent, as RFC 2822 email addresses separated by |
| commas. This configuration option can be multivalued. The |
| default is the value in multimailhook.refchangeList or |
| multimailhook.mailingList. Set this value to "none" (or the empty |
| string) to prevent annotated tag announcement emails from being sent |
| even if one of the other values is set. |
| |
| multimailhook.commitList |
| The list of email addresses to which emails about individual new |
| commits should be sent, as RFC 2822 email addresses separated by |
| commas. This configuration option can be multivalued. The |
| default is the value in multimailhook.mailingList. Set this value |
| to "none" (or the empty string) to prevent notification emails about |
| individual commits from being sent even if |
| multimailhook.mailingList is set. |
| |
| multimailhook.announceShortlog |
| If this option is set to true, then emails about changes to |
| annotated tags include a shortlog of changes since the previous |
| tag. This can be useful if the annotated tags represent releases; |
| then the shortlog will be a kind of rough summary of what has |
| happened since the last release. But if your tagging policy is |
| not so straightforward, then the shortlog might be confusing |
| rather than useful. Default is false. |
| |
| multimailhook.commitEmailFormat |
| The format of email messages for the individual commits, can be "text" or |
| "html". In the latter case, the emails will include diffs using colorized |
| HTML instead of plain text used by default. Note that this currently the |
| ref change emails are always sent in plain text. |
| |
| Note that when using "html", the formatting is done by parsing the |
| output of ``git log`` with ``-p``. When using |
| ``multimailhook.commitLogOpts`` to specify a ``--format`` for |
| ``git log``, one may get false positive (e.g. lines in the body of |
| the message starting with ``+++`` or ``---`` colored in red or |
| green). |
| |
| By default, all the message is HTML-escaped. See |
| ``multimailhook.htmlInIntro`` to change this behavior. |
| |
| multimailhook.commitBrowseURL |
| Used to generate a link to an online repository browser in commit |
| emails. This variable must be a string. Format directives like |
| ``%(<variable>)s`` will be expanded the same way as template |
| strings. In particular, ``%(id)s`` will be replaced by the full |
| Git commit identifier (40-chars hexadecimal). |
| |
| If the string does not contain any format directive, then |
| ``%(id)s`` will be automatically added to the string. If you don't |
| want ``%(id)s`` to be automatically added, use the empty format |
| directive ``%()s`` anywhere in the string. |
| |
| For example, a suitable value for the git-multimail project itself |
| would be |
| ``https://github.com/git-multimail/git-multimail/commit/%(id)s``. |
| |
| multimailhook.htmlInIntro, multimailhook.htmlInFooter |
| When generating an HTML message, git-multimail escapes any HTML |
| sequence by default. This means that if a template contains HTML |
| like ``<a href="foo">link</a>``, the reader will see the HTML |
| source code and not a proper link. |
| |
| Set ``multimailhook.htmlInIntro`` to true to allow writing HTML |
| formatting in introduction templates. Similarly, set |
| ``multimailhook.htmlInFooter`` for HTML in the footer. |
| |
| Variables expanded in the template are still escaped. For example, |
| if a repository's path contains a ``<``, it will be rendered as |
| such in the message. |
| |
| Read `<doc/customizing-emails.rst>`__ for more details and |
| examples. |
| |
| multimailhook.refchangeShowGraph |
| If this option is set to true, then summary emails about reference |
| changes will additionally include: |
| |
| * a graph of the added commits (if any) |
| |
| * a graph of the discarded commits (if any) |
| |
| The log is generated by running ``git log --graph`` with the options |
| specified in graphOpts. The default is false. |
| |
| multimailhook.refchangeShowLog |
| If this option is set to true, then summary emails about reference |
| changes will include a detailed log of the added commits in |
| addition to the one line summary. The log is generated by running |
| ``git log`` with the options specified in multimailhook.logOpts. |
| Default is false. |
| |
| multimailhook.mailer |
| This option changes the way emails are sent. Accepted values are: |
| |
| * **sendmail (the default)**: use the command ``/usr/sbin/sendmail`` or |
| ``/usr/lib/sendmail`` (or sendmailCommand, if configured). This |
| mode can be further customized via the following options: |
| |
| multimailhook.sendmailCommand |
| The command used by mailer ``sendmail`` to send emails. Shell |
| quoting is allowed in the value of this setting, but remember that |
| Git requires double-quotes to be escaped; e.g.:: |
| |
| git config multimailhook.sendmailcommand '/usr/sbin/sendmail -oi -t -F \"Git Repo\"' |
| |
| Default is '/usr/sbin/sendmail -oi -t' or |
| '/usr/lib/sendmail -oi -t' (depending on which file is |
| present and executable). |
| |
| multimailhook.envelopeSender |
| If set then pass this value to sendmail via the -f option to set |
| the envelope sender address. |
| |
| * **smtp**: use Python's smtplib. This is useful when the sendmail |
| command is not available on the system. This mode can be |
| further customized via the following options: |
| |
| multimailhook.smtpServer |
| The name of the SMTP server to connect to. The value can |
| also include a colon and a port number; e.g., |
| ``mail.example.com:25``. Default is 'localhost' using port 25. |
| |
| multimailhook.smtpUser, multimailhook.smtpPass |
| Server username and password. Required if smtpEncryption is 'ssl'. |
| Note that the username and password currently need to be |
| set cleartext in the configuration file, which is not |
| recommended. If you need to use this option, be sure your |
| configuration file is read-only. |
| |
| multimailhook.envelopeSender |
| The sender address to be passed to the SMTP server. If |
| unset, then the value of multimailhook.from is used. |
| |
| multimailhook.smtpServerTimeout |
| Timeout in seconds. Default is 10. |
| |
| multimailhook.smtpEncryption |
| Set the security type. Allowed values: ``none``, ``ssl``, ``tls`` (starttls). |
| Default is ``none``. |
| |
| multimailhook.smtpCACerts |
| Set the path to a list of trusted CA certificate to verify the |
| server certificate, only supported when ``smtpEncryption`` is |
| ``tls``. If unset or empty, the server certificate is not |
| verified. If it targets a file containing a list of trusted CA |
| certificates (PEM format) these CAs will be used to verify the |
| server certificate. For debian, you can set |
| ``/etc/ssl/certs/ca-certificates.crt`` for using the system |
| trusted CAs. For self-signed server, you can add your server |
| certificate to the system store:: |
| |
| cd /usr/local/share/ca-certificates/ |
| openssl s_client -starttls smtp \ |
| -connect mail.example.net:587 -showcerts \ |
| </dev/null 2>/dev/null \ |
| | openssl x509 -outform PEM >mail.example.net.crt |
| update-ca-certificates |
| |
| and used the updated ``/etc/ssl/certs/ca-certificates.crt``. Or |
| directly use your ``/path/to/mail.example.net.crt``. Default is |
| unset. |
| |
| multimailhook.smtpServerDebugLevel |
| Integer number. Set to greater than 0 to activate debugging. |
| |
| multimailhook.from, multimailhook.fromCommit, multimailhook.fromRefchange |
| If set, use this value in the From: field of generated emails. |
| ``fromCommit`` is used for commit emails, ``fromRefchange`` is |
| used for refchange emails, and ``from`` is used as fall-back in |
| all cases. |
| |
| The value for these variables can be either: |
| |
| - An email address, which will be used directly. |
| |
| - The value ``pusher``, in which case the pusher's address (if |
| available) will be used. |
| |
| - The value ``author`` (meaningful only for ``fromCommit``), in which |
| case the commit author's address will be used. |
| |
| If config values are unset, the value of the From: header is |
| determined as follows: |
| |
| 1. (gitolite environment only) |
| 1.a) If ``multimailhook.MailaddressMap`` is set, and is a path |
| to an existing file (if relative, it is considered relative to |
| the place where ``gitolite.conf`` is located), then this file |
| should contain lines like:: |
| |
| username Firstname Lastname <email@example.com> |
| |
| git-multimail will then look for a line where ``$GL_USER`` |
| matches the ``username`` part, and use the rest of the line for |
| the ``From:`` header. |
| |
| 1.b) Parse gitolite.conf, looking for a block of comments that |
| looks like this:: |
| |
| # BEGIN USER EMAILS |
| # username Firstname Lastname <email@example.com> |
| # END USER EMAILS |
| |
| If that block exists, and there is a line between the BEGIN |
| USER EMAILS and END USER EMAILS lines where the first field |
| matches the gitolite username ($GL_USER), use the rest of the |
| line for the From: header. |
| |
| 2. If the user.email configuration setting is set, use its value |
| (and the value of user.name, if set). |
| |
| 3. Use the value of multimailhook.envelopeSender. |
| |
| multimailhook.MailaddressMap |
| (gitolite environment only) |
| File to look for a ``From:`` address based on the user doing the |
| push. Defaults to unset. See ``multimailhook.from`` for details. |
| |
| multimailhook.administrator |
| The name and/or email address of the administrator of the Git |
| repository; used in FOOTER_TEMPLATE. Default is |
| multimailhook.envelopesender if it is set; otherwise a generic |
| string is used. |
| |
| multimailhook.emailPrefix |
| All emails have this string prepended to their subjects, to aid |
| email filtering (though filtering based on the X-Git-* email |
| headers is probably more robust). Default is the short name of |
| the repository in square brackets; e.g., ``[myrepo]``. Set this |
| value to the empty string to suppress the email prefix. You may |
| use the placeholder ``%(repo_shortname)s`` for the short name of |
| the repository. |
| |
| multimailhook.emailMaxLines |
| The maximum number of lines that should be included in the body of |
| a generated email. If not specified, there is no limit. Lines |
| beyond the limit are suppressed and counted, and a final line is |
| added indicating the number of suppressed lines. |
| |
| multimailhook.emailMaxLineLength |
| The maximum length of a line in the email body. Lines longer than |
| this limit are truncated to this length with a trailing ``[...]`` |
| added to indicate the missing text. The default is 500, because |
| (a) diffs with longer lines are probably from binary files, for |
| which a diff is useless, and (b) even if a text file has such long |
| lines, the diffs are probably unreadable anyway. To disable line |
| truncation, set this option to 0. |
| |
| multimailhook.subjectMaxLength |
| The maximum length of the subject line (i.e. the ``oneline`` field |
| in templates, not including the prefix). Lines longer than this |
| limit are truncated to this length with a trailing ``[...]`` added |
| to indicate the missing text. This option The default is to use |
| ``multimailhook.emailMaxLineLength``. This option avoids sending |
| emails with overly long subject lines, but should not be needed if |
| the commit messages follow the Git convention (one short subject |
| line, then a blank line, then the message body). To disable line |
| truncation, set this option to 0. |
| |
| multimailhook.maxCommitEmails |
| The maximum number of commit emails to send for a given change. |
| When the number of patches is larger that this value, only the |
| summary refchange email is sent. This can avoid accidental |
| mailbombing, for example on an initial push. To disable commit |
| emails limit, set this option to 0. The default is 500. |
| |
| multimailhook.excludeMergeRevisions |
| When sending out revision emails, do not consider merge commits (the |
| functional equivalent of `rev-list --no-merges`). |
| The default is `false` (send merge commit emails). |
| |
| multimailhook.emailStrictUTF8 |
| If this boolean option is set to `true`, then the main part of the |
| email body is forced to be valid UTF-8. Any characters that are |
| not valid UTF-8 are converted to the Unicode replacement |
| character, U+FFFD. The default is `true`. |
| |
| This option is ineffective with Python 3, where non-UTF-8 |
| characters are unconditionally replaced. |
| |
| multimailhook.diffOpts |
| Options passed to ``git diff-tree`` when generating the summary |
| information for ReferenceChange emails. Default is ``--stat |
| --summary --find-copies-harder``. Add -p to those options to |
| include a unified diff of changes in addition to the usual summary |
| output. Shell quoting is allowed; see ``multimailhook.logOpts`` for |
| details. |
| |
| multimailhook.graphOpts |
| Options passed to ``git log --graph`` when generating graphs for the |
| reference change summary emails (used only if refchangeShowGraph |
| is true). The default is '--oneline --decorate'. |
| |
| Shell quoting is allowed; see logOpts for details. |
| |
| multimailhook.logOpts |
| Options passed to ``git log`` to generate additional info for |
| reference change emails (used only if refchangeShowLog is set). |
| For example, adding -p will show each commit's complete diff. The |
| default is empty. |
| |
| Shell quoting is allowed; for example, a log format that contains |
| spaces can be specified using something like:: |
| |
| git config multimailhook.logopts '--pretty=format:"%h %aN <%aE>%n%s%n%n%b%n"' |
| |
| If you want to set this by editing your configuration file |
| directly, remember that Git requires double-quotes to be escaped |
| (see git-config(1) for more information):: |
| |
| [multimailhook] |
| logopts = --pretty=format:\"%h %aN <%aE>%n%s%n%n%b%n\" |
| |
| multimailhook.commitLogOpts |
| Options passed to ``git log`` to generate additional info for |
| revision change emails. For example, adding --ignore-all-spaces |
| will suppress whitespace changes. The default options are ``-C |
| --stat -p --cc``. Shell quoting is allowed; see |
| multimailhook.logOpts for details. |
| |
| multimailhook.dateSubstitute |
| String to use as a substitute for ``Date:`` in the output of ``git |
| log`` while formatting commit messages. This is useful to avoid |
| emitting a line that can be interpreted by mailers as the start of |
| a cited message (Zimbra webmail in particular). Defaults to |
| ``CommitDate:``. Set to an empty string or ``none`` to deactivate |
| the behavior. |
| |
| multimailhook.emailDomain |
| Domain name appended to the username of the person doing the push |
| to convert it into an email address |
| (via ``"%s@%s" % (username, emaildomain)``). More complicated |
| schemes can be implemented by overriding Environment and |
| overriding its get_pusher_email() method. |
| |
| multimailhook.replyTo, multimailhook.replyToCommit, multimailhook.replyToRefchange |
| Addresses to use in the Reply-To: field for commit emails |
| (replyToCommit) and refchange emails (replyToRefchange). |
| multimailhook.replyTo is used as default when replyToCommit or |
| replyToRefchange is not set. The shortcuts ``pusher`` and |
| ``author`` are allowed with the same semantics as for |
| ``multimailhook.from``. In addition, the value ``none`` can be |
| used to omit the ``Reply-To:`` field. |
| |
| The default is ``pusher`` for refchange emails, and ``author`` for |
| commit emails. |
| |
| multimailhook.quiet |
| Do not output the list of email recipients from the hook |
| |
| multimailhook.stdout |
| For debugging, send emails to stdout rather than to the |
| mailer. Equivalent to the --stdout command line option |
| |
| multimailhook.scanCommitForCc |
| If this option is set to true, than recipients from lines in commit body |
| that starts with ``CC:`` will be added to CC list. |
| Default: false |
| |
| multimailhook.combineWhenSingleCommit |
| If this option is set to true and a single new commit is pushed to |
| a branch, combine the summary and commit email messages into a |
| single email. |
| Default: true |
| |
| multimailhook.refFilterInclusionRegex, multimailhook.refFilterExclusionRegex, multimailhook.refFilterDoSendRegex, multimailhook.refFilterDontSendRegex |
| **Warning:** these options are experimental. They should work, but |
| the user-interface is not stable yet (in particular, the option |
| names may change). If you want to participate in stabilizing the |
| feature, please contact the maintainers and/or send pull-requests. |
| If you are happy with the current shape of the feature, please |
| report it too. |
| |
| Regular expressions that can be used to limit refs for which email |
| updates will be sent. It is an error to specify both an inclusion |
| and an exclusion regex. If a ``refFilterInclusionRegex`` is |
| specified, emails will only be sent for refs which match this |
| regex. If a ``refFilterExclusionRegex`` regex is specified, |
| emails will be sent for all refs except those that match this |
| regex (or that match a predefined regex specific to the |
| environment, such as "^refs/notes" for most environments and |
| "^refs/notes|^refs/changes" for the gerrit environment). |
| |
| The expressions are matched against the complete refname, and is |
| considered to match if any substring matches. For example, to |
| filter-out all tags, set ``refFilterExclusionRegex`` to |
| ``^refs/tags/`` (note the leading ``^`` but no trailing ``$``). If |
| you set ``refFilterExclusionRegex`` to ``master``, then any ref |
| containing ``master`` will be excluded (the ``master`` branch, but |
| also ``refs/tags/master`` or ``refs/heads/foo-master-bar``). |
| |
| ``refFilterDoSendRegex`` and ``refFilterDontSendRegex`` are |
| analogous to ``refFilterInclusionRegex`` and |
| ``refFilterExclusionRegex`` with one difference: with |
| ``refFilterDoSendRegex`` and ``refFilterDontSendRegex``, commits |
| introduced by one excluded ref will not be considered as new when |
| they reach an included ref. Typically, if you add a branch ``foo`` |
| to ``refFilterDontSendRegex``, push commits to this branch, and |
| later merge branch ``foo`` into ``master``, then the notification |
| email for ``master`` will contain a commit email only for the |
| merge commit. If you include ``foo`` in |
| ``refFilterExclusionRegex``, then at the time of merge, you will |
| receive one commit email per commit in the branch. |
| |
| These variables can be multi-valued, like:: |
| |
| [multimailhook] |
| refFilterExclusionRegex = ^refs/tags/ |
| refFilterExclusionRegex = ^refs/heads/master$ |
| |
| You can also provide a whitespace-separated list like:: |
| |
| [multimailhook] |
| refFilterExclusionRegex = ^refs/tags/ ^refs/heads/master$ |
| |
| Both examples exclude tags and the master branch, and are |
| equivalent to:: |
| |
| [multimailhook] |
| refFilterExclusionRegex = ^refs/tags/|^refs/heads/master$ |
| |
| ``refFilterInclusionRegex`` and ``refFilterExclusionRegex`` are |
| strictly stronger than ``refFilterDoSendRegex`` and |
| ``refFilterDontSendRegex``. In other words, adding a ref to a |
| DoSend/DontSend regex has no effect if it is already excluded by a |
| Exclusion/Inclusion regex. |
| |
| multimailhook.logFile, multimailhook.errorLogFile, multimailhook.debugLogFile |
| |
| When set, these variable designate path to files where |
| git-multimail will log some messages. Normal messages and error |
| messages are sent to ``logFile``, and error messages are also sent |
| to ``errorLogFile``. Debug messages and all other messages are |
| sent to ``debugLogFile``. The recommended way is to set only one |
| of these variables, but it is also possible to set several of them |
| (part of the information is then duplicated in several log files, |
| for example errors are duplicated to all log files). |
| |
| Relative path are relative to the Git repository where the push is |
| done. |
| |
| multimailhook.verbose |
| |
| Verbosity level of git-multimail on its standard output. By |
| default, show only error and info messages. If set to true, show |
| also debug messages. |
| |
| Email filtering aids |
| -------------------- |
| |
| All emails include extra headers to enable fine tuned filtering and |
| give information for debugging. All emails include the headers |
| ``X-Git-Host``, ``X-Git-Repo``, ``X-Git-Refname``, and ``X-Git-Reftype``. |
| ReferenceChange emails also include headers ``X-Git-Oldrev`` and ``X-Git-Newrev``; |
| Revision emails also include header ``X-Git-Rev``. |
| |
| |
| Customizing email contents |
| -------------------------- |
| |
| git-multimail mostly generates emails by expanding templates. The |
| templates can be customized. To avoid the need to edit |
| ``git_multimail.py`` directly, the preferred way to change the templates |
| is to write a separate Python script that imports ``git_multimail.py`` as |
| a module, then replaces the templates in place. See the provided |
| post-receive script for an example of how this is done. |
| |
| |
| Customizing git-multimail for your environment |
| ---------------------------------------------- |
| |
| git-multimail is mostly customized via an "environment" that describes |
| the local environment in which Git is running. Two types of |
| environment are built in: |
| |
| GenericEnvironment |
| a stand-alone Git repository. |
| |
| GitoliteEnvironment |
| a Git repository that is managed by gitolite_. For such |
| repositories, the identity of the pusher is read from |
| environment variable $GL_USER, the name of the repository is read |
| from $GL_REPO (if it is not overridden by multimailhook.reponame), |
| and the From: header value is optionally read from gitolite.conf |
| (see multimailhook.from). |
| |
| By default, git-multimail assumes GitoliteEnvironment if $GL_USER and |
| $GL_REPO are set, and otherwise assumes GenericEnvironment. |
| Alternatively, you can choose one of these two environments explicitly |
| by setting a ``multimailhook.environment`` config setting (which can |
| have the value `generic` or `gitolite`) or by passing an --environment |
| option to the script. |
| |
| If you need to customize the script in ways that are not supported by |
| the existing environments, you can define your own environment class |
| class using arbitrary Python code. To do so, you need to import |
| ``git_multimail.py`` as a Python module, as demonstrated by the example |
| post-receive script. Then implement your environment class; it should |
| usually inherit from one of the existing Environment classes and |
| possibly one or more of the EnvironmentMixin classes. Then set the |
| ``environment`` variable to an instance of your own environment class |
| and pass it to ``run_as_post_receive_hook()``. |
| |
| The standard environment classes, GenericEnvironment and |
| GitoliteEnvironment, are in fact themselves put together out of a |
| number of mixin classes, each of which handles one aspect of the |
| customization. For the finest control over your configuration, you |
| can specify exactly which mixin classes your own environment class |
| should inherit from, and override individual methods (or even add your |
| own mixin classes) to implement entirely new behaviors. If you |
| implement any mixins that might be useful to other people, please |
| consider sharing them with the community! |
| |
| |
| Getting involved |
| ---------------- |
| |
| Please, read `<CONTRIBUTING.rst>`__ for instructions on how to |
| contribute to git-multimail. |
| |
| |
| Footnotes |
| --------- |
| |
| .. [1] Because of the way information is passed to update hooks, the |
| script's method of determining whether a commit has already |
| been seen does not work when it is used as an ``update`` script. |
| In particular, no notification email will be generated for a |
| new commit that is added to multiple references in the same |
| push. A workaround is to use --force-send to force sending the |
| emails. |
| |
| .. _gitolite: https://github.com/sitaramc/gitolite |