help = 'username for SMTP authentication'),
make_option('-b', '--branch',
help = 'use BRANCH instead of the default one'),
+ make_option('--binary',
+ help = 'output a diff even for binary files',
+ action = 'store_true'),
make_option('-m', '--mbox',
help = 'generate an mbox file instead of sending',
action = 'store_true')]
return address_or_alias(sender)
-def __parse_addresses(addresses):
+def __parse_addresses(msg):
"""Return a two elements tuple: (from, [to])
"""
- def __addr_list(addrs):
- m = re.search('[^@\s<,]+@[^>\s,]+', addrs);
- if (m == None):
- return []
- return [ m.group() ] + __addr_list(addrs[m.end():])
-
- from_addr_list = []
- to_addr_list = []
- for line in addresses.split('\n'):
- if re.match('from:\s+', line, re.I):
- from_addr_list += __addr_list(line)
- elif re.match('(to|cc|bcc):\s+', line, re.I):
- to_addr_list += __addr_list(line)
+ def __addr_list(msg, header):
+ return [name_addr[1] for name_addr in
+ email.Utils.getaddresses(msg.get_all(header, []))]
+ from_addr_list = __addr_list(msg, 'From')
if len(from_addr_list) == 0:
raise CmdException, 'No "From" address'
+
+ to_addr_list = __addr_list(msg, 'To') + __addr_list(msg, 'Cc') \
+ + __addr_list(msg, 'Bcc')
if len(to_addr_list) == 0:
raise CmdException, 'No "To/Cc/Bcc" addresses'
"""
addr_list = []
- r = re.compile('^(signed-off-by|acked-by):\s+(.+)$', re.I)
+ r = re.compile('^(signed-off-by|acked-by|cc):\s+(.+)$', re.I)
for line in msg.split('\n'):
m = r.match(line)
if m:
f.write(msg)
f.close()
- # the editor
- editor = config.get('stgit.editor')
- if editor:
- pass
- elif 'EDITOR' in os.environ:
- editor = os.environ['EDITOR']
- else:
- editor = 'vi'
- editor += ' %s' % fname
-
- print 'Invoking the editor: "%s"...' % editor,
- sys.stdout.flush()
- print 'done (exit code: %d)' % os.system(editor)
+ call_editor(fname)
# read the message back
f = file(fname)
__build_extra_headers(msg, msg_id, options.refid)
__encode_message(msg)
- msg_string = msg.as_string(options.mbox)
-
- return msg_string.strip('\n')
+ return msg
def __build_message(tmpl, patch, patch_nr, total_nr, msg_id, ref_id, options):
"""Build the message to be sent via SMTP
else:
prefix_str = ''
+ if options.binary:
+ diff_flags = [ '--binary' ]
+ else:
+ diff_flags = []
+
total_nr_str = str(total_nr)
patch_nr_str = str(patch_nr).zfill(len(total_nr_str))
if total_nr > 1:
# for backward template compatibility
'endofheaders': '',
'diff': git.diff(rev1 = git_id('%s//bottom' % patch),
- rev2 = git_id('%s//top' % 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)),
# for backward template compatibility
__build_extra_headers(msg, msg_id, ref_id)
__encode_message(msg)
- msg_string = msg.as_string(options.mbox)
-
- return msg_string.strip('\n')
+ return msg
def func(parser, options, args):
"""Send the patches by e-mail using the patchmail.tmpl file as
msg = __build_cover(tmpl, total_nr, msg_id, options)
from_addr, to_addr_list = __parse_addresses(msg)
+ msg_string = msg.as_string(options.mbox)
+
# subsequent e-mails are seen as replies to the first one
if not options.noreply:
ref_id = msg_id
if options.mbox:
- print msg
- print
+ out.stdout_raw(msg_string + '\n')
else:
- print 'Sending the cover message...',
- sys.stdout.flush()
- __send_message(smtpserver, from_addr, to_addr_list, msg, sleep,
- smtpuser, smtppassword)
- print 'done'
+ out.start('Sending the cover message')
+ __send_message(smtpserver, from_addr, to_addr_list, msg_string,
+ sleep, smtpuser, smtppassword)
+ out.done()
# send the patches
if options.template:
options)
from_addr, to_addr_list = __parse_addresses(msg)
+ msg_string = msg.as_string(options.mbox)
+
# subsequent e-mails are seen as replies to the first one
if not options.noreply and not ref_id:
ref_id = msg_id
if options.mbox:
- print msg
- print
+ out.stdout_raw(msg_string + '\n')
else:
- print 'Sending patch "%s"...' % p,
- sys.stdout.flush()
- __send_message(smtpserver, from_addr, to_addr_list, msg, sleep,
- smtpuser, smtppassword)
- print 'done'
+ out.start('Sending patch "%s"' % p)
+ __send_message(smtpserver, from_addr, to_addr_list, msg_string,
+ sleep, smtpuser, smtppassword)
+ out.done()