##// END OF EJS Templates
patchbomb: add option to send intro email for a single patch (issue1120)
Chris Winter -
r7360:42f1b8cb default
parent child Browse files
Show More
@@ -1,486 +1,488 b''
1 '''sending Mercurial changesets as a series of patch emails
1 '''sending Mercurial changesets as a series of patch emails
2
2
3 The series is started off with a "[PATCH 0 of N]" introduction,
3 The series is started off with a "[PATCH 0 of N]" introduction,
4 which describes the series as a whole.
4 which describes the series as a whole.
5
5
6 Each patch email has a Subject line of "[PATCH M of N] ...", using
6 Each patch email has a Subject line of "[PATCH M of N] ...", using
7 the first line of the changeset description as the subject text.
7 the first line of the changeset description as the subject text.
8 The message contains two or three body parts:
8 The message contains two or three body parts:
9
9
10 The remainder of the changeset description.
10 The remainder of the changeset description.
11
11
12 [Optional] If the diffstat program is installed, the result of
12 [Optional] If the diffstat program is installed, the result of
13 running diffstat on the patch.
13 running diffstat on the patch.
14
14
15 The patch itself, as generated by "hg export".
15 The patch itself, as generated by "hg export".
16
16
17 Each message refers to all of its predecessors using the In-Reply-To
17 Each message refers to all of its predecessors using the In-Reply-To
18 and References headers, so they will show up as a sequence in
18 and References headers, so they will show up as a sequence in
19 threaded mail and news readers, and in mail archives.
19 threaded mail and news readers, and in mail archives.
20
20
21 For each changeset, you will be prompted with a diffstat summary and
21 For each changeset, you will be prompted with a diffstat summary and
22 the changeset summary, so you can be sure you are sending the right changes.
22 the changeset summary, so you can be sure you are sending the right changes.
23
23
24 To enable this extension:
24 To enable this extension:
25
25
26 [extensions]
26 [extensions]
27 hgext.patchbomb =
27 hgext.patchbomb =
28
28
29 To configure other defaults, add a section like this to your hgrc file:
29 To configure other defaults, add a section like this to your hgrc file:
30
30
31 [email]
31 [email]
32 from = My Name <my@email>
32 from = My Name <my@email>
33 to = recipient1, recipient2, ...
33 to = recipient1, recipient2, ...
34 cc = cc1, cc2, ...
34 cc = cc1, cc2, ...
35 bcc = bcc1, bcc2, ...
35 bcc = bcc1, bcc2, ...
36
36
37 Then you can use the "hg email" command to mail a series of changesets
37 Then you can use the "hg email" command to mail a series of changesets
38 as a patchbomb.
38 as a patchbomb.
39
39
40 To avoid sending patches prematurely, it is a good idea to first run
40 To avoid sending patches prematurely, it is a good idea to first run
41 the "email" command with the "-n" option (test only). You will be
41 the "email" command with the "-n" option (test only). You will be
42 prompted for an email recipient address, a subject an an introductory
42 prompted for an email recipient address, a subject an an introductory
43 message describing the patches of your patchbomb. Then when all is
43 message describing the patches of your patchbomb. Then when all is
44 done, patchbomb messages are displayed. If PAGER environment variable
44 done, patchbomb messages are displayed. If PAGER environment variable
45 is set, your pager will be fired up once for each patchbomb message, so
45 is set, your pager will be fired up once for each patchbomb message, so
46 you can verify everything is alright.
46 you can verify everything is alright.
47
47
48 The "-m" (mbox) option is also very useful. Instead of previewing
48 The "-m" (mbox) option is also very useful. Instead of previewing
49 each patchbomb message in a pager or sending the messages directly,
49 each patchbomb message in a pager or sending the messages directly,
50 it will create a UNIX mailbox file with the patch emails. This
50 it will create a UNIX mailbox file with the patch emails. This
51 mailbox file can be previewed with any mail user agent which supports
51 mailbox file can be previewed with any mail user agent which supports
52 UNIX mbox files, i.e. with mutt:
52 UNIX mbox files, i.e. with mutt:
53
53
54 % mutt -R -f mbox
54 % mutt -R -f mbox
55
55
56 When you are previewing the patchbomb messages, you can use `formail'
56 When you are previewing the patchbomb messages, you can use `formail'
57 (a utility that is commonly installed as part of the procmail package),
57 (a utility that is commonly installed as part of the procmail package),
58 to send each message out:
58 to send each message out:
59
59
60 % formail -s sendmail -bm -t < mbox
60 % formail -s sendmail -bm -t < mbox
61
61
62 That should be all. Now your patchbomb is on its way out.'''
62 That should be all. Now your patchbomb is on its way out.'''
63
63
64 import os, errno, socket, tempfile, cStringIO
64 import os, errno, socket, tempfile, cStringIO
65 import email.MIMEMultipart, email.MIMEBase
65 import email.MIMEMultipart, email.MIMEBase
66 import email.Utils, email.Encoders, email.Generator
66 import email.Utils, email.Encoders, email.Generator
67 from mercurial import cmdutil, commands, hg, mail, patch, util
67 from mercurial import cmdutil, commands, hg, mail, patch, util
68 from mercurial.i18n import _
68 from mercurial.i18n import _
69 from mercurial.node import bin
69 from mercurial.node import bin
70
70
71 class exportee:
71 class exportee:
72 def __init__(self, container):
72 def __init__(self, container):
73 self.lines = []
73 self.lines = []
74 self.container = container
74 self.container = container
75 self.name = 'email'
75 self.name = 'email'
76
76
77 def write(self, data):
77 def write(self, data):
78 self.lines.append(data)
78 self.lines.append(data)
79
79
80 def close(self):
80 def close(self):
81 self.container.append(''.join(self.lines).split('\n'))
81 self.container.append(''.join(self.lines).split('\n'))
82 self.lines = []
82 self.lines = []
83
83
84 def prompt(ui, prompt, default=None, rest=': ', empty_ok=False):
84 def prompt(ui, prompt, default=None, rest=': ', empty_ok=False):
85 if not ui.interactive:
85 if not ui.interactive:
86 return default
86 return default
87 if default:
87 if default:
88 prompt += ' [%s]' % default
88 prompt += ' [%s]' % default
89 prompt += rest
89 prompt += rest
90 while True:
90 while True:
91 r = ui.prompt(prompt, default=default)
91 r = ui.prompt(prompt, default=default)
92 if r:
92 if r:
93 return r
93 return r
94 if default is not None:
94 if default is not None:
95 return default
95 return default
96 if empty_ok:
96 if empty_ok:
97 return r
97 return r
98 ui.warn(_('Please enter a valid value.\n'))
98 ui.warn(_('Please enter a valid value.\n'))
99
99
100 def cdiffstat(ui, summary, patchlines):
100 def cdiffstat(ui, summary, patchlines):
101 s = patch.diffstat(patchlines)
101 s = patch.diffstat(patchlines)
102 if s:
102 if s:
103 if summary:
103 if summary:
104 ui.write(summary, '\n')
104 ui.write(summary, '\n')
105 ui.write(s, '\n')
105 ui.write(s, '\n')
106 ans = prompt(ui, _('Does the diffstat above look okay? '), 'y')
106 ans = prompt(ui, _('Does the diffstat above look okay? '), 'y')
107 if not ans.lower().startswith('y'):
107 if not ans.lower().startswith('y'):
108 raise util.Abort(_('diffstat rejected'))
108 raise util.Abort(_('diffstat rejected'))
109 elif s is None:
109 elif s is None:
110 ui.warn(_('no diffstat information available\n'))
110 ui.warn(_('no diffstat information available\n'))
111 s = ''
111 s = ''
112 return s
112 return s
113
113
114 def makepatch(ui, repo, patch, opts, _charsets, idx, total, patchname=None):
114 def makepatch(ui, repo, patch, opts, _charsets, idx, total, patchname=None):
115
115
116 desc = []
116 desc = []
117 node = None
117 node = None
118 body = ''
118 body = ''
119
119
120 for line in patch:
120 for line in patch:
121 if line.startswith('#'):
121 if line.startswith('#'):
122 if line.startswith('# Node ID'):
122 if line.startswith('# Node ID'):
123 node = line.split()[-1]
123 node = line.split()[-1]
124 continue
124 continue
125 if line.startswith('diff -r') or line.startswith('diff --git'):
125 if line.startswith('diff -r') or line.startswith('diff --git'):
126 break
126 break
127 desc.append(line)
127 desc.append(line)
128
128
129 if not patchname and not node:
129 if not patchname and not node:
130 raise ValueError
130 raise ValueError
131
131
132 if opts.get('attach'):
132 if opts.get('attach'):
133 body = ('\n'.join(desc[1:]).strip() or
133 body = ('\n'.join(desc[1:]).strip() or
134 'Patch subject is complete summary.')
134 'Patch subject is complete summary.')
135 body += '\n\n\n'
135 body += '\n\n\n'
136
136
137 if opts.get('plain'):
137 if opts.get('plain'):
138 while patch and patch[0].startswith('# '):
138 while patch and patch[0].startswith('# '):
139 patch.pop(0)
139 patch.pop(0)
140 if patch:
140 if patch:
141 patch.pop(0)
141 patch.pop(0)
142 while patch and not patch[0].strip():
142 while patch and not patch[0].strip():
143 patch.pop(0)
143 patch.pop(0)
144
144
145 if opts.get('diffstat'):
145 if opts.get('diffstat'):
146 body += cdiffstat(ui, '\n'.join(desc), patch) + '\n\n'
146 body += cdiffstat(ui, '\n'.join(desc), patch) + '\n\n'
147
147
148 if opts.get('attach') or opts.get('inline'):
148 if opts.get('attach') or opts.get('inline'):
149 msg = email.MIMEMultipart.MIMEMultipart()
149 msg = email.MIMEMultipart.MIMEMultipart()
150 if body:
150 if body:
151 msg.attach(mail.mimeencode(ui, body, _charsets, opts.get('test')))
151 msg.attach(mail.mimeencode(ui, body, _charsets, opts.get('test')))
152 p = mail.mimetextpatch('\n'.join(patch), 'x-patch', opts.get('test'))
152 p = mail.mimetextpatch('\n'.join(patch), 'x-patch', opts.get('test'))
153 binnode = bin(node)
153 binnode = bin(node)
154 # if node is mq patch, it will have patch file name as tag
154 # if node is mq patch, it will have patch file name as tag
155 if not patchname:
155 if not patchname:
156 patchtags = [t for t in repo.nodetags(binnode)
156 patchtags = [t for t in repo.nodetags(binnode)
157 if t.endswith('.patch') or t.endswith('.diff')]
157 if t.endswith('.patch') or t.endswith('.diff')]
158 if patchtags:
158 if patchtags:
159 patchname = patchtags[0]
159 patchname = patchtags[0]
160 elif total > 1:
160 elif total > 1:
161 patchname = cmdutil.make_filename(repo, '%b-%n.patch',
161 patchname = cmdutil.make_filename(repo, '%b-%n.patch',
162 binnode, seqno=idx, total=total)
162 binnode, seqno=idx, total=total)
163 else:
163 else:
164 patchname = cmdutil.make_filename(repo, '%b.patch', binnode)
164 patchname = cmdutil.make_filename(repo, '%b.patch', binnode)
165 disposition = 'inline'
165 disposition = 'inline'
166 if opts.get('attach'):
166 if opts.get('attach'):
167 disposition = 'attachment'
167 disposition = 'attachment'
168 p['Content-Disposition'] = disposition + '; filename=' + patchname
168 p['Content-Disposition'] = disposition + '; filename=' + patchname
169 msg.attach(p)
169 msg.attach(p)
170 else:
170 else:
171 body += '\n'.join(patch)
171 body += '\n'.join(patch)
172 msg = mail.mimetextpatch(body, display=opts.get('test'))
172 msg = mail.mimetextpatch(body, display=opts.get('test'))
173
173
174 subj = desc[0].strip().rstrip('. ')
174 subj = desc[0].strip().rstrip('. ')
175 if total == 1:
175 if total == 1 and not opts.get('intro'):
176 subj = '[PATCH] ' + (opts.get('subject') or subj)
176 subj = '[PATCH] ' + (opts.get('subject') or subj)
177 else:
177 else:
178 tlen = len(str(total))
178 tlen = len(str(total))
179 subj = '[PATCH %0*d of %d] %s' % (tlen, idx, total, subj)
179 subj = '[PATCH %0*d of %d] %s' % (tlen, idx, total, subj)
180 msg['Subject'] = mail.headencode(ui, subj, _charsets, opts.get('test'))
180 msg['Subject'] = mail.headencode(ui, subj, _charsets, opts.get('test'))
181 msg['X-Mercurial-Node'] = node
181 msg['X-Mercurial-Node'] = node
182 return msg, subj
182 return msg, subj
183
183
184 def patchbomb(ui, repo, *revs, **opts):
184 def patchbomb(ui, repo, *revs, **opts):
185 '''send changesets by email
185 '''send changesets by email
186
186
187 By default, diffs are sent in the format generated by hg export,
187 By default, diffs are sent in the format generated by hg export,
188 one per message. The series starts with a "[PATCH 0 of N]"
188 one per message. The series starts with a "[PATCH 0 of N]"
189 introduction, which describes the series as a whole.
189 introduction, which describes the series as a whole.
190
190
191 Each patch email has a Subject line of "[PATCH M of N] ...", using
191 Each patch email has a Subject line of "[PATCH M of N] ...", using
192 the first line of the changeset description as the subject text.
192 the first line of the changeset description as the subject text.
193 The message contains two or three body parts. First, the rest of
193 The message contains two or three body parts. First, the rest of
194 the changeset description. Next, (optionally) if the diffstat
194 the changeset description. Next, (optionally) if the diffstat
195 program is installed, the result of running diffstat on the patch.
195 program is installed, the result of running diffstat on the patch.
196 Finally, the patch itself, as generated by "hg export".
196 Finally, the patch itself, as generated by "hg export".
197
197
198 With --outgoing, emails will be generated for patches not
198 With --outgoing, emails will be generated for patches not
199 found in the destination repository (or only those which are
199 found in the destination repository (or only those which are
200 ancestors of the specified revisions if any are provided)
200 ancestors of the specified revisions if any are provided)
201
201
202 With --bundle, changesets are selected as for --outgoing,
202 With --bundle, changesets are selected as for --outgoing,
203 but a single email containing a binary Mercurial bundle as an
203 but a single email containing a binary Mercurial bundle as an
204 attachment will be sent.
204 attachment will be sent.
205
205
206 Examples:
206 Examples:
207
207
208 hg email -r 3000 # send patch 3000 only
208 hg email -r 3000 # send patch 3000 only
209 hg email -r 3000 -r 3001 # send patches 3000 and 3001
209 hg email -r 3000 -r 3001 # send patches 3000 and 3001
210 hg email -r 3000:3005 # send patches 3000 through 3005
210 hg email -r 3000:3005 # send patches 3000 through 3005
211 hg email 3000 # send patch 3000 (deprecated)
211 hg email 3000 # send patch 3000 (deprecated)
212
212
213 hg email -o # send all patches not in default
213 hg email -o # send all patches not in default
214 hg email -o DEST # send all patches not in DEST
214 hg email -o DEST # send all patches not in DEST
215 hg email -o -r 3000 # send all ancestors of 3000 not in default
215 hg email -o -r 3000 # send all ancestors of 3000 not in default
216 hg email -o -r 3000 DEST # send all ancestors of 3000 not in DEST
216 hg email -o -r 3000 DEST # send all ancestors of 3000 not in DEST
217
217
218 hg email -b # send bundle of all patches not in default
218 hg email -b # send bundle of all patches not in default
219 hg email -b DEST # send bundle of all patches not in DEST
219 hg email -b DEST # send bundle of all patches not in DEST
220 hg email -b -r 3000 # bundle of all ancestors of 3000 not in default
220 hg email -b -r 3000 # bundle of all ancestors of 3000 not in default
221 hg email -b -r 3000 DEST # bundle of all ancestors of 3000 not in DEST
221 hg email -b -r 3000 DEST # bundle of all ancestors of 3000 not in DEST
222
222
223 Before using this command, you will need to enable email in your hgrc.
223 Before using this command, you will need to enable email in your hgrc.
224 See the [email] section in hgrc(5) for details.
224 See the [email] section in hgrc(5) for details.
225 '''
225 '''
226
226
227 _charsets = mail._charsets(ui)
227 _charsets = mail._charsets(ui)
228
228
229 def outgoing(dest, revs):
229 def outgoing(dest, revs):
230 '''Return the revisions present locally but not in dest'''
230 '''Return the revisions present locally but not in dest'''
231 dest = ui.expandpath(dest or 'default-push', dest or 'default')
231 dest = ui.expandpath(dest or 'default-push', dest or 'default')
232 revs = [repo.lookup(rev) for rev in revs]
232 revs = [repo.lookup(rev) for rev in revs]
233 other = hg.repository(ui, dest)
233 other = hg.repository(ui, dest)
234 ui.status(_('comparing with %s\n') % dest)
234 ui.status(_('comparing with %s\n') % dest)
235 o = repo.findoutgoing(other)
235 o = repo.findoutgoing(other)
236 if not o:
236 if not o:
237 ui.status(_("no changes found\n"))
237 ui.status(_("no changes found\n"))
238 return []
238 return []
239 o = repo.changelog.nodesbetween(o, revs or None)[0]
239 o = repo.changelog.nodesbetween(o, revs or None)[0]
240 return [str(repo.changelog.rev(r)) for r in o]
240 return [str(repo.changelog.rev(r)) for r in o]
241
241
242 def getbundle(dest):
242 def getbundle(dest):
243 tmpdir = tempfile.mkdtemp(prefix='hg-email-bundle-')
243 tmpdir = tempfile.mkdtemp(prefix='hg-email-bundle-')
244 tmpfn = os.path.join(tmpdir, 'bundle')
244 tmpfn = os.path.join(tmpdir, 'bundle')
245 try:
245 try:
246 commands.bundle(ui, repo, tmpfn, dest, **opts)
246 commands.bundle(ui, repo, tmpfn, dest, **opts)
247 return open(tmpfn, 'rb').read()
247 return open(tmpfn, 'rb').read()
248 finally:
248 finally:
249 try:
249 try:
250 os.unlink(tmpfn)
250 os.unlink(tmpfn)
251 except:
251 except:
252 pass
252 pass
253 os.rmdir(tmpdir)
253 os.rmdir(tmpdir)
254
254
255 if not (opts.get('test') or opts.get('mbox')):
255 if not (opts.get('test') or opts.get('mbox')):
256 # really sending
256 # really sending
257 mail.validateconfig(ui)
257 mail.validateconfig(ui)
258
258
259 if not (revs or opts.get('rev')
259 if not (revs or opts.get('rev')
260 or opts.get('outgoing') or opts.get('bundle')
260 or opts.get('outgoing') or opts.get('bundle')
261 or opts.get('patches')):
261 or opts.get('patches')):
262 raise util.Abort(_('specify at least one changeset with -r or -o'))
262 raise util.Abort(_('specify at least one changeset with -r or -o'))
263
263
264 cmdutil.setremoteconfig(ui, opts)
264 cmdutil.setremoteconfig(ui, opts)
265 if opts.get('outgoing') and opts.get('bundle'):
265 if opts.get('outgoing') and opts.get('bundle'):
266 raise util.Abort(_("--outgoing mode always on with --bundle;"
266 raise util.Abort(_("--outgoing mode always on with --bundle;"
267 " do not re-specify --outgoing"))
267 " do not re-specify --outgoing"))
268
268
269 if opts.get('outgoing') or opts.get('bundle'):
269 if opts.get('outgoing') or opts.get('bundle'):
270 if len(revs) > 1:
270 if len(revs) > 1:
271 raise util.Abort(_("too many destinations"))
271 raise util.Abort(_("too many destinations"))
272 dest = revs and revs[0] or None
272 dest = revs and revs[0] or None
273 revs = []
273 revs = []
274
274
275 if opts.get('rev'):
275 if opts.get('rev'):
276 if revs:
276 if revs:
277 raise util.Abort(_('use only one form to specify the revision'))
277 raise util.Abort(_('use only one form to specify the revision'))
278 revs = opts.get('rev')
278 revs = opts.get('rev')
279
279
280 if opts.get('outgoing'):
280 if opts.get('outgoing'):
281 revs = outgoing(dest, opts.get('rev'))
281 revs = outgoing(dest, opts.get('rev'))
282 if opts.get('bundle'):
282 if opts.get('bundle'):
283 opts['revs'] = revs
283 opts['revs'] = revs
284
284
285 # start
285 # start
286 if opts.get('date'):
286 if opts.get('date'):
287 start_time = util.parsedate(opts.get('date'))
287 start_time = util.parsedate(opts.get('date'))
288 else:
288 else:
289 start_time = util.makedate()
289 start_time = util.makedate()
290
290
291 def genmsgid(id):
291 def genmsgid(id):
292 return '<%s.%s@%s>' % (id[:20], int(start_time[0]), socket.getfqdn())
292 return '<%s.%s@%s>' % (id[:20], int(start_time[0]), socket.getfqdn())
293
293
294 def getdescription(body, sender):
294 def getdescription(body, sender):
295 if opts.get('desc'):
295 if opts.get('desc'):
296 body = open(opts.get('desc')).read()
296 body = open(opts.get('desc')).read()
297 else:
297 else:
298 ui.write(_('\nWrite the introductory message for the '
298 ui.write(_('\nWrite the introductory message for the '
299 'patch series.\n\n'))
299 'patch series.\n\n'))
300 body = ui.edit(body, sender)
300 body = ui.edit(body, sender)
301 return body
301 return body
302
302
303 def getpatchmsgs(patches, patchnames=None):
303 def getpatchmsgs(patches, patchnames=None):
304 jumbo = []
304 jumbo = []
305 msgs = []
305 msgs = []
306
306
307 ui.write(_('This patch series consists of %d patches.\n\n')
307 ui.write(_('This patch series consists of %d patches.\n\n')
308 % len(patches))
308 % len(patches))
309
309
310 name = None
310 name = None
311 for p, i in zip(patches, xrange(len(patches))):
311 for p, i in zip(patches, xrange(len(patches))):
312 jumbo.extend(p)
312 jumbo.extend(p)
313 if patchnames:
313 if patchnames:
314 name = patchnames[i]
314 name = patchnames[i]
315 msg = makepatch(ui, repo, p, opts, _charsets, i + 1,
315 msg = makepatch(ui, repo, p, opts, _charsets, i + 1,
316 len(patches), name)
316 len(patches), name)
317 msgs.append(msg)
317 msgs.append(msg)
318
318
319 if len(patches) > 1:
319 if len(patches) > 1 or opts.get('intro'):
320 tlen = len(str(len(patches)))
320 tlen = len(str(len(patches)))
321
321
322 subj = '[PATCH %0*d of %d] %s' % (
322 subj = '[PATCH %0*d of %d] %s' % (
323 tlen, 0, len(patches),
323 tlen, 0, len(patches),
324 opts.get('subject') or
324 opts.get('subject') or
325 prompt(ui, 'Subject:',
325 prompt(ui, 'Subject:',
326 rest=' [PATCH %0*d of %d] ' % (tlen, 0, len(patches))))
326 rest=' [PATCH %0*d of %d] ' % (tlen, 0, len(patches))))
327
327
328 body = ''
328 body = ''
329 if opts.get('diffstat'):
329 if opts.get('diffstat'):
330 d = cdiffstat(ui, _('Final summary:\n'), jumbo)
330 d = cdiffstat(ui, _('Final summary:\n'), jumbo)
331 if d:
331 if d:
332 body = '\n' + d
332 body = '\n' + d
333
333
334 body = getdescription(body, sender)
334 body = getdescription(body, sender)
335 msg = mail.mimeencode(ui, body, _charsets, opts.get('test'))
335 msg = mail.mimeencode(ui, body, _charsets, opts.get('test'))
336 msg['Subject'] = mail.headencode(ui, subj, _charsets,
336 msg['Subject'] = mail.headencode(ui, subj, _charsets,
337 opts.get('test'))
337 opts.get('test'))
338
338
339 msgs.insert(0, (msg, subj))
339 msgs.insert(0, (msg, subj))
340 return msgs
340 return msgs
341
341
342 def getbundlemsgs(bundle):
342 def getbundlemsgs(bundle):
343 subj = (opts.get('subject')
343 subj = (opts.get('subject')
344 or prompt(ui, 'Subject:', 'A bundle for your repository'))
344 or prompt(ui, 'Subject:', 'A bundle for your repository'))
345
345
346 body = getdescription('', sender)
346 body = getdescription('', sender)
347 msg = email.MIMEMultipart.MIMEMultipart()
347 msg = email.MIMEMultipart.MIMEMultipart()
348 if body:
348 if body:
349 msg.attach(mail.mimeencode(ui, body, _charsets, opts.get('test')))
349 msg.attach(mail.mimeencode(ui, body, _charsets, opts.get('test')))
350 datapart = email.MIMEBase.MIMEBase('application', 'x-mercurial-bundle')
350 datapart = email.MIMEBase.MIMEBase('application', 'x-mercurial-bundle')
351 datapart.set_payload(bundle)
351 datapart.set_payload(bundle)
352 datapart.add_header('Content-Disposition', 'attachment',
352 datapart.add_header('Content-Disposition', 'attachment',
353 filename='bundle.hg')
353 filename='bundle.hg')
354 email.Encoders.encode_base64(datapart)
354 email.Encoders.encode_base64(datapart)
355 msg.attach(datapart)
355 msg.attach(datapart)
356 msg['Subject'] = mail.headencode(ui, subj, _charsets, opts.get('test'))
356 msg['Subject'] = mail.headencode(ui, subj, _charsets, opts.get('test'))
357 return [(msg, subj)]
357 return [(msg, subj)]
358
358
359 sender = (opts.get('from') or ui.config('email', 'from') or
359 sender = (opts.get('from') or ui.config('email', 'from') or
360 ui.config('patchbomb', 'from') or
360 ui.config('patchbomb', 'from') or
361 prompt(ui, 'From', ui.username()))
361 prompt(ui, 'From', ui.username()))
362
362
363 patches = opts.get('patches')
363 patches = opts.get('patches')
364 if patches:
364 if patches:
365 msgs = getpatchmsgs(patches, opts.get('patchnames'))
365 msgs = getpatchmsgs(patches, opts.get('patchnames'))
366 elif opts.get('bundle'):
366 elif opts.get('bundle'):
367 msgs = getbundlemsgs(getbundle(dest))
367 msgs = getbundlemsgs(getbundle(dest))
368 else:
368 else:
369 patches = []
369 patches = []
370 commands.export(ui, repo, *revs, **{'output': exportee(patches),
370 commands.export(ui, repo, *revs, **{'output': exportee(patches),
371 'switch_parent': False,
371 'switch_parent': False,
372 'text': None,
372 'text': None,
373 'git': opts.get('git')})
373 'git': opts.get('git')})
374 msgs = getpatchmsgs(patches)
374 msgs = getpatchmsgs(patches)
375
375
376 def getaddrs(opt, prpt, default = None):
376 def getaddrs(opt, prpt, default = None):
377 addrs = opts.get(opt) or (ui.config('email', opt) or
377 addrs = opts.get(opt) or (ui.config('email', opt) or
378 ui.config('patchbomb', opt) or
378 ui.config('patchbomb', opt) or
379 prompt(ui, prpt, default)).split(',')
379 prompt(ui, prpt, default)).split(',')
380 return [mail.addressencode(ui, a.strip(), _charsets, opts.get('test'))
380 return [mail.addressencode(ui, a.strip(), _charsets, opts.get('test'))
381 for a in addrs if a.strip()]
381 for a in addrs if a.strip()]
382
382
383 to = getaddrs('to', 'To')
383 to = getaddrs('to', 'To')
384 cc = getaddrs('cc', 'Cc', '')
384 cc = getaddrs('cc', 'Cc', '')
385
385
386 bcc = opts.get('bcc') or (ui.config('email', 'bcc') or
386 bcc = opts.get('bcc') or (ui.config('email', 'bcc') or
387 ui.config('patchbomb', 'bcc') or '').split(',')
387 ui.config('patchbomb', 'bcc') or '').split(',')
388 bcc = [mail.addressencode(ui, a.strip(), _charsets, opts.get('test'))
388 bcc = [mail.addressencode(ui, a.strip(), _charsets, opts.get('test'))
389 for a in bcc if a.strip()]
389 for a in bcc if a.strip()]
390
390
391 ui.write('\n')
391 ui.write('\n')
392
392
393 parent = None
393 parent = None
394
394
395 sender_addr = email.Utils.parseaddr(sender)[1]
395 sender_addr = email.Utils.parseaddr(sender)[1]
396 sender = mail.addressencode(ui, sender, _charsets, opts.get('test'))
396 sender = mail.addressencode(ui, sender, _charsets, opts.get('test'))
397 sendmail = None
397 sendmail = None
398 for m, subj in msgs:
398 for m, subj in msgs:
399 try:
399 try:
400 m['Message-Id'] = genmsgid(m['X-Mercurial-Node'])
400 m['Message-Id'] = genmsgid(m['X-Mercurial-Node'])
401 except TypeError:
401 except TypeError:
402 m['Message-Id'] = genmsgid('patchbomb')
402 m['Message-Id'] = genmsgid('patchbomb')
403 if parent:
403 if parent:
404 m['In-Reply-To'] = parent
404 m['In-Reply-To'] = parent
405 else:
405 else:
406 parent = m['Message-Id']
406 parent = m['Message-Id']
407 m['Date'] = util.datestr(start_time, "%a, %d %b %Y %H:%M:%S %1%2")
407 m['Date'] = util.datestr(start_time, "%a, %d %b %Y %H:%M:%S %1%2")
408
408
409 start_time = (start_time[0] + 1, start_time[1])
409 start_time = (start_time[0] + 1, start_time[1])
410 m['From'] = sender
410 m['From'] = sender
411 m['To'] = ', '.join(to)
411 m['To'] = ', '.join(to)
412 if cc:
412 if cc:
413 m['Cc'] = ', '.join(cc)
413 m['Cc'] = ', '.join(cc)
414 if bcc:
414 if bcc:
415 m['Bcc'] = ', '.join(bcc)
415 m['Bcc'] = ', '.join(bcc)
416 if opts.get('test'):
416 if opts.get('test'):
417 ui.status(_('Displaying '), subj, ' ...\n')
417 ui.status(_('Displaying '), subj, ' ...\n')
418 ui.flush()
418 ui.flush()
419 if 'PAGER' in os.environ:
419 if 'PAGER' in os.environ:
420 fp = util.popen(os.environ['PAGER'], 'w')
420 fp = util.popen(os.environ['PAGER'], 'w')
421 else:
421 else:
422 fp = ui
422 fp = ui
423 generator = email.Generator.Generator(fp, mangle_from_=False)
423 generator = email.Generator.Generator(fp, mangle_from_=False)
424 try:
424 try:
425 generator.flatten(m, 0)
425 generator.flatten(m, 0)
426 fp.write('\n')
426 fp.write('\n')
427 except IOError, inst:
427 except IOError, inst:
428 if inst.errno != errno.EPIPE:
428 if inst.errno != errno.EPIPE:
429 raise
429 raise
430 if fp is not ui:
430 if fp is not ui:
431 fp.close()
431 fp.close()
432 elif opts.get('mbox'):
432 elif opts.get('mbox'):
433 ui.status(_('Writing '), subj, ' ...\n')
433 ui.status(_('Writing '), subj, ' ...\n')
434 fp = open(opts.get('mbox'), 'In-Reply-To' in m and 'ab+' or 'wb+')
434 fp = open(opts.get('mbox'), 'In-Reply-To' in m and 'ab+' or 'wb+')
435 generator = email.Generator.Generator(fp, mangle_from_=True)
435 generator = email.Generator.Generator(fp, mangle_from_=True)
436 date = util.datestr(start_time, '%a %b %d %H:%M:%S %Y')
436 date = util.datestr(start_time, '%a %b %d %H:%M:%S %Y')
437 fp.write('From %s %s\n' % (sender_addr, date))
437 fp.write('From %s %s\n' % (sender_addr, date))
438 generator.flatten(m, 0)
438 generator.flatten(m, 0)
439 fp.write('\n\n')
439 fp.write('\n\n')
440 fp.close()
440 fp.close()
441 else:
441 else:
442 if not sendmail:
442 if not sendmail:
443 sendmail = mail.connect(ui)
443 sendmail = mail.connect(ui)
444 ui.status(_('Sending '), subj, ' ...\n')
444 ui.status(_('Sending '), subj, ' ...\n')
445 # Exim does not remove the Bcc field
445 # Exim does not remove the Bcc field
446 del m['Bcc']
446 del m['Bcc']
447 fp = cStringIO.StringIO()
447 fp = cStringIO.StringIO()
448 generator = email.Generator.Generator(fp, mangle_from_=False)
448 generator = email.Generator.Generator(fp, mangle_from_=False)
449 generator.flatten(m, 0)
449 generator.flatten(m, 0)
450 sendmail(sender, to + bcc + cc, fp.getvalue())
450 sendmail(sender, to + bcc + cc, fp.getvalue())
451
451
452 emailopts = [
452 emailopts = [
453 ('a', 'attach', None, _('send patches as attachments')),
453 ('a', 'attach', None, _('send patches as attachments')),
454 ('i', 'inline', None, _('send patches as inline attachments')),
454 ('i', 'inline', None, _('send patches as inline attachments')),
455 ('', 'bcc', [], _('email addresses of blind copy recipients')),
455 ('', 'bcc', [], _('email addresses of blind copy recipients')),
456 ('c', 'cc', [], _('email addresses of copy recipients')),
456 ('c', 'cc', [], _('email addresses of copy recipients')),
457 ('d', 'diffstat', None, _('add diffstat output to messages')),
457 ('d', 'diffstat', None, _('add diffstat output to messages')),
458 ('', 'date', '', _('use the given date as the sending date')),
458 ('', 'date', '', _('use the given date as the sending date')),
459 ('', 'desc', '', _('use the given file as the series description')),
459 ('', 'desc', '', _('use the given file as the series description')),
460 ('f', 'from', '', _('email address of sender')),
460 ('f', 'from', '', _('email address of sender')),
461 ('n', 'test', None, _('print messages that would be sent')),
461 ('n', 'test', None, _('print messages that would be sent')),
462 ('m', 'mbox', '',
462 ('m', 'mbox', '',
463 _('write messages to mbox file instead of sending them')),
463 _('write messages to mbox file instead of sending them')),
464 ('s', 'subject', '',
464 ('s', 'subject', '',
465 _('subject of first message (intro or single patch)')),
465 _('subject of first message (intro or single patch)')),
466 ('t', 'to', [], _('email addresses of recipients')),
466 ('t', 'to', [], _('email addresses of recipients')),
467 ]
467 ]
468
468
469
469
470 cmdtable = {
470 cmdtable = {
471 "email":
471 "email":
472 (patchbomb,
472 (patchbomb,
473 [('g', 'git', None, _('use git extended diff format')),
473 [('g', 'git', None, _('use git extended diff format')),
474 ('', 'plain', None, _('omit hg patch header')),
474 ('', 'plain', None, _('omit hg patch header')),
475 ('o', 'outgoing', None,
475 ('o', 'outgoing', None,
476 _('send changes not found in the target repository')),
476 _('send changes not found in the target repository')),
477 ('b', 'bundle', None,
477 ('b', 'bundle', None,
478 _('send changes not in target as a binary bundle')),
478 _('send changes not in target as a binary bundle')),
479 ('r', 'rev', [], _('a revision to send')),
479 ('r', 'rev', [], _('a revision to send')),
480 ('', 'force', None,
480 ('', 'force', None,
481 _('run even when remote repository is unrelated (with -b)')),
481 _('run even when remote repository is unrelated (with -b)')),
482 ('', 'base', [],
482 ('', 'base', [],
483 _('a base changeset to specify instead of a destination (with -b)')),
483 _('a base changeset to specify instead of a destination (with -b)')),
484 ('', 'intro', None,
485 _('send an introduction email for a single patch')),
484 ] + emailopts + commands.remoteopts,
486 ] + emailopts + commands.remoteopts,
485 _('hg email [OPTION]... [DEST]...'))
487 _('hg email [OPTION]... [DEST]...'))
486 }
488 }
@@ -1,108 +1,116 b''
1 #!/bin/sh
1 #!/bin/sh
2
2
3 fixheaders()
3 fixheaders()
4 {
4 {
5 sed -e 's/\(Message-Id:.*@\).*/\1/' \
5 sed -e 's/\(Message-Id:.*@\).*/\1/' \
6 -e 's/\(In-Reply-To:.*@\).*/\1/' \
6 -e 's/\(In-Reply-To:.*@\).*/\1/' \
7 -e 's/===.*/===/'
7 -e 's/===.*/===/'
8 }
8 }
9
9
10 echo "[extensions]" >> $HGRCPATH
10 echo "[extensions]" >> $HGRCPATH
11 echo "patchbomb=" >> $HGRCPATH
11 echo "patchbomb=" >> $HGRCPATH
12
12
13 hg init t
13 hg init t
14 cd t
14 cd t
15 echo a > a
15 echo a > a
16 hg commit -Ama -d '1 0'
16 hg commit -Ama -d '1 0'
17
17
18 hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar tip | \
18 hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar tip | \
19 fixheaders
19 fixheaders
20
20
21 echo b > b
21 echo b > b
22 hg commit -Amb -d '2 0'
22 hg commit -Amb -d '2 0'
23
23
24 hg email --date '1970-1-1 0:2' -n -f quux -t foo -c bar -s test 0:tip | \
24 hg email --date '1970-1-1 0:2' -n -f quux -t foo -c bar -s test 0:tip | \
25 fixheaders
25 fixheaders
26
26
27 hg email -m test.mbox -f quux -t foo -c bar -s test 0:tip
27 hg email -m test.mbox -f quux -t foo -c bar -s test 0:tip
28
28
29 cd ..
29 cd ..
30
30
31 hg clone -q t t2
31 hg clone -q t t2
32 cd t2
32 cd t2
33 echo c > c
33 echo c > c
34 hg commit -Amc -d '3 0'
34 hg commit -Amc -d '3 0'
35
35
36 cat > description <<EOF
36 cat > description <<EOF
37 a multiline
37 a multiline
38
38
39 description
39 description
40 EOF
40 EOF
41
41
42 echo "% test bundle and description"
42 echo "% test bundle and description"
43 hg email --date '1970-1-1 0:3' -n -f quux -t foo \
43 hg email --date '1970-1-1 0:3' -n -f quux -t foo \
44 -c bar -s test -r tip -b --desc description | \
44 -c bar -s test -r tip -b --desc description | \
45 fixheaders
45 fixheaders
46
46
47 echo "% utf-8 patch"
47 echo "% utf-8 patch"
48 python -c 'fp = open("utf", "wb"); fp.write("h\xC3\xB6mma!\n"); fp.close();'
48 python -c 'fp = open("utf", "wb"); fp.write("h\xC3\xB6mma!\n"); fp.close();'
49 hg commit -A -d '4 0' -m 'charset=utf-8; content-transfer-encoding: base64'
49 hg commit -A -d '4 0' -m 'charset=utf-8; content-transfer-encoding: base64'
50
50
51 echo "% no mime encoding for email --test"
51 echo "% no mime encoding for email --test"
52 hg email --date '1970-1-1 0:4' -f quux -t foo -c bar -r tip -n | fixheaders > mailtest
52 hg email --date '1970-1-1 0:4' -f quux -t foo -c bar -r tip -n | fixheaders > mailtest
53 echo "% md5sum of 8-bit output"
53 echo "% md5sum of 8-bit output"
54 $TESTDIR/md5sum.py mailtest
54 $TESTDIR/md5sum.py mailtest
55 rm mailtest
55 rm mailtest
56
56
57 echo "% mime encoded mbox"
57 echo "% mime encoded mbox"
58 hg email --date '1970-1-1 0:4' -f quux -t foo -c bar -r tip -m mbox
58 hg email --date '1970-1-1 0:4' -f quux -t foo -c bar -r tip -m mbox
59 cat mbox | fixheaders
59 cat mbox | fixheaders
60 rm mbox
60 rm mbox
61
61
62 echo "% iso-8859-1 patch"
62 echo "% iso-8859-1 patch"
63 python -c 'fp = open("isolatin", "wb"); fp.write("h\xF6mma!\n"); fp.close();'
63 python -c 'fp = open("isolatin", "wb"); fp.write("h\xF6mma!\n"); fp.close();'
64 hg commit -A -d '5 0' -m 'charset=us-ascii; content-transfer-encoding: 8bit'
64 hg commit -A -d '5 0' -m 'charset=us-ascii; content-transfer-encoding: 8bit'
65
65
66 echo "% fake ascii mbox"
66 echo "% fake ascii mbox"
67 hg email --date '1970-1-1 0:5' -f quux -t foo -c bar -r tip -m mbox
67 hg email --date '1970-1-1 0:5' -f quux -t foo -c bar -r tip -m mbox
68 fixheaders < mbox > mboxfix
68 fixheaders < mbox > mboxfix
69 echo "% md5sum of 8-bit output"
69 echo "% md5sum of 8-bit output"
70 $TESTDIR/md5sum.py mboxfix
70 $TESTDIR/md5sum.py mboxfix
71
71
72 echo "% test diffstat for single patch"
72 echo "% test diffstat for single patch"
73 hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -d -y 2 | \
73 hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -d -y 2 | \
74 fixheaders
74 fixheaders
75
75
76 echo "% test diffstat for multiple patches"
76 echo "% test diffstat for multiple patches"
77 hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -d -y 0:1 | \
77 hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -d -y 0:1 | \
78 fixheaders
78 fixheaders
79
79
80 echo "% test inline for single patch"
80 echo "% test inline for single patch"
81 hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -i 2 | \
81 hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -i 2 | \
82 fixheaders
82 fixheaders
83
83
84 echo "% test inline for multiple patches"
84 echo "% test inline for multiple patches"
85 hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -i 0:1 | \
85 hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -i 0:1 | \
86 fixheaders
86 fixheaders
87
87
88 echo "% test attach for single patch"
88 echo "% test attach for single patch"
89 hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -a 2 | \
89 hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -a 2 | \
90 fixheaders
90 fixheaders
91
91
92 echo "% test attach for multiple patches"
92 echo "% test attach for multiple patches"
93 hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -a 0:1 | \
93 hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -a 0:1 | \
94 fixheaders
94 fixheaders
95
95
96 echo "% test intro for single patch"
97 hg email --date '1970-1-1 0:1' -n --intro -f quux -t foo -c bar -s test 2 | \
98 fixheaders
99
100 echo "% test intro for multiple patches"
101 hg email --date '1970-1-1 0:1' -n --intro -f quux -t foo -c bar -s test 0:1 | \
102 fixheaders
103
96 echo "% tagging csets"
104 echo "% tagging csets"
97 hg tag -r0 zero zero.foo
105 hg tag -r0 zero zero.foo
98 hg tag -r1 one one.patch
106 hg tag -r1 one one.patch
99 hg tag -r2 two two.diff
107 hg tag -r2 two two.diff
100
108
101 echo "% test inline for single named patch"
109 echo "% test inline for single named patch"
102 hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -i 2 | \
110 hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -i 2 | \
103 fixheaders
111 fixheaders
104
112
105 echo "% test inline for multiple named/unnamed patches"
113 echo "% test inline for multiple named/unnamed patches"
106 hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -i 0:1 | \
114 hg email --date '1970-1-1 0:1' -n -f quux -t foo -c bar -s test -i 0:1 | \
107 fixheaders
115 fixheaders
108
116
@@ -1,700 +1,816 b''
1 adding a
1 adding a
2 This patch series consists of 1 patches.
2 This patch series consists of 1 patches.
3
3
4
4
5 Displaying [PATCH] a ...
5 Displaying [PATCH] a ...
6 Content-Type: text/plain; charset="us-ascii"
6 Content-Type: text/plain; charset="us-ascii"
7 MIME-Version: 1.0
7 MIME-Version: 1.0
8 Content-Transfer-Encoding: 7bit
8 Content-Transfer-Encoding: 7bit
9 Subject: [PATCH] a
9 Subject: [PATCH] a
10 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
10 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
11 Message-Id: <8580ff50825a50c8f716.60@
11 Message-Id: <8580ff50825a50c8f716.60@
12 Date: Thu, 01 Jan 1970 00:01:00 +0000
12 Date: Thu, 01 Jan 1970 00:01:00 +0000
13 From: quux
13 From: quux
14 To: foo
14 To: foo
15 Cc: bar
15 Cc: bar
16
16
17 # HG changeset patch
17 # HG changeset patch
18 # User test
18 # User test
19 # Date 1 0
19 # Date 1 0
20 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
20 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
21 # Parent 0000000000000000000000000000000000000000
21 # Parent 0000000000000000000000000000000000000000
22 a
22 a
23
23
24 diff -r 000000000000 -r 8580ff50825a a
24 diff -r 000000000000 -r 8580ff50825a a
25 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
25 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
26 +++ b/a Thu Jan 01 00:00:01 1970 +0000
26 +++ b/a Thu Jan 01 00:00:01 1970 +0000
27 @@ -0,0 +1,1 @@
27 @@ -0,0 +1,1 @@
28 +a
28 +a
29
29
30 adding b
30 adding b
31 This patch series consists of 2 patches.
31 This patch series consists of 2 patches.
32
32
33
33
34 Write the introductory message for the patch series.
34 Write the introductory message for the patch series.
35
35
36
36
37 Displaying [PATCH 0 of 2] test ...
37 Displaying [PATCH 0 of 2] test ...
38 Content-Type: text/plain; charset="us-ascii"
38 Content-Type: text/plain; charset="us-ascii"
39 MIME-Version: 1.0
39 MIME-Version: 1.0
40 Content-Transfer-Encoding: 7bit
40 Content-Transfer-Encoding: 7bit
41 Subject: [PATCH 0 of 2] test
41 Subject: [PATCH 0 of 2] test
42 Message-Id: <patchbomb.120@
42 Message-Id: <patchbomb.120@
43 Date: Thu, 01 Jan 1970 00:02:00 +0000
43 Date: Thu, 01 Jan 1970 00:02:00 +0000
44 From: quux
44 From: quux
45 To: foo
45 To: foo
46 Cc: bar
46 Cc: bar
47
47
48
48
49 Displaying [PATCH 1 of 2] a ...
49 Displaying [PATCH 1 of 2] a ...
50 Content-Type: text/plain; charset="us-ascii"
50 Content-Type: text/plain; charset="us-ascii"
51 MIME-Version: 1.0
51 MIME-Version: 1.0
52 Content-Transfer-Encoding: 7bit
52 Content-Transfer-Encoding: 7bit
53 Subject: [PATCH 1 of 2] a
53 Subject: [PATCH 1 of 2] a
54 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
54 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
55 Message-Id: <8580ff50825a50c8f716.121@
55 Message-Id: <8580ff50825a50c8f716.121@
56 In-Reply-To: <patchbomb.120@
56 In-Reply-To: <patchbomb.120@
57 Date: Thu, 01 Jan 1970 00:02:01 +0000
57 Date: Thu, 01 Jan 1970 00:02:01 +0000
58 From: quux
58 From: quux
59 To: foo
59 To: foo
60 Cc: bar
60 Cc: bar
61
61
62 # HG changeset patch
62 # HG changeset patch
63 # User test
63 # User test
64 # Date 1 0
64 # Date 1 0
65 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
65 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
66 # Parent 0000000000000000000000000000000000000000
66 # Parent 0000000000000000000000000000000000000000
67 a
67 a
68
68
69 diff -r 000000000000 -r 8580ff50825a a
69 diff -r 000000000000 -r 8580ff50825a a
70 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
70 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
71 +++ b/a Thu Jan 01 00:00:01 1970 +0000
71 +++ b/a Thu Jan 01 00:00:01 1970 +0000
72 @@ -0,0 +1,1 @@
72 @@ -0,0 +1,1 @@
73 +a
73 +a
74
74
75 Displaying [PATCH 2 of 2] b ...
75 Displaying [PATCH 2 of 2] b ...
76 Content-Type: text/plain; charset="us-ascii"
76 Content-Type: text/plain; charset="us-ascii"
77 MIME-Version: 1.0
77 MIME-Version: 1.0
78 Content-Transfer-Encoding: 7bit
78 Content-Transfer-Encoding: 7bit
79 Subject: [PATCH 2 of 2] b
79 Subject: [PATCH 2 of 2] b
80 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
80 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
81 Message-Id: <97d72e5f12c7e84f8506.122@
81 Message-Id: <97d72e5f12c7e84f8506.122@
82 In-Reply-To: <patchbomb.120@
82 In-Reply-To: <patchbomb.120@
83 Date: Thu, 01 Jan 1970 00:02:02 +0000
83 Date: Thu, 01 Jan 1970 00:02:02 +0000
84 From: quux
84 From: quux
85 To: foo
85 To: foo
86 Cc: bar
86 Cc: bar
87
87
88 # HG changeset patch
88 # HG changeset patch
89 # User test
89 # User test
90 # Date 2 0
90 # Date 2 0
91 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
91 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
92 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
92 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
93 b
93 b
94
94
95 diff -r 8580ff50825a -r 97d72e5f12c7 b
95 diff -r 8580ff50825a -r 97d72e5f12c7 b
96 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
96 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
97 +++ b/b Thu Jan 01 00:00:02 1970 +0000
97 +++ b/b Thu Jan 01 00:00:02 1970 +0000
98 @@ -0,0 +1,1 @@
98 @@ -0,0 +1,1 @@
99 +b
99 +b
100
100
101 This patch series consists of 2 patches.
101 This patch series consists of 2 patches.
102
102
103
103
104 Write the introductory message for the patch series.
104 Write the introductory message for the patch series.
105
105
106
106
107 Writing [PATCH 0 of 2] test ...
107 Writing [PATCH 0 of 2] test ...
108 Writing [PATCH 1 of 2] a ...
108 Writing [PATCH 1 of 2] a ...
109 Writing [PATCH 2 of 2] b ...
109 Writing [PATCH 2 of 2] b ...
110 adding c
110 adding c
111 % test bundle and description
111 % test bundle and description
112 searching for changes
112 searching for changes
113 1 changesets found
113 1 changesets found
114
114
115 Displaying test ...
115 Displaying test ...
116 Content-Type: multipart/mixed; boundary="===
116 Content-Type: multipart/mixed; boundary="===
117 MIME-Version: 1.0
117 MIME-Version: 1.0
118 Subject: test
118 Subject: test
119 Message-Id: <patchbomb.180@
119 Message-Id: <patchbomb.180@
120 Date: Thu, 01 Jan 1970 00:03:00 +0000
120 Date: Thu, 01 Jan 1970 00:03:00 +0000
121 From: quux
121 From: quux
122 To: foo
122 To: foo
123 Cc: bar
123 Cc: bar
124
124
125 --===
125 --===
126 Content-Type: text/plain; charset="us-ascii"
126 Content-Type: text/plain; charset="us-ascii"
127 MIME-Version: 1.0
127 MIME-Version: 1.0
128 Content-Transfer-Encoding: 7bit
128 Content-Transfer-Encoding: 7bit
129
129
130 a multiline
130 a multiline
131
131
132 description
132 description
133
133
134 --===
134 --===
135 Content-Type: application/x-mercurial-bundle
135 Content-Type: application/x-mercurial-bundle
136 MIME-Version: 1.0
136 MIME-Version: 1.0
137 Content-Disposition: attachment; filename="bundle.hg"
137 Content-Disposition: attachment; filename="bundle.hg"
138 Content-Transfer-Encoding: base64
138 Content-Transfer-Encoding: base64
139
139
140 SEcxMEJaaDkxQVkmU1nvR7I3AAAN////lFYQWj1/4HwRkdC/AywIAk0E4pfoSIIIgQCgGEQOcLAA
140 SEcxMEJaaDkxQVkmU1nvR7I3AAAN////lFYQWj1/4HwRkdC/AywIAk0E4pfoSIIIgQCgGEQOcLAA
141 2tA1VPyp4mkeoG0EaaPU0GTT1GjRiNPIg9CZGBqZ6UbU9J+KFU09DNUaGgAAAAAANAGgAAAAA1U8
141 2tA1VPyp4mkeoG0EaaPU0GTT1GjRiNPIg9CZGBqZ6UbU9J+KFU09DNUaGgAAAAAANAGgAAAAA1U8
142 oGgAADQGgAANNANAAAAAAZipFLz3XoakCEQB3PVPyHJVi1iYkAAKQAZQGpQGZESInRnCFMqLDla2
142 oGgAADQGgAANNANAAAAAAZipFLz3XoakCEQB3PVPyHJVi1iYkAAKQAZQGpQGZESInRnCFMqLDla2
143 Bx3qfRQeA2N4lnzKkAmP8kR2asievLLXXebVU8Vg4iEBqcJNJAxIapSU6SM4888ZAciRG6MYAIEE
143 Bx3qfRQeA2N4lnzKkAmP8kR2asievLLXXebVU8Vg4iEBqcJNJAxIapSU6SM4888ZAciRG6MYAIEE
144 SlIBpFisgGkyRjX//TMtfcUAEsGu56+YnE1OlTZmzKm8BSu2rvo4rHAYYaadIFFuTy0LYgIkgLVD
144 SlIBpFisgGkyRjX//TMtfcUAEsGu56+YnE1OlTZmzKm8BSu2rvo4rHAYYaadIFFuTy0LYgIkgLVD
145 sgVa2F19D1tx9+hgbAygLgQwaIqcDdgA4BjQgIiz/AEP72++llgDKhKducqodGE4B0ETqF3JFOFC
145 sgVa2F19D1tx9+hgbAygLgQwaIqcDdgA4BjQgIiz/AEP72++llgDKhKducqodGE4B0ETqF3JFOFC
146 Q70eyNw=
146 Q70eyNw=
147 --===
147 --===
148 % utf-8 patch
148 % utf-8 patch
149 adding description
149 adding description
150 adding utf
150 adding utf
151 % no mime encoding for email --test
151 % no mime encoding for email --test
152 % md5sum of 8-bit output
152 % md5sum of 8-bit output
153 ad877786716d09fd7843cf0ed5e3d2a8 mailtest
153 ad877786716d09fd7843cf0ed5e3d2a8 mailtest
154 % mime encoded mbox
154 % mime encoded mbox
155 This patch series consists of 1 patches.
155 This patch series consists of 1 patches.
156
156
157
157
158 Writing [PATCH] charset=utf-8; content-transfer-encoding: base64 ...
158 Writing [PATCH] charset=utf-8; content-transfer-encoding: base64 ...
159 From quux Thu Jan 01 00:04:01 1970
159 From quux Thu Jan 01 00:04:01 1970
160 Content-Type: text/plain; charset="utf-8"
160 Content-Type: text/plain; charset="utf-8"
161 MIME-Version: 1.0
161 MIME-Version: 1.0
162 Content-Transfer-Encoding: base64
162 Content-Transfer-Encoding: base64
163 Subject: [PATCH] charset=utf-8; content-transfer-encoding: base64
163 Subject: [PATCH] charset=utf-8; content-transfer-encoding: base64
164 X-Mercurial-Node: c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
164 X-Mercurial-Node: c3c9e37db9f4fe4882cda39baf42fed6bad8b15a
165 Message-Id: <c3c9e37db9f4fe4882cd.240@
165 Message-Id: <c3c9e37db9f4fe4882cd.240@
166 Date: Thu, 01 Jan 1970 00:04:00 +0000
166 Date: Thu, 01 Jan 1970 00:04:00 +0000
167 From: quux
167 From: quux
168 To: foo
168 To: foo
169 Cc: bar
169 Cc: bar
170
170
171 IyBIRyBjaGFuZ2VzZXQgcGF0Y2gKIyBVc2VyIHRlc3QKIyBEYXRlIDQgMAojIE5vZGUgSUQgYzNj
171 IyBIRyBjaGFuZ2VzZXQgcGF0Y2gKIyBVc2VyIHRlc3QKIyBEYXRlIDQgMAojIE5vZGUgSUQgYzNj
172 OWUzN2RiOWY0ZmU0ODgyY2RhMzliYWY0MmZlZDZiYWQ4YjE1YQojIFBhcmVudCAgZmYyYzlmYTIw
172 OWUzN2RiOWY0ZmU0ODgyY2RhMzliYWY0MmZlZDZiYWQ4YjE1YQojIFBhcmVudCAgZmYyYzlmYTIw
173 MThiMTVmYTc0YjMzMzYzYmRhOTUyNzMyM2UyYTk5ZgpjaGFyc2V0PXV0Zi04OyBjb250ZW50LXRy
173 MThiMTVmYTc0YjMzMzYzYmRhOTUyNzMyM2UyYTk5ZgpjaGFyc2V0PXV0Zi04OyBjb250ZW50LXRy
174 YW5zZmVyLWVuY29kaW5nOiBiYXNlNjQKCmRpZmYgLXIgZmYyYzlmYTIwMThiIC1yIGMzYzllMzdk
174 YW5zZmVyLWVuY29kaW5nOiBiYXNlNjQKCmRpZmYgLXIgZmYyYzlmYTIwMThiIC1yIGMzYzllMzdk
175 YjlmNCBkZXNjcmlwdGlvbgotLS0gL2Rldi9udWxsCVRodSBKYW4gMDEgMDA6MDA6MDAgMTk3MCAr
175 YjlmNCBkZXNjcmlwdGlvbgotLS0gL2Rldi9udWxsCVRodSBKYW4gMDEgMDA6MDA6MDAgMTk3MCAr
176 MDAwMAorKysgYi9kZXNjcmlwdGlvbglUaHUgSmFuIDAxIDAwOjAwOjA0IDE5NzAgKzAwMDAKQEAg
176 MDAwMAorKysgYi9kZXNjcmlwdGlvbglUaHUgSmFuIDAxIDAwOjAwOjA0IDE5NzAgKzAwMDAKQEAg
177 LTAsMCArMSwzIEBACithIG11bHRpbGluZQorCitkZXNjcmlwdGlvbgpkaWZmIC1yIGZmMmM5ZmEy
177 LTAsMCArMSwzIEBACithIG11bHRpbGluZQorCitkZXNjcmlwdGlvbgpkaWZmIC1yIGZmMmM5ZmEy
178 MDE4YiAtciBjM2M5ZTM3ZGI5ZjQgdXRmCi0tLSAvZGV2L251bGwJVGh1IEphbiAwMSAwMDowMDow
178 MDE4YiAtciBjM2M5ZTM3ZGI5ZjQgdXRmCi0tLSAvZGV2L251bGwJVGh1IEphbiAwMSAwMDowMDow
179 MCAxOTcwICswMDAwCisrKyBiL3V0ZglUaHUgSmFuIDAxIDAwOjAwOjA0IDE5NzAgKzAwMDAKQEAg
179 MCAxOTcwICswMDAwCisrKyBiL3V0ZglUaHUgSmFuIDAxIDAwOjAwOjA0IDE5NzAgKzAwMDAKQEAg
180 LTAsMCArMSwxIEBACitow7ZtbWEhCg==
180 LTAsMCArMSwxIEBACitow7ZtbWEhCg==
181
181
182
182
183 % iso-8859-1 patch
183 % iso-8859-1 patch
184 adding isolatin
184 adding isolatin
185 % fake ascii mbox
185 % fake ascii mbox
186 This patch series consists of 1 patches.
186 This patch series consists of 1 patches.
187
187
188
188
189 Writing [PATCH] charset=us-ascii; content-transfer-encoding: 8bit ...
189 Writing [PATCH] charset=us-ascii; content-transfer-encoding: 8bit ...
190 % md5sum of 8-bit output
190 % md5sum of 8-bit output
191 90fae277a4a85255e8262174fcefb59f mboxfix
191 90fae277a4a85255e8262174fcefb59f mboxfix
192 % test diffstat for single patch
192 % test diffstat for single patch
193 This patch series consists of 1 patches.
193 This patch series consists of 1 patches.
194
194
195 c
195 c
196
196
197 files patched: 1
197 files patched: 1
198
198
199
199
200 Displaying [PATCH] test ...
200 Displaying [PATCH] test ...
201 Content-Type: text/plain; charset="us-ascii"
201 Content-Type: text/plain; charset="us-ascii"
202 MIME-Version: 1.0
202 MIME-Version: 1.0
203 Content-Transfer-Encoding: 7bit
203 Content-Transfer-Encoding: 7bit
204 Subject: [PATCH] test
204 Subject: [PATCH] test
205 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
205 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
206 Message-Id: <ff2c9fa2018b15fa74b3.60@
206 Message-Id: <ff2c9fa2018b15fa74b3.60@
207 Date: Thu, 01 Jan 1970 00:01:00 +0000
207 Date: Thu, 01 Jan 1970 00:01:00 +0000
208 From: quux
208 From: quux
209 To: foo
209 To: foo
210 Cc: bar
210 Cc: bar
211
211
212 files patched: 1
212 files patched: 1
213
213
214
214
215 # HG changeset patch
215 # HG changeset patch
216 # User test
216 # User test
217 # Date 3 0
217 # Date 3 0
218 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
218 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
219 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
219 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
220 c
220 c
221
221
222 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
222 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
223 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
223 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
224 +++ b/c Thu Jan 01 00:00:03 1970 +0000
224 +++ b/c Thu Jan 01 00:00:03 1970 +0000
225 @@ -0,0 +1,1 @@
225 @@ -0,0 +1,1 @@
226 +c
226 +c
227
227
228 % test diffstat for multiple patches
228 % test diffstat for multiple patches
229 This patch series consists of 2 patches.
229 This patch series consists of 2 patches.
230
230
231 a
231 a
232
232
233 files patched: 1
233 files patched: 1
234
234
235 b
235 b
236
236
237 files patched: 1
237 files patched: 1
238
238
239 Final summary:
239 Final summary:
240
240
241 files patched: 2
241 files patched: 2
242
242
243
243
244 Write the introductory message for the patch series.
244 Write the introductory message for the patch series.
245
245
246
246
247 Displaying [PATCH 0 of 2] test ...
247 Displaying [PATCH 0 of 2] test ...
248 Content-Type: text/plain; charset="us-ascii"
248 Content-Type: text/plain; charset="us-ascii"
249 MIME-Version: 1.0
249 MIME-Version: 1.0
250 Content-Transfer-Encoding: 7bit
250 Content-Transfer-Encoding: 7bit
251 Subject: [PATCH 0 of 2] test
251 Subject: [PATCH 0 of 2] test
252 Message-Id: <patchbomb.60@
252 Message-Id: <patchbomb.60@
253 Date: Thu, 01 Jan 1970 00:01:00 +0000
253 Date: Thu, 01 Jan 1970 00:01:00 +0000
254 From: quux
254 From: quux
255 To: foo
255 To: foo
256 Cc: bar
256 Cc: bar
257
257
258
258
259 files patched: 2
259 files patched: 2
260
260
261 Displaying [PATCH 1 of 2] a ...
261 Displaying [PATCH 1 of 2] a ...
262 Content-Type: text/plain; charset="us-ascii"
262 Content-Type: text/plain; charset="us-ascii"
263 MIME-Version: 1.0
263 MIME-Version: 1.0
264 Content-Transfer-Encoding: 7bit
264 Content-Transfer-Encoding: 7bit
265 Subject: [PATCH 1 of 2] a
265 Subject: [PATCH 1 of 2] a
266 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
266 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
267 Message-Id: <8580ff50825a50c8f716.61@
267 Message-Id: <8580ff50825a50c8f716.61@
268 In-Reply-To: <patchbomb.60@
268 In-Reply-To: <patchbomb.60@
269 Date: Thu, 01 Jan 1970 00:01:01 +0000
269 Date: Thu, 01 Jan 1970 00:01:01 +0000
270 From: quux
270 From: quux
271 To: foo
271 To: foo
272 Cc: bar
272 Cc: bar
273
273
274 files patched: 1
274 files patched: 1
275
275
276
276
277 # HG changeset patch
277 # HG changeset patch
278 # User test
278 # User test
279 # Date 1 0
279 # Date 1 0
280 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
280 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
281 # Parent 0000000000000000000000000000000000000000
281 # Parent 0000000000000000000000000000000000000000
282 a
282 a
283
283
284 diff -r 000000000000 -r 8580ff50825a a
284 diff -r 000000000000 -r 8580ff50825a a
285 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
285 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
286 +++ b/a Thu Jan 01 00:00:01 1970 +0000
286 +++ b/a Thu Jan 01 00:00:01 1970 +0000
287 @@ -0,0 +1,1 @@
287 @@ -0,0 +1,1 @@
288 +a
288 +a
289
289
290 Displaying [PATCH 2 of 2] b ...
290 Displaying [PATCH 2 of 2] b ...
291 Content-Type: text/plain; charset="us-ascii"
291 Content-Type: text/plain; charset="us-ascii"
292 MIME-Version: 1.0
292 MIME-Version: 1.0
293 Content-Transfer-Encoding: 7bit
293 Content-Transfer-Encoding: 7bit
294 Subject: [PATCH 2 of 2] b
294 Subject: [PATCH 2 of 2] b
295 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
295 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
296 Message-Id: <97d72e5f12c7e84f8506.62@
296 Message-Id: <97d72e5f12c7e84f8506.62@
297 In-Reply-To: <patchbomb.60@
297 In-Reply-To: <patchbomb.60@
298 Date: Thu, 01 Jan 1970 00:01:02 +0000
298 Date: Thu, 01 Jan 1970 00:01:02 +0000
299 From: quux
299 From: quux
300 To: foo
300 To: foo
301 Cc: bar
301 Cc: bar
302
302
303 files patched: 1
303 files patched: 1
304
304
305
305
306 # HG changeset patch
306 # HG changeset patch
307 # User test
307 # User test
308 # Date 2 0
308 # Date 2 0
309 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
309 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
310 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
310 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
311 b
311 b
312
312
313 diff -r 8580ff50825a -r 97d72e5f12c7 b
313 diff -r 8580ff50825a -r 97d72e5f12c7 b
314 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
314 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
315 +++ b/b Thu Jan 01 00:00:02 1970 +0000
315 +++ b/b Thu Jan 01 00:00:02 1970 +0000
316 @@ -0,0 +1,1 @@
316 @@ -0,0 +1,1 @@
317 +b
317 +b
318
318
319 % test inline for single patch
319 % test inline for single patch
320 This patch series consists of 1 patches.
320 This patch series consists of 1 patches.
321
321
322
322
323 Displaying [PATCH] test ...
323 Displaying [PATCH] test ...
324 Content-Type: multipart/mixed; boundary="===
324 Content-Type: multipart/mixed; boundary="===
325 MIME-Version: 1.0
325 MIME-Version: 1.0
326 Subject: [PATCH] test
326 Subject: [PATCH] test
327 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
327 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
328 Message-Id: <ff2c9fa2018b15fa74b3.60@
328 Message-Id: <ff2c9fa2018b15fa74b3.60@
329 Date: Thu, 01 Jan 1970 00:01:00 +0000
329 Date: Thu, 01 Jan 1970 00:01:00 +0000
330 From: quux
330 From: quux
331 To: foo
331 To: foo
332 Cc: bar
332 Cc: bar
333
333
334 --===
334 --===
335 Content-Type: text/x-patch; charset="us-ascii"
335 Content-Type: text/x-patch; charset="us-ascii"
336 MIME-Version: 1.0
336 MIME-Version: 1.0
337 Content-Transfer-Encoding: 7bit
337 Content-Transfer-Encoding: 7bit
338 Content-Disposition: inline; filename=t2.patch
338 Content-Disposition: inline; filename=t2.patch
339
339
340 # HG changeset patch
340 # HG changeset patch
341 # User test
341 # User test
342 # Date 3 0
342 # Date 3 0
343 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
343 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
344 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
344 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
345 c
345 c
346
346
347 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
347 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
348 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
348 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
349 +++ b/c Thu Jan 01 00:00:03 1970 +0000
349 +++ b/c Thu Jan 01 00:00:03 1970 +0000
350 @@ -0,0 +1,1 @@
350 @@ -0,0 +1,1 @@
351 +c
351 +c
352
352
353 --===
353 --===
354 % test inline for multiple patches
354 % test inline for multiple patches
355 This patch series consists of 2 patches.
355 This patch series consists of 2 patches.
356
356
357
357
358 Write the introductory message for the patch series.
358 Write the introductory message for the patch series.
359
359
360
360
361 Displaying [PATCH 0 of 2] test ...
361 Displaying [PATCH 0 of 2] test ...
362 Content-Type: text/plain; charset="us-ascii"
362 Content-Type: text/plain; charset="us-ascii"
363 MIME-Version: 1.0
363 MIME-Version: 1.0
364 Content-Transfer-Encoding: 7bit
364 Content-Transfer-Encoding: 7bit
365 Subject: [PATCH 0 of 2] test
365 Subject: [PATCH 0 of 2] test
366 Message-Id: <patchbomb.60@
366 Message-Id: <patchbomb.60@
367 Date: Thu, 01 Jan 1970 00:01:00 +0000
367 Date: Thu, 01 Jan 1970 00:01:00 +0000
368 From: quux
368 From: quux
369 To: foo
369 To: foo
370 Cc: bar
370 Cc: bar
371
371
372
372
373 Displaying [PATCH 1 of 2] a ...
373 Displaying [PATCH 1 of 2] a ...
374 Content-Type: multipart/mixed; boundary="===
374 Content-Type: multipart/mixed; boundary="===
375 MIME-Version: 1.0
375 MIME-Version: 1.0
376 Subject: [PATCH 1 of 2] a
376 Subject: [PATCH 1 of 2] a
377 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
377 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
378 Message-Id: <8580ff50825a50c8f716.61@
378 Message-Id: <8580ff50825a50c8f716.61@
379 In-Reply-To: <patchbomb.60@
379 In-Reply-To: <patchbomb.60@
380 Date: Thu, 01 Jan 1970 00:01:01 +0000
380 Date: Thu, 01 Jan 1970 00:01:01 +0000
381 From: quux
381 From: quux
382 To: foo
382 To: foo
383 Cc: bar
383 Cc: bar
384
384
385 --===
385 --===
386 Content-Type: text/x-patch; charset="us-ascii"
386 Content-Type: text/x-patch; charset="us-ascii"
387 MIME-Version: 1.0
387 MIME-Version: 1.0
388 Content-Transfer-Encoding: 7bit
388 Content-Transfer-Encoding: 7bit
389 Content-Disposition: inline; filename=t2-1.patch
389 Content-Disposition: inline; filename=t2-1.patch
390
390
391 # HG changeset patch
391 # HG changeset patch
392 # User test
392 # User test
393 # Date 1 0
393 # Date 1 0
394 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
394 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
395 # Parent 0000000000000000000000000000000000000000
395 # Parent 0000000000000000000000000000000000000000
396 a
396 a
397
397
398 diff -r 000000000000 -r 8580ff50825a a
398 diff -r 000000000000 -r 8580ff50825a a
399 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
399 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
400 +++ b/a Thu Jan 01 00:00:01 1970 +0000
400 +++ b/a Thu Jan 01 00:00:01 1970 +0000
401 @@ -0,0 +1,1 @@
401 @@ -0,0 +1,1 @@
402 +a
402 +a
403
403
404 --===
404 --===
405 Displaying [PATCH 2 of 2] b ...
405 Displaying [PATCH 2 of 2] b ...
406 Content-Type: multipart/mixed; boundary="===
406 Content-Type: multipart/mixed; boundary="===
407 MIME-Version: 1.0
407 MIME-Version: 1.0
408 Subject: [PATCH 2 of 2] b
408 Subject: [PATCH 2 of 2] b
409 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
409 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
410 Message-Id: <97d72e5f12c7e84f8506.62@
410 Message-Id: <97d72e5f12c7e84f8506.62@
411 In-Reply-To: <patchbomb.60@
411 In-Reply-To: <patchbomb.60@
412 Date: Thu, 01 Jan 1970 00:01:02 +0000
412 Date: Thu, 01 Jan 1970 00:01:02 +0000
413 From: quux
413 From: quux
414 To: foo
414 To: foo
415 Cc: bar
415 Cc: bar
416
416
417 --===
417 --===
418 Content-Type: text/x-patch; charset="us-ascii"
418 Content-Type: text/x-patch; charset="us-ascii"
419 MIME-Version: 1.0
419 MIME-Version: 1.0
420 Content-Transfer-Encoding: 7bit
420 Content-Transfer-Encoding: 7bit
421 Content-Disposition: inline; filename=t2-2.patch
421 Content-Disposition: inline; filename=t2-2.patch
422
422
423 # HG changeset patch
423 # HG changeset patch
424 # User test
424 # User test
425 # Date 2 0
425 # Date 2 0
426 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
426 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
427 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
427 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
428 b
428 b
429
429
430 diff -r 8580ff50825a -r 97d72e5f12c7 b
430 diff -r 8580ff50825a -r 97d72e5f12c7 b
431 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
431 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
432 +++ b/b Thu Jan 01 00:00:02 1970 +0000
432 +++ b/b Thu Jan 01 00:00:02 1970 +0000
433 @@ -0,0 +1,1 @@
433 @@ -0,0 +1,1 @@
434 +b
434 +b
435
435
436 --===
436 --===
437 % test attach for single patch
437 % test attach for single patch
438 This patch series consists of 1 patches.
438 This patch series consists of 1 patches.
439
439
440
440
441 Displaying [PATCH] test ...
441 Displaying [PATCH] test ...
442 Content-Type: multipart/mixed; boundary="===
442 Content-Type: multipart/mixed; boundary="===
443 MIME-Version: 1.0
443 MIME-Version: 1.0
444 Subject: [PATCH] test
444 Subject: [PATCH] test
445 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
445 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
446 Message-Id: <ff2c9fa2018b15fa74b3.60@
446 Message-Id: <ff2c9fa2018b15fa74b3.60@
447 Date: Thu, 01 Jan 1970 00:01:00 +0000
447 Date: Thu, 01 Jan 1970 00:01:00 +0000
448 From: quux
448 From: quux
449 To: foo
449 To: foo
450 Cc: bar
450 Cc: bar
451
451
452 --===
452 --===
453 Content-Type: text/plain; charset="us-ascii"
453 Content-Type: text/plain; charset="us-ascii"
454 MIME-Version: 1.0
454 MIME-Version: 1.0
455 Content-Transfer-Encoding: 7bit
455 Content-Transfer-Encoding: 7bit
456
456
457 Patch subject is complete summary.
457 Patch subject is complete summary.
458
458
459
459
460
460
461 --===
461 --===
462 Content-Type: text/x-patch; charset="us-ascii"
462 Content-Type: text/x-patch; charset="us-ascii"
463 MIME-Version: 1.0
463 MIME-Version: 1.0
464 Content-Transfer-Encoding: 7bit
464 Content-Transfer-Encoding: 7bit
465 Content-Disposition: attachment; filename=t2.patch
465 Content-Disposition: attachment; filename=t2.patch
466
466
467 # HG changeset patch
467 # HG changeset patch
468 # User test
468 # User test
469 # Date 3 0
469 # Date 3 0
470 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
470 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
471 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
471 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
472 c
472 c
473
473
474 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
474 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
475 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
475 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
476 +++ b/c Thu Jan 01 00:00:03 1970 +0000
476 +++ b/c Thu Jan 01 00:00:03 1970 +0000
477 @@ -0,0 +1,1 @@
477 @@ -0,0 +1,1 @@
478 +c
478 +c
479
479
480 --===
480 --===
481 % test attach for multiple patches
481 % test attach for multiple patches
482 This patch series consists of 2 patches.
482 This patch series consists of 2 patches.
483
483
484
484
485 Write the introductory message for the patch series.
485 Write the introductory message for the patch series.
486
486
487
487
488 Displaying [PATCH 0 of 2] test ...
488 Displaying [PATCH 0 of 2] test ...
489 Content-Type: text/plain; charset="us-ascii"
489 Content-Type: text/plain; charset="us-ascii"
490 MIME-Version: 1.0
490 MIME-Version: 1.0
491 Content-Transfer-Encoding: 7bit
491 Content-Transfer-Encoding: 7bit
492 Subject: [PATCH 0 of 2] test
492 Subject: [PATCH 0 of 2] test
493 Message-Id: <patchbomb.60@
493 Message-Id: <patchbomb.60@
494 Date: Thu, 01 Jan 1970 00:01:00 +0000
494 Date: Thu, 01 Jan 1970 00:01:00 +0000
495 From: quux
495 From: quux
496 To: foo
496 To: foo
497 Cc: bar
497 Cc: bar
498
498
499
499
500 Displaying [PATCH 1 of 2] a ...
500 Displaying [PATCH 1 of 2] a ...
501 Content-Type: multipart/mixed; boundary="===
501 Content-Type: multipart/mixed; boundary="===
502 MIME-Version: 1.0
502 MIME-Version: 1.0
503 Subject: [PATCH 1 of 2] a
503 Subject: [PATCH 1 of 2] a
504 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
504 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
505 Message-Id: <8580ff50825a50c8f716.61@
505 Message-Id: <8580ff50825a50c8f716.61@
506 In-Reply-To: <patchbomb.60@
506 In-Reply-To: <patchbomb.60@
507 Date: Thu, 01 Jan 1970 00:01:01 +0000
507 Date: Thu, 01 Jan 1970 00:01:01 +0000
508 From: quux
508 From: quux
509 To: foo
509 To: foo
510 Cc: bar
510 Cc: bar
511
511
512 --===
512 --===
513 Content-Type: text/plain; charset="us-ascii"
513 Content-Type: text/plain; charset="us-ascii"
514 MIME-Version: 1.0
514 MIME-Version: 1.0
515 Content-Transfer-Encoding: 7bit
515 Content-Transfer-Encoding: 7bit
516
516
517 Patch subject is complete summary.
517 Patch subject is complete summary.
518
518
519
519
520
520
521 --===
521 --===
522 Content-Type: text/x-patch; charset="us-ascii"
522 Content-Type: text/x-patch; charset="us-ascii"
523 MIME-Version: 1.0
523 MIME-Version: 1.0
524 Content-Transfer-Encoding: 7bit
524 Content-Transfer-Encoding: 7bit
525 Content-Disposition: attachment; filename=t2-1.patch
525 Content-Disposition: attachment; filename=t2-1.patch
526
526
527 # HG changeset patch
527 # HG changeset patch
528 # User test
528 # User test
529 # Date 1 0
529 # Date 1 0
530 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
530 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
531 # Parent 0000000000000000000000000000000000000000
531 # Parent 0000000000000000000000000000000000000000
532 a
532 a
533
533
534 diff -r 000000000000 -r 8580ff50825a a
534 diff -r 000000000000 -r 8580ff50825a a
535 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
535 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
536 +++ b/a Thu Jan 01 00:00:01 1970 +0000
536 +++ b/a Thu Jan 01 00:00:01 1970 +0000
537 @@ -0,0 +1,1 @@
537 @@ -0,0 +1,1 @@
538 +a
538 +a
539
539
540 --===
540 --===
541 Displaying [PATCH 2 of 2] b ...
541 Displaying [PATCH 2 of 2] b ...
542 Content-Type: multipart/mixed; boundary="===
542 Content-Type: multipart/mixed; boundary="===
543 MIME-Version: 1.0
543 MIME-Version: 1.0
544 Subject: [PATCH 2 of 2] b
544 Subject: [PATCH 2 of 2] b
545 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
545 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
546 Message-Id: <97d72e5f12c7e84f8506.62@
546 Message-Id: <97d72e5f12c7e84f8506.62@
547 In-Reply-To: <patchbomb.60@
547 In-Reply-To: <patchbomb.60@
548 Date: Thu, 01 Jan 1970 00:01:02 +0000
548 Date: Thu, 01 Jan 1970 00:01:02 +0000
549 From: quux
549 From: quux
550 To: foo
550 To: foo
551 Cc: bar
551 Cc: bar
552
552
553 --===
553 --===
554 Content-Type: text/plain; charset="us-ascii"
554 Content-Type: text/plain; charset="us-ascii"
555 MIME-Version: 1.0
555 MIME-Version: 1.0
556 Content-Transfer-Encoding: 7bit
556 Content-Transfer-Encoding: 7bit
557
557
558 Patch subject is complete summary.
558 Patch subject is complete summary.
559
559
560
560
561
561
562 --===
562 --===
563 Content-Type: text/x-patch; charset="us-ascii"
563 Content-Type: text/x-patch; charset="us-ascii"
564 MIME-Version: 1.0
564 MIME-Version: 1.0
565 Content-Transfer-Encoding: 7bit
565 Content-Transfer-Encoding: 7bit
566 Content-Disposition: attachment; filename=t2-2.patch
566 Content-Disposition: attachment; filename=t2-2.patch
567
567
568 # HG changeset patch
568 # HG changeset patch
569 # User test
569 # User test
570 # Date 2 0
570 # Date 2 0
571 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
571 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
572 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
572 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
573 b
573 b
574
574
575 diff -r 8580ff50825a -r 97d72e5f12c7 b
575 diff -r 8580ff50825a -r 97d72e5f12c7 b
576 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
576 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
577 +++ b/b Thu Jan 01 00:00:02 1970 +0000
577 +++ b/b Thu Jan 01 00:00:02 1970 +0000
578 @@ -0,0 +1,1 @@
578 @@ -0,0 +1,1 @@
579 +b
579 +b
580
580
581 --===
581 --===
582 % test intro for single patch
583 This patch series consists of 1 patches.
584
585
586 Write the introductory message for the patch series.
587
588
589 Displaying [PATCH 0 of 1] test ...
590 Content-Type: text/plain; charset="us-ascii"
591 MIME-Version: 1.0
592 Content-Transfer-Encoding: 7bit
593 Subject: [PATCH 0 of 1] test
594 Message-Id: <patchbomb.60@
595 Date: Thu, 01 Jan 1970 00:01:00 +0000
596 From: quux
597 To: foo
598 Cc: bar
599
600
601 Displaying [PATCH 1 of 1] c ...
602 Content-Type: text/plain; charset="us-ascii"
603 MIME-Version: 1.0
604 Content-Transfer-Encoding: 7bit
605 Subject: [PATCH 1 of 1] c
606 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
607 Message-Id: <ff2c9fa2018b15fa74b3.61@
608 In-Reply-To: <patchbomb.60@
609 Date: Thu, 01 Jan 1970 00:01:01 +0000
610 From: quux
611 To: foo
612 Cc: bar
613
614 # HG changeset patch
615 # User test
616 # Date 3 0
617 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
618 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
619 c
620
621 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
622 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
623 +++ b/c Thu Jan 01 00:00:03 1970 +0000
624 @@ -0,0 +1,1 @@
625 +c
626
627 % test intro for multiple patches
628 This patch series consists of 2 patches.
629
630
631 Write the introductory message for the patch series.
632
633
634 Displaying [PATCH 0 of 2] test ...
635 Content-Type: text/plain; charset="us-ascii"
636 MIME-Version: 1.0
637 Content-Transfer-Encoding: 7bit
638 Subject: [PATCH 0 of 2] test
639 Message-Id: <patchbomb.60@
640 Date: Thu, 01 Jan 1970 00:01:00 +0000
641 From: quux
642 To: foo
643 Cc: bar
644
645
646 Displaying [PATCH 1 of 2] a ...
647 Content-Type: text/plain; charset="us-ascii"
648 MIME-Version: 1.0
649 Content-Transfer-Encoding: 7bit
650 Subject: [PATCH 1 of 2] a
651 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
652 Message-Id: <8580ff50825a50c8f716.61@
653 In-Reply-To: <patchbomb.60@
654 Date: Thu, 01 Jan 1970 00:01:01 +0000
655 From: quux
656 To: foo
657 Cc: bar
658
659 # HG changeset patch
660 # User test
661 # Date 1 0
662 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
663 # Parent 0000000000000000000000000000000000000000
664 a
665
666 diff -r 000000000000 -r 8580ff50825a a
667 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
668 +++ b/a Thu Jan 01 00:00:01 1970 +0000
669 @@ -0,0 +1,1 @@
670 +a
671
672 Displaying [PATCH 2 of 2] b ...
673 Content-Type: text/plain; charset="us-ascii"
674 MIME-Version: 1.0
675 Content-Transfer-Encoding: 7bit
676 Subject: [PATCH 2 of 2] b
677 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
678 Message-Id: <97d72e5f12c7e84f8506.62@
679 In-Reply-To: <patchbomb.60@
680 Date: Thu, 01 Jan 1970 00:01:02 +0000
681 From: quux
682 To: foo
683 Cc: bar
684
685 # HG changeset patch
686 # User test
687 # Date 2 0
688 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
689 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
690 b
691
692 diff -r 8580ff50825a -r 97d72e5f12c7 b
693 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
694 +++ b/b Thu Jan 01 00:00:02 1970 +0000
695 @@ -0,0 +1,1 @@
696 +b
697
582 % tagging csets
698 % tagging csets
583 % test inline for single named patch
699 % test inline for single named patch
584 This patch series consists of 1 patches.
700 This patch series consists of 1 patches.
585
701
586
702
587 Displaying [PATCH] test ...
703 Displaying [PATCH] test ...
588 Content-Type: multipart/mixed; boundary="===
704 Content-Type: multipart/mixed; boundary="===
589 MIME-Version: 1.0
705 MIME-Version: 1.0
590 Subject: [PATCH] test
706 Subject: [PATCH] test
591 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
707 X-Mercurial-Node: ff2c9fa2018b15fa74b33363bda9527323e2a99f
592 Message-Id: <ff2c9fa2018b15fa74b3.60@
708 Message-Id: <ff2c9fa2018b15fa74b3.60@
593 Date: Thu, 01 Jan 1970 00:01:00 +0000
709 Date: Thu, 01 Jan 1970 00:01:00 +0000
594 From: quux
710 From: quux
595 To: foo
711 To: foo
596 Cc: bar
712 Cc: bar
597
713
598 --===
714 --===
599 Content-Type: text/x-patch; charset="us-ascii"
715 Content-Type: text/x-patch; charset="us-ascii"
600 MIME-Version: 1.0
716 MIME-Version: 1.0
601 Content-Transfer-Encoding: 7bit
717 Content-Transfer-Encoding: 7bit
602 Content-Disposition: inline; filename=two.diff
718 Content-Disposition: inline; filename=two.diff
603
719
604 # HG changeset patch
720 # HG changeset patch
605 # User test
721 # User test
606 # Date 3 0
722 # Date 3 0
607 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
723 # Node ID ff2c9fa2018b15fa74b33363bda9527323e2a99f
608 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
724 # Parent 97d72e5f12c7e84f85064aa72e5a297142c36ed9
609 c
725 c
610
726
611 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
727 diff -r 97d72e5f12c7 -r ff2c9fa2018b c
612 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
728 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
613 +++ b/c Thu Jan 01 00:00:03 1970 +0000
729 +++ b/c Thu Jan 01 00:00:03 1970 +0000
614 @@ -0,0 +1,1 @@
730 @@ -0,0 +1,1 @@
615 +c
731 +c
616
732
617 --===
733 --===
618 % test inline for multiple named/unnamed patches
734 % test inline for multiple named/unnamed patches
619 This patch series consists of 2 patches.
735 This patch series consists of 2 patches.
620
736
621
737
622 Write the introductory message for the patch series.
738 Write the introductory message for the patch series.
623
739
624
740
625 Displaying [PATCH 0 of 2] test ...
741 Displaying [PATCH 0 of 2] test ...
626 Content-Type: text/plain; charset="us-ascii"
742 Content-Type: text/plain; charset="us-ascii"
627 MIME-Version: 1.0
743 MIME-Version: 1.0
628 Content-Transfer-Encoding: 7bit
744 Content-Transfer-Encoding: 7bit
629 Subject: [PATCH 0 of 2] test
745 Subject: [PATCH 0 of 2] test
630 Message-Id: <patchbomb.60@
746 Message-Id: <patchbomb.60@
631 Date: Thu, 01 Jan 1970 00:01:00 +0000
747 Date: Thu, 01 Jan 1970 00:01:00 +0000
632 From: quux
748 From: quux
633 To: foo
749 To: foo
634 Cc: bar
750 Cc: bar
635
751
636
752
637 Displaying [PATCH 1 of 2] a ...
753 Displaying [PATCH 1 of 2] a ...
638 Content-Type: multipart/mixed; boundary="===
754 Content-Type: multipart/mixed; boundary="===
639 MIME-Version: 1.0
755 MIME-Version: 1.0
640 Subject: [PATCH 1 of 2] a
756 Subject: [PATCH 1 of 2] a
641 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
757 X-Mercurial-Node: 8580ff50825a50c8f716709acdf8de0deddcd6ab
642 Message-Id: <8580ff50825a50c8f716.61@
758 Message-Id: <8580ff50825a50c8f716.61@
643 In-Reply-To: <patchbomb.60@
759 In-Reply-To: <patchbomb.60@
644 Date: Thu, 01 Jan 1970 00:01:01 +0000
760 Date: Thu, 01 Jan 1970 00:01:01 +0000
645 From: quux
761 From: quux
646 To: foo
762 To: foo
647 Cc: bar
763 Cc: bar
648
764
649 --===
765 --===
650 Content-Type: text/x-patch; charset="us-ascii"
766 Content-Type: text/x-patch; charset="us-ascii"
651 MIME-Version: 1.0
767 MIME-Version: 1.0
652 Content-Transfer-Encoding: 7bit
768 Content-Transfer-Encoding: 7bit
653 Content-Disposition: inline; filename=t2-1.patch
769 Content-Disposition: inline; filename=t2-1.patch
654
770
655 # HG changeset patch
771 # HG changeset patch
656 # User test
772 # User test
657 # Date 1 0
773 # Date 1 0
658 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
774 # Node ID 8580ff50825a50c8f716709acdf8de0deddcd6ab
659 # Parent 0000000000000000000000000000000000000000
775 # Parent 0000000000000000000000000000000000000000
660 a
776 a
661
777
662 diff -r 000000000000 -r 8580ff50825a a
778 diff -r 000000000000 -r 8580ff50825a a
663 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
779 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
664 +++ b/a Thu Jan 01 00:00:01 1970 +0000
780 +++ b/a Thu Jan 01 00:00:01 1970 +0000
665 @@ -0,0 +1,1 @@
781 @@ -0,0 +1,1 @@
666 +a
782 +a
667
783
668 --===
784 --===
669 Displaying [PATCH 2 of 2] b ...
785 Displaying [PATCH 2 of 2] b ...
670 Content-Type: multipart/mixed; boundary="===
786 Content-Type: multipart/mixed; boundary="===
671 MIME-Version: 1.0
787 MIME-Version: 1.0
672 Subject: [PATCH 2 of 2] b
788 Subject: [PATCH 2 of 2] b
673 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
789 X-Mercurial-Node: 97d72e5f12c7e84f85064aa72e5a297142c36ed9
674 Message-Id: <97d72e5f12c7e84f8506.62@
790 Message-Id: <97d72e5f12c7e84f8506.62@
675 In-Reply-To: <patchbomb.60@
791 In-Reply-To: <patchbomb.60@
676 Date: Thu, 01 Jan 1970 00:01:02 +0000
792 Date: Thu, 01 Jan 1970 00:01:02 +0000
677 From: quux
793 From: quux
678 To: foo
794 To: foo
679 Cc: bar
795 Cc: bar
680
796
681 --===
797 --===
682 Content-Type: text/x-patch; charset="us-ascii"
798 Content-Type: text/x-patch; charset="us-ascii"
683 MIME-Version: 1.0
799 MIME-Version: 1.0
684 Content-Transfer-Encoding: 7bit
800 Content-Transfer-Encoding: 7bit
685 Content-Disposition: inline; filename=one.patch
801 Content-Disposition: inline; filename=one.patch
686
802
687 # HG changeset patch
803 # HG changeset patch
688 # User test
804 # User test
689 # Date 2 0
805 # Date 2 0
690 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
806 # Node ID 97d72e5f12c7e84f85064aa72e5a297142c36ed9
691 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
807 # Parent 8580ff50825a50c8f716709acdf8de0deddcd6ab
692 b
808 b
693
809
694 diff -r 8580ff50825a -r 97d72e5f12c7 b
810 diff -r 8580ff50825a -r 97d72e5f12c7 b
695 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
811 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
696 +++ b/b Thu Jan 01 00:00:02 1970 +0000
812 +++ b/b Thu Jan 01 00:00:02 1970 +0000
697 @@ -0,0 +1,1 @@
813 @@ -0,0 +1,1 @@
698 +b
814 +b
699
815
700 --===
816 --===
General Comments 0
You need to be logged in to leave comments. Login now