chiark
/
gitweb
/
~mdw
/
stgit
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'stable'
[stgit]
/
stgit
/
commands
/
mail.py
diff --git
a/stgit/commands/mail.py
b/stgit/commands/mail.py
index c223665b42114bb2966f1b6c4d6c1cb47005e507..b4d4e18acce6d4ef5ba4b66db60c96404f9822f2 100644
(file)
--- a/
stgit/commands/mail.py
+++ b/
stgit/commands/mail.py
@@
-27,7
+27,7
@@
from stgit.config import config
help = 'send a patch or series of patches by e-mail'
help = 'send a patch or series of patches by e-mail'
-usage = """%prog [options] [<patch1>] [<patch2>] [<patch3>..<patch4>]
+usage =
r
"""%prog [options] [<patch1>] [<patch2>] [<patch3>..<patch4>]
Send a patch or a range of patches by e-mail using the SMTP server
specified by the 'stgit.smtpserver' configuration option, or the
Send a patch or a range of patches by e-mail using the SMTP server
specified by the 'stgit.smtpserver' configuration option, or the
@@
-35,7
+35,9
@@
specified by the 'stgit.smtpserver' configuration option, or the
format are generated from the template file passed as argument to
'--template' (defaulting to '.git/patchmail.tmpl' or
'~/.stgit/templates/patchmail.tmpl' or
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
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
@@
-58,29
+60,37
@@
SMTP authentication is also possible with '--smtp-user' and
'smtpuser' and 'smtppassword'. TLS encryption can be enabled by
'--smtp-tls' option and 'smtptls' setting.
'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
%(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
%(patchnr)s - patch number
+ %(sender)s - 'sender' or 'authname <authemail>' as per the config file
%(totalnr)s - total number of patches to be sent
%(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
%(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
%(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 %(diffstat)s, %(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'),
options = [make_option('-a', '--all',
help = 'e-mail all the applied patches',
action = 'store_true'),
@@
-102,6
+112,9
@@
options = [make_option('-a', '--all',
make_option('--unrelated',
help = 'send patches without sequence numbering',
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',
make_option('-v', '--version', metavar = 'VERSION',
help = 'add VERSION to the [PATCH ...] prefix'),
make_option('--prefix', metavar = 'PREFIX',
@@
-131,11
+144,10
@@
options = [make_option('-a', '--all',
action = 'store_true'),
make_option('-b', '--branch',
help = 'use BRANCH instead of the default one'),
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',
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():
def __get_sender():
@@
-226,6
+238,7
@@
def __build_address_headers(msg, options, extra_cc = []):
to_addr = ', '.join(options.to)
if options.cc:
cc_addr = ', '.join(options.cc + extra_cc)
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:
elif extra_cc:
cc_addr = ', '.join(extra_cc)
if options.bcc:
@@
-258,6
+271,8
@@
def __build_extra_headers(msg, msg_id, ref_id = None):
msg['Date'] = email.Utils.formatdate(localtime = True)
msg['Message-ID'] = msg_id
if ref_id:
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['In-Reply-To'] = ref_id
msg['References'] = ref_id
msg['User-Agent'] = 'StGIT/%s' % version.version
@@
-282,7
+297,11
@@
def __encode_message(msg):
msg.replace_header(header, new_val)
# encode the body and set the MIME and encoding headers
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'
def __edit_message(msg):
fname = '.stgitmail.txt'
@@
-339,9
+358,11
@@
def __build_cover(tmpl, patches, msg_id, options):
'patchnr': patch_nr_str,
'totalnr': total_nr_str,
'number': number_str,
'patchnr': patch_nr_str,
'totalnr': total_nr_str,
'number': number_str,
- 'diffstat': git.diffstat(
- rev1 = git_id('%s//bottom' % patches[0]),
- rev2 = git_id('%s//top' % patches[-1]))}
+ '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
try:
msg_string = tmpl % tmpl_dict
@@
-372,9
+393,14
@@
def __build_message(tmpl, patch, patch_nr, total_nr, msg_id, ref_id, options):
"""
p = crt_series.get_patch(patch)
"""
p = crt_series.get_patch(patch)
- descr = p.get_description().strip()
- descr_lines = descr.split('\n')
+ if p.get_description():
+ descr = p.get_description().strip()
+ else:
+ # provide a place holder and force the edit message option on
+ descr = '<empty message>'
+ options.edit_patches = True
+ descr_lines = descr.split('\n')
short_descr = descr_lines[0].rstrip()
long_descr = '\n'.join(descr_lines[1:]).lstrip()
short_descr = descr_lines[0].rstrip()
long_descr = '\n'.join(descr_lines[1:]).lstrip()
@@
-404,11
+430,6
@@
def __build_message(tmpl, patch, patch_nr, total_nr, msg_id, ref_id, options):
prefix_str = confprefix + ' '
else:
prefix_str = ''
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))
total_nr_str = str(total_nr)
patch_nr_str = str(patch_nr).zfill(len(total_nr_str))
@@
-417,6
+438,9
@@
def __build_message(tmpl, patch, patch_nr, total_nr, msg_id, ref_id, options):
else:
number_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
tmpl_dict = {'patch': patch,
'sender': sender,
# for backward template compatibility
@@
-425,11
+449,8
@@
def __build_message(tmpl, patch, patch_nr, total_nr, msg_id, ref_id, options):
'longdescr': long_descr,
# for backward template compatibility
'endofheaders': '',
'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,
# for backward template compatibility
'date': '',
'version': version_str,
@@
-493,6
+514,12
@@
def func(parser, options, args):
else:
raise CmdException, 'Incorrect options. Unknown patches to send'
else:
raise CmdException, 'Incorrect options. Unknown patches to send'
+ out.start('Checking the validity of the patches')
+ for p in patches:
+ if crt_series.empty_patch(p):
+ raise CmdException, 'Cannot send empty patch "%s"' % p
+ out.done()
+
smtppassword = options.smtp_password or config.get('stgit.smtppassword')
smtpuser = options.smtp_user or config.get('stgit.smtpuser')
smtpusetls = options.smtp_tls or config.get('stgit.smtptls') == 'yes'
smtppassword = options.smtp_password or config.get('stgit.smtppassword')
smtpuser = options.smtp_user or config.get('stgit.smtpuser')
smtpusetls = options.smtp_tls or config.get('stgit.smtptls') == 'yes'
@@
-553,7
+580,10
@@
def func(parser, options, args):
if options.template:
tmpl = file(options.template).read()
else:
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'
if not tmpl:
raise CmdException, 'No e-mail template file found'