chiark
/
gitweb
/
~mdw
/
stgit
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Let the caller supply the diff text to diffstat()
[stgit]
/
stgit
/
commands
/
mail.py
diff --git
a/stgit/commands/mail.py
b/stgit/commands/mail.py
index 6202fc5e0332f9966e897377b537e184bd58b359..7d19ecacd239cff0f3b0a39f4e936cebaef3a7ed 100644
(file)
--- a/
stgit/commands/mail.py
+++ b/
stgit/commands/mail.py
@@
-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 %(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'
@@
-301,7
+320,7
@@
def __edit_message(msg):
return msg
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()
"""Build the cover message (series description) to be sent via SMTP
"""
sender = __get_sender()
@@
-320,9
+339,9
@@
def __build_cover(tmpl, total_nr, msg_id, options):
else:
prefix_str = ''
else:
prefix_str = ''
- total_nr_str = str(
total_nr
)
+ total_nr_str = str(
len(patches)
)
patch_nr_str = '0'.zfill(len(total_nr_str))
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 = ''
number_str = ' %s/%s' % (patch_nr_str, total_nr_str)
else:
number_str = ''
@@
-338,7
+357,12
@@
def __build_cover(tmpl, total_nr, msg_id, options):
'prefix': prefix_str,
'patchnr': patch_nr_str,
'totalnr': total_nr_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
try:
msg_string = tmpl % tmpl_dict
@@
-401,11
+425,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))
@@
-414,6
+433,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
@@
-422,11
+444,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,
@@
-529,7
+548,7
@@
def func(parser, options, args):
raise CmdException, 'No cover message template file found'
msg_id = email.Utils.make_msgid('stgit')
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)
from_addr, to_addr_list = __parse_addresses(msg)
msg_string = msg.as_string(options.mbox)
@@
-550,7
+569,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'