format are generated from the template file passed as argument to
'--template' (defaulting to '.git/patchmail.tmpl' or
'~/.stgit/templates/patchmail.tmpl' or
-'/usr/share/stgit/templates/patchmail.tmpl').
+'/usr/share/stgit/templates/patchmail.tmpl'). A patch can be sent as
+attachment using the --attach option in which case the 'mailattch.tmpl'
+template will be used instead of 'patchmail.tmpl'.
The To/Cc/Bcc addresses can either be added to the template file or
passed via the corresponding command line options. They can be e-mail
'smtpuser' and 'smtppassword'. TLS encryption can be enabled by
'--smtp-tls' option and 'smtptls' setting.
-The patch e-mail template accepts the following variables:
+The following variables are accepted by both the preamble and the
+patch e-mail templates:
- %(patch)s - patch name
- %(sender)s - 'sender' or 'authname <authemail>' as per the config file
- %(shortdescr)s - the first line of the patch description
- %(longdescr)s - the rest of the patch description, after the first line
- %(diff)s - unified diff of the patch
%(diffstat)s - diff statistics
- %(version)s - ' version' string passed on the command line (or empty)
- %(prefix)s - 'prefix ' string passed on the command line
+ %(number)s - empty if only one patch is sent or ' patchnr/totalnr'
%(patchnr)s - patch number
+ %(sender)s - 'sender' or 'authname <authemail>' as per the config file
%(totalnr)s - total number of patches to be sent
- %(number)s - empty if only one patch is sent or ' patchnr/totalnr'
- %(fromauth)s - 'From: author\\n\\n' if different from sender
- %(authname)s - author's name
- %(authemail)s - author's email
+ %(version)s - ' version' string passed on the command line (or empty)
+
+In addition to the common variables, the preamble e-mail template
+accepts the following:
+
+ %(shortlog)s - first line of each patch description, listed by author
+
+In addition to the common variables, the patch e-mail template accepts
+the following:
+
%(authdate)s - patch creation date
- %(commname)s - committer's name
+ %(authemail)s - author's email
+ %(authname)s - author's name
%(commemail)s - committer's e-mail
+ %(commname)s - committer's name
+ %(diff)s - unified diff of the patch
+ %(fromauth)s - 'From: author\\n\\n' if different from sender
+ %(longdescr)s - the rest of the patch description, after the first line
+ %(patch)s - patch name
+ %(prefix)s - 'prefix ' string passed on the command line
+ %(shortdescr)s - the first line of the patch description"""
-For the preamble e-mail template, only the %(sender)s, %(version)s,
-%(patchnr)s, %(totalnr)s and %(number)s variables are supported."""
-
+directory = DirectoryHasRepository()
options = [make_option('-a', '--all',
help = 'e-mail all the applied patches',
action = 'store_true'),
make_option('--unrelated',
help = 'send patches without sequence numbering',
action = 'store_true'),
+ make_option('--attach',
+ help = 'send a patch as attachment',
+ action = 'store_true'),
make_option('-v', '--version', metavar = 'VERSION',
help = 'add VERSION to the [PATCH ...] prefix'),
make_option('--prefix', metavar = 'PREFIX',
action = 'store_true'),
make_option('-b', '--branch',
help = 'use BRANCH instead of the default one'),
- make_option('-O', '--diff-opts',
- help = 'options to pass to git-diff'),
make_option('-m', '--mbox',
help = 'generate an mbox file instead of sending',
- action = 'store_true')]
+ action = 'store_true')
+ ] + make_diff_opts_option()
def __get_sender():
to_addr = ', '.join(options.to)
if options.cc:
cc_addr = ', '.join(options.cc + extra_cc)
+ cc_addr = ', '.join(options.cc + extra_cc)
elif extra_cc:
cc_addr = ', '.join(extra_cc)
if options.bcc:
msg['Date'] = email.Utils.formatdate(localtime = True)
msg['Message-ID'] = msg_id
if ref_id:
+ # make sure the ref id has the angle brackets
+ ref_id = '<%s>' % ref_id.strip(' \t\n<>')
msg['In-Reply-To'] = ref_id
msg['References'] = ref_id
msg['User-Agent'] = 'StGIT/%s' % version.version
msg.replace_header(header, new_val)
# encode the body and set the MIME and encoding headers
- msg.set_charset(charset)
+ if msg.is_multipart():
+ for p in msg.get_payload():
+ p.set_charset(charset)
+ else:
+ msg.set_charset(charset)
def __edit_message(msg):
fname = '.stgitmail.txt'
return msg
-def __build_cover(tmpl, total_nr, msg_id, options):
+def __build_cover(tmpl, patches, msg_id, options):
"""Build the cover message (series description) to be sent via SMTP
"""
sender = __get_sender()
else:
prefix_str = ''
- total_nr_str = str(total_nr)
+ total_nr_str = str(len(patches))
patch_nr_str = '0'.zfill(len(total_nr_str))
- if total_nr > 1:
+ if len(patches) > 1:
number_str = ' %s/%s' % (patch_nr_str, total_nr_str)
else:
number_str = ''
'prefix': prefix_str,
'patchnr': patch_nr_str,
'totalnr': total_nr_str,
- 'number': number_str}
+ 'number': number_str,
+ 'shortlog': stack.shortlog(crt_series.get_patch(p)
+ for p in patches),
+ 'diffstat': git.diffstat(git.diff(
+ rev1 = git_id(crt_series, '%s//bottom' % patches[0]),
+ rev2 = git_id(crt_series, '%s//top' % patches[-1])))}
try:
msg_string = tmpl % tmpl_dict
prefix_str = confprefix + ' '
else:
prefix_str = ''
-
- if options.diff_opts:
- diff_flags = options.diff_opts.split()
- else:
- diff_flags = []
total_nr_str = str(total_nr)
patch_nr_str = str(patch_nr).zfill(len(total_nr_str))
else:
number_str = ''
+ diff = git.diff(rev1 = git_id(crt_series, '%s//bottom' % patch),
+ rev2 = git_id(crt_series, '%s//top' % patch),
+ diff_flags = options.diff_flags)
tmpl_dict = {'patch': patch,
'sender': sender,
# for backward template compatibility
'longdescr': long_descr,
# for backward template compatibility
'endofheaders': '',
- 'diff': git.diff(rev1 = git_id('%s//bottom' % patch),
- rev2 = git_id('%s//top' % patch),
- diff_flags = diff_flags ),
- 'diffstat': git.diffstat(rev1 = git_id('%s//bottom'%patch),
- rev2 = git_id('%s//top' % patch)),
+ 'diff': diff,
+ 'diffstat': git.diffstat(diff),
# for backward template compatibility
'date': '',
'version': version_str,
raise CmdException, 'No cover message template file found'
msg_id = email.Utils.make_msgid('stgit')
- msg = __build_cover(tmpl, total_nr, msg_id, options)
+ msg = __build_cover(tmpl, patches, msg_id, options)
from_addr, to_addr_list = __parse_addresses(msg)
msg_string = msg.as_string(options.mbox)
if options.template:
tmpl = file(options.template).read()
else:
- tmpl = templates.get_template('patchmail.tmpl')
+ if options.attach:
+ tmpl = templates.get_template('mailattch.tmpl')
+ else:
+ tmpl = templates.get_template('patchmail.tmpl')
if not tmpl:
raise CmdException, 'No e-mail template file found'