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