##// END OF EJS Templates
Get patchbomb script to not use MIME attachments....
Bryan O'Sullivan -
r876:14cfaaec default
parent child Browse files
Show More
@@ -74,15 +74,14 b' def diffstat(patch):'
74 74
75 75 def patchbomb(ui, repo, *revs, **opts):
76 76 def prompt(prompt, default = None, rest = ': ', empty_ok = False):
77 try:
78 77 if default: prompt += ' [%s]' % default
79 78 prompt += rest
79 while True:
80 80 r = raw_input(prompt)
81 if not r and not empty_ok: raise EOFError
82 return r
83 except EOFError:
84 if default is None: raise
85 return default
81 if r: return r
82 if default is not None: return default
83 if empty_ok: return r
84 print >> sys.stderr, 'Please enter a valid value.'
86 85
87 86 def confirm(s):
88 87 if not prompt(s, default = 'y', rest = '? ').lower().startswith('y'):
@@ -97,7 +96,7 b' def patchbomb(ui, repo, *revs, **opts):'
97 96 confirm('Does the diffstat above look okay')
98 97 return s
99 98
100 def make_patch(patch, idx, total):
99 def makepatch(patch, idx, total):
101 100 desc = []
102 101 node = None
103 102 for line in patch:
@@ -107,30 +106,20 b' def patchbomb(ui, repo, *revs, **opts):'
107 106 if line.startswith('diff -r'): break
108 107 desc.append(line)
109 108 if not node: raise ValueError
110 msg = MIMEMultipart()
111 msg['X-Mercurial-Node'] = node
109 body = ('\n'.join(desc[1:]).strip() or
110 'Patch subject is complete summary.')
111 body += '\n\n\n' + cdiffstat('\n'.join(desc), patch) + '\n\n'
112 body += '\n'.join(patch)
113 msg = MIMEText(body)
112 114 subj = '[PATCH %d of %d] %s' % (idx, total, desc[0].strip())
113 115 if subj.endswith('.'): subj = subj[:-1]
114 116 msg['Subject'] = subj
115 body = '\n'.join(desc[1:]).strip() + '\n'
116 summary = subj
117 if body != '\n':
118 msg.attach(MIMEText(body))
119 summary += '\n\n' + body
120 else:
121 summary += '\n'
122 d = cdiffstat(summary, patch)
123 if d: msg.attach(MIMEText(d))
124 p = MIMEText('\n'.join(patch), 'x-patch')
125 p['Content-Disposition'] = commands.make_filename(repo, None,
126 'inline; filename=%b-%n.patch',
127 seqno = idx)
128 msg.attach(p)
117 msg['X-Mercurial-Node'] = node
129 118 return msg
130 119
131 120 start_time = int(time.time())
132 121
133 def make_msgid(id):
122 def genmsgid(id):
134 123 return '<%s.%s@%s>' % (id[:20], start_time, socket.getfqdn())
135 124
136 125 patches = []
@@ -139,6 +128,7 b' def patchbomb(ui, repo, *revs, **opts):'
139 128 def __init__(self, container):
140 129 self.lines = []
141 130 self.container = container
131 self.name = 'email'
142 132
143 133 def write(self, data):
144 134 self.lines.append(data)
@@ -156,7 +146,7 b' def patchbomb(ui, repo, *revs, **opts):'
156 146
157 147 for p, i in zip(patches, range(len(patches))):
158 148 jumbo.extend(p)
159 msgs.append(make_patch(p, i + 1, len(patches)))
149 msgs.append(makepatch(p, i + 1, len(patches)))
160 150
161 151 ui.write('\nWrite the introductory message for the patch series.\n\n')
162 152
@@ -188,24 +178,22 b' def patchbomb(ui, repo, *revs, **opts):'
188 178
189 179 msgs.insert(0, msg)
190 180
181 if not opts['test']:
191 182 s = smtplib.SMTP()
192 183 s.connect(host = ui.config('smtp', 'host', 'mail'),
193 184 port = int(ui.config('smtp', 'port', 25)))
194 185
195 refs = []
196 186 parent = None
197 187 tz = time.strftime('%z')
198 188 for m in msgs:
199 189 try:
200 m['Message-Id'] = make_msgid(m['X-Mercurial-Node'])
190 m['Message-Id'] = genmsgid(m['X-Mercurial-Node'])
201 191 except TypeError:
202 m['Message-Id'] = make_msgid('patchbomb')
192 m['Message-Id'] = genmsgid('patchbomb')
203 193 if parent:
204 194 m['In-Reply-To'] = parent
195 else:
205 196 parent = m['Message-Id']
206 if len(refs) > 1:
207 m['References'] = ' '.join(refs[:-1])
208 refs.append(parent)
209 197 m['Date'] = time.strftime('%a, %m %b %Y %T ', time.localtime(start_time)) + tz
210 198 start_time += 1
211 199 m['From'] = sender
@@ -219,6 +207,7 b' def patchbomb(ui, repo, *revs, **opts):'
219 207 fp.close()
220 208 else:
221 209 s.sendmail(sender, to + cc, m.as_string(0))
210 if not opts['test']:
222 211 s.close()
223 212
224 213 if __name__ == '__main__':
General Comments 0
You need to be logged in to leave comments. Login now