##// END OF EJS Templates
smtp: verify the certificate of the SMTP server for STARTTLS/SMTPS...
FUJIWARA Katsunori -
r18888:19d48940 default
parent child Browse files
Show More
@@ -1,555 +1,561
1 1 # patchbomb.py - sending Mercurial changesets as patch emails
2 2 #
3 3 # Copyright 2005-2009 Matt Mackall <mpm@selenic.com> and others
4 4 #
5 5 # This software may be used and distributed according to the terms of the
6 6 # GNU General Public License version 2 or any later version.
7 7
8 8 '''command to send changesets as (a series of) patch emails
9 9
10 10 The series is started off with a "[PATCH 0 of N]" introduction, which
11 11 describes the series as a whole.
12 12
13 13 Each patch email has a Subject line of "[PATCH M of N] ...", using the
14 14 first line of the changeset description as the subject text. The
15 15 message contains two or three body parts:
16 16
17 17 - The changeset description.
18 18 - [Optional] The result of running diffstat on the patch.
19 19 - The patch itself, as generated by :hg:`export`.
20 20
21 21 Each message refers to the first in the series using the In-Reply-To
22 22 and References headers, so they will show up as a sequence in threaded
23 23 mail and news readers, and in mail archives.
24 24
25 25 To configure other defaults, add a section like this to your
26 26 configuration file::
27 27
28 28 [email]
29 29 from = My Name <my@email>
30 30 to = recipient1, recipient2, ...
31 31 cc = cc1, cc2, ...
32 32 bcc = bcc1, bcc2, ...
33 33 reply-to = address1, address2, ...
34 34
35 35 Use ``[patchbomb]`` as configuration section name if you need to
36 36 override global ``[email]`` address settings.
37 37
38 38 Then you can use the :hg:`email` command to mail a series of
39 39 changesets as a patchbomb.
40 40
41 41 You can also either configure the method option in the email section
42 42 to be a sendmail compatible mailer or fill out the [smtp] section so
43 43 that the patchbomb extension can automatically send patchbombs
44 44 directly from the commandline. See the [email] and [smtp] sections in
45 45 hgrc(5) for details.
46 46 '''
47 47
48 48 import os, errno, socket, tempfile, cStringIO
49 49 import email.MIMEMultipart, email.MIMEBase
50 50 import email.Utils, email.Encoders, email.Generator
51 51 from mercurial import cmdutil, commands, hg, mail, patch, util
52 52 from mercurial import scmutil
53 53 from mercurial.i18n import _
54 54 from mercurial.node import bin
55 55
56 56 cmdtable = {}
57 57 command = cmdutil.command(cmdtable)
58 58 testedwith = 'internal'
59 59
60 60 def prompt(ui, prompt, default=None, rest=':'):
61 61 if default:
62 62 prompt += ' [%s]' % default
63 63 return ui.prompt(prompt + rest, default)
64 64
65 65 def introwanted(opts, number):
66 66 '''is an introductory message apparently wanted?'''
67 67 return number > 1 or opts.get('intro') or opts.get('desc')
68 68
69 69 def makepatch(ui, repo, patchlines, opts, _charsets, idx, total, numbered,
70 70 patchname=None):
71 71
72 72 desc = []
73 73 node = None
74 74 body = ''
75 75
76 76 for line in patchlines:
77 77 if line.startswith('#'):
78 78 if line.startswith('# Node ID'):
79 79 node = line.split()[-1]
80 80 continue
81 81 if line.startswith('diff -r') or line.startswith('diff --git'):
82 82 break
83 83 desc.append(line)
84 84
85 85 if not patchname and not node:
86 86 raise ValueError
87 87
88 88 if opts.get('attach') and not opts.get('body'):
89 89 body = ('\n'.join(desc[1:]).strip() or
90 90 'Patch subject is complete summary.')
91 91 body += '\n\n\n'
92 92
93 93 if opts.get('plain'):
94 94 while patchlines and patchlines[0].startswith('# '):
95 95 patchlines.pop(0)
96 96 if patchlines:
97 97 patchlines.pop(0)
98 98 while patchlines and not patchlines[0].strip():
99 99 patchlines.pop(0)
100 100
101 101 ds = patch.diffstat(patchlines, git=opts.get('git'))
102 102 if opts.get('diffstat'):
103 103 body += ds + '\n\n'
104 104
105 105 addattachment = opts.get('attach') or opts.get('inline')
106 106 if not addattachment or opts.get('body'):
107 107 body += '\n'.join(patchlines)
108 108
109 109 if addattachment:
110 110 msg = email.MIMEMultipart.MIMEMultipart()
111 111 if body:
112 112 msg.attach(mail.mimeencode(ui, body, _charsets, opts.get('test')))
113 113 p = mail.mimetextpatch('\n'.join(patchlines), 'x-patch',
114 114 opts.get('test'))
115 115 binnode = bin(node)
116 116 # if node is mq patch, it will have the patch file's name as a tag
117 117 if not patchname:
118 118 patchtags = [t for t in repo.nodetags(binnode)
119 119 if t.endswith('.patch') or t.endswith('.diff')]
120 120 if patchtags:
121 121 patchname = patchtags[0]
122 122 elif total > 1:
123 123 patchname = cmdutil.makefilename(repo, '%b-%n.patch',
124 124 binnode, seqno=idx,
125 125 total=total)
126 126 else:
127 127 patchname = cmdutil.makefilename(repo, '%b.patch', binnode)
128 128 disposition = 'inline'
129 129 if opts.get('attach'):
130 130 disposition = 'attachment'
131 131 p['Content-Disposition'] = disposition + '; filename=' + patchname
132 132 msg.attach(p)
133 133 else:
134 134 msg = mail.mimetextpatch(body, display=opts.get('test'))
135 135
136 136 flag = ' '.join(opts.get('flag'))
137 137 if flag:
138 138 flag = ' ' + flag
139 139
140 140 subj = desc[0].strip().rstrip('. ')
141 141 if not numbered:
142 142 subj = '[PATCH%s] %s' % (flag, opts.get('subject') or subj)
143 143 else:
144 144 tlen = len(str(total))
145 145 subj = '[PATCH %0*d of %d%s] %s' % (tlen, idx, total, flag, subj)
146 146 msg['Subject'] = mail.headencode(ui, subj, _charsets, opts.get('test'))
147 147 msg['X-Mercurial-Node'] = node
148 148 return msg, subj, ds
149 149
150 150 emailopts = [
151 151 ('', 'body', None, _('send patches as inline message text (default)')),
152 152 ('a', 'attach', None, _('send patches as attachments')),
153 153 ('i', 'inline', None, _('send patches as inline attachments')),
154 154 ('', 'bcc', [], _('email addresses of blind carbon copy recipients')),
155 155 ('c', 'cc', [], _('email addresses of copy recipients')),
156 156 ('', 'confirm', None, _('ask for confirmation before sending')),
157 157 ('d', 'diffstat', None, _('add diffstat output to messages')),
158 158 ('', 'date', '', _('use the given date as the sending date')),
159 159 ('', 'desc', '', _('use the given file as the series description')),
160 160 ('f', 'from', '', _('email address of sender')),
161 161 ('n', 'test', None, _('print messages that would be sent')),
162 162 ('m', 'mbox', '', _('write messages to mbox file instead of sending them')),
163 163 ('', 'reply-to', [], _('email addresses replies should be sent to')),
164 164 ('s', 'subject', '', _('subject of first message (intro or single patch)')),
165 165 ('', 'in-reply-to', '', _('message identifier to reply to')),
166 166 ('', 'flag', [], _('flags to add in subject prefixes')),
167 167 ('t', 'to', [], _('email addresses of recipients'))]
168 168
169 169 @command('email',
170 170 [('g', 'git', None, _('use git extended diff format')),
171 171 ('', 'plain', None, _('omit hg patch header')),
172 172 ('o', 'outgoing', None,
173 173 _('send changes not found in the target repository')),
174 174 ('b', 'bundle', None, _('send changes not in target as a binary bundle')),
175 175 ('', 'bundlename', 'bundle',
176 176 _('name of the bundle attachment file'), _('NAME')),
177 177 ('r', 'rev', [], _('a revision to send'), _('REV')),
178 178 ('', 'force', None, _('run even when remote repository is unrelated '
179 179 '(with -b/--bundle)')),
180 180 ('', 'base', [], _('a base changeset to specify instead of a destination '
181 181 '(with -b/--bundle)'), _('REV')),
182 182 ('', 'intro', None, _('send an introduction email for a single patch')),
183 183 ] + emailopts + commands.remoteopts,
184 184 _('hg email [OPTION]... [DEST]...'))
185 185 def patchbomb(ui, repo, *revs, **opts):
186 186 '''send changesets by email
187 187
188 188 By default, diffs are sent in the format generated by
189 189 :hg:`export`, one per message. The series starts with a "[PATCH 0
190 190 of N]" introduction, which describes the series as a whole.
191 191
192 192 Each patch email has a Subject line of "[PATCH M of N] ...", using
193 193 the first line of the changeset description as the subject text.
194 194 The message contains two or three parts. First, the changeset
195 195 description.
196 196
197 197 With the -d/--diffstat option, if the diffstat program is
198 198 installed, the result of running diffstat on the patch is inserted.
199 199
200 200 Finally, the patch itself, as generated by :hg:`export`.
201 201
202 202 With the -d/--diffstat or --confirm options, you will be presented
203 203 with a final summary of all messages and asked for confirmation before
204 204 the messages are sent.
205 205
206 206 By default the patch is included as text in the email body for
207 207 easy reviewing. Using the -a/--attach option will instead create
208 208 an attachment for the patch. With -i/--inline an inline attachment
209 209 will be created. You can include a patch both as text in the email
210 210 body and as a regular or an inline attachment by combining the
211 211 -a/--attach or -i/--inline with the --body option.
212 212
213 213 With -o/--outgoing, emails will be generated for patches not found
214 214 in the destination repository (or only those which are ancestors
215 215 of the specified revisions if any are provided)
216 216
217 217 With -b/--bundle, changesets are selected as for --outgoing, but a
218 218 single email containing a binary Mercurial bundle as an attachment
219 219 will be sent.
220 220
221 221 With -m/--mbox, instead of previewing each patchbomb message in a
222 222 pager or sending the messages directly, it will create a UNIX
223 223 mailbox file with the patch emails. This mailbox file can be
224 224 previewed with any mail user agent which supports UNIX mbox
225 225 files.
226 226
227 227 With -n/--test, all steps will run, but mail will not be sent.
228 228 You will be prompted for an email recipient address, a subject and
229 229 an introductory message describing the patches of your patchbomb.
230 230 Then when all is done, patchbomb messages are displayed. If the
231 231 PAGER environment variable is set, your pager will be fired up once
232 232 for each patchbomb message, so you can verify everything is alright.
233 233
234 234 In case email sending fails, you will find a backup of your series
235 235 introductory message in ``.hg/last-email.txt``.
236 236
237 237 Examples::
238 238
239 239 hg email -r 3000 # send patch 3000 only
240 240 hg email -r 3000 -r 3001 # send patches 3000 and 3001
241 241 hg email -r 3000:3005 # send patches 3000 through 3005
242 242 hg email 3000 # send patch 3000 (deprecated)
243 243
244 244 hg email -o # send all patches not in default
245 245 hg email -o DEST # send all patches not in DEST
246 246 hg email -o -r 3000 # send all ancestors of 3000 not in default
247 247 hg email -o -r 3000 DEST # send all ancestors of 3000 not in DEST
248 248
249 249 hg email -b # send bundle of all patches not in default
250 250 hg email -b DEST # send bundle of all patches not in DEST
251 251 hg email -b -r 3000 # bundle of all ancestors of 3000 not in default
252 252 hg email -b -r 3000 DEST # bundle of all ancestors of 3000 not in DEST
253 253
254 254 hg email -o -m mbox && # generate an mbox file...
255 255 mutt -R -f mbox # ... and view it with mutt
256 256 hg email -o -m mbox && # generate an mbox file ...
257 257 formail -s sendmail \\ # ... and use formail to send from the mbox
258 258 -bm -t < mbox # ... using sendmail
259 259
260 260 Before using this command, you will need to enable email in your
261 261 hgrc. See the [email] section in hgrc(5) for details.
262 262 '''
263 263
264 264 _charsets = mail._charsets(ui)
265 265
266 266 bundle = opts.get('bundle')
267 267 date = opts.get('date')
268 268 mbox = opts.get('mbox')
269 269 outgoing = opts.get('outgoing')
270 270 rev = opts.get('rev')
271 271 # internal option used by pbranches
272 272 patches = opts.get('patches')
273 273
274 274 def getoutgoing(dest, revs):
275 275 '''Return the revisions present locally but not in dest'''
276 276 url = ui.expandpath(dest or 'default-push', dest or 'default')
277 277 url = hg.parseurl(url)[0]
278 278 ui.status(_('comparing with %s\n') % util.hidepassword(url))
279 279
280 280 revs = [r for r in scmutil.revrange(repo, revs) if r >= 0]
281 281 if not revs:
282 282 revs = [len(repo) - 1]
283 283 revs = repo.revs('outgoing(%s) and ::%ld', dest or '', revs)
284 284 if not revs:
285 285 ui.status(_("no changes found\n"))
286 286 return []
287 287 return [str(r) for r in revs]
288 288
289 289 def getpatches(revs):
290 290 for r in scmutil.revrange(repo, revs):
291 291 output = cStringIO.StringIO()
292 292 cmdutil.export(repo, [r], fp=output,
293 293 opts=patch.diffopts(ui, opts))
294 294 yield output.getvalue().split('\n')
295 295
296 296 def getbundle(dest):
297 297 tmpdir = tempfile.mkdtemp(prefix='hg-email-bundle-')
298 298 tmpfn = os.path.join(tmpdir, 'bundle')
299 299 try:
300 300 commands.bundle(ui, repo, tmpfn, dest, **opts)
301 301 fp = open(tmpfn, 'rb')
302 302 data = fp.read()
303 303 fp.close()
304 304 return data
305 305 finally:
306 306 try:
307 307 os.unlink(tmpfn)
308 308 except OSError:
309 309 pass
310 310 os.rmdir(tmpdir)
311 311
312 312 if not (opts.get('test') or mbox):
313 313 # really sending
314 314 mail.validateconfig(ui)
315 315
316 316 if not (revs or rev or outgoing or bundle or patches):
317 317 raise util.Abort(_('specify at least one changeset with -r or -o'))
318 318
319 319 if outgoing and bundle:
320 320 raise util.Abort(_("--outgoing mode always on with --bundle;"
321 321 " do not re-specify --outgoing"))
322 322
323 323 if outgoing or bundle:
324 324 if len(revs) > 1:
325 325 raise util.Abort(_("too many destinations"))
326 326 dest = revs and revs[0] or None
327 327 revs = []
328 328
329 329 if rev:
330 330 if revs:
331 331 raise util.Abort(_('use only one form to specify the revision'))
332 332 revs = rev
333 333
334 334 if outgoing:
335 335 revs = getoutgoing(dest, rev)
336 336 if bundle:
337 337 opts['revs'] = revs
338 338
339 339 # start
340 340 if date:
341 341 start_time = util.parsedate(date)
342 342 else:
343 343 start_time = util.makedate()
344 344
345 345 def genmsgid(id):
346 346 return '<%s.%s@%s>' % (id[:20], int(start_time[0]), socket.getfqdn())
347 347
348 348 def getdescription(body, sender):
349 349 if opts.get('desc'):
350 350 body = open(opts.get('desc')).read()
351 351 else:
352 352 ui.write(_('\nWrite the introductory message for the '
353 353 'patch series.\n\n'))
354 354 body = ui.edit(body, sender)
355 355 # Save series description in case sendmail fails
356 356 msgfile = repo.opener('last-email.txt', 'wb')
357 357 msgfile.write(body)
358 358 msgfile.close()
359 359 return body
360 360
361 361 def getpatchmsgs(patches, patchnames=None):
362 362 msgs = []
363 363
364 364 ui.write(_('this patch series consists of %d patches.\n\n')
365 365 % len(patches))
366 366
367 367 # build the intro message, or skip it if the user declines
368 368 if introwanted(opts, len(patches)):
369 369 msg = makeintro(patches)
370 370 if msg:
371 371 msgs.append(msg)
372 372
373 373 # are we going to send more than one message?
374 374 numbered = len(msgs) + len(patches) > 1
375 375
376 376 # now generate the actual patch messages
377 377 name = None
378 378 for i, p in enumerate(patches):
379 379 if patchnames:
380 380 name = patchnames[i]
381 381 msg = makepatch(ui, repo, p, opts, _charsets, i + 1,
382 382 len(patches), numbered, name)
383 383 msgs.append(msg)
384 384
385 385 return msgs
386 386
387 387 def makeintro(patches):
388 388 tlen = len(str(len(patches)))
389 389
390 390 flag = opts.get('flag') or ''
391 391 if flag:
392 392 flag = ' ' + ' '.join(flag)
393 393 prefix = '[PATCH %0*d of %d%s]' % (tlen, 0, len(patches), flag)
394 394
395 395 subj = (opts.get('subject') or
396 396 prompt(ui, '(optional) Subject: ', rest=prefix, default=''))
397 397 if not subj:
398 398 return None # skip intro if the user doesn't bother
399 399
400 400 subj = prefix + ' ' + subj
401 401
402 402 body = ''
403 403 if opts.get('diffstat'):
404 404 # generate a cumulative diffstat of the whole patch series
405 405 diffstat = patch.diffstat(sum(patches, []))
406 406 body = '\n' + diffstat
407 407 else:
408 408 diffstat = None
409 409
410 410 body = getdescription(body, sender)
411 411 msg = mail.mimeencode(ui, body, _charsets, opts.get('test'))
412 412 msg['Subject'] = mail.headencode(ui, subj, _charsets,
413 413 opts.get('test'))
414 414 return (msg, subj, diffstat)
415 415
416 416 def getbundlemsgs(bundle):
417 417 subj = (opts.get('subject')
418 418 or prompt(ui, 'Subject:', 'A bundle for your repository'))
419 419
420 420 body = getdescription('', sender)
421 421 msg = email.MIMEMultipart.MIMEMultipart()
422 422 if body:
423 423 msg.attach(mail.mimeencode(ui, body, _charsets, opts.get('test')))
424 424 datapart = email.MIMEBase.MIMEBase('application', 'x-mercurial-bundle')
425 425 datapart.set_payload(bundle)
426 426 bundlename = '%s.hg' % opts.get('bundlename', 'bundle')
427 427 datapart.add_header('Content-Disposition', 'attachment',
428 428 filename=bundlename)
429 429 email.Encoders.encode_base64(datapart)
430 430 msg.attach(datapart)
431 431 msg['Subject'] = mail.headencode(ui, subj, _charsets, opts.get('test'))
432 432 return [(msg, subj, None)]
433 433
434 434 sender = (opts.get('from') or ui.config('email', 'from') or
435 435 ui.config('patchbomb', 'from') or
436 436 prompt(ui, 'From', ui.username()))
437 437
438 438 if patches:
439 439 msgs = getpatchmsgs(patches, opts.get('patchnames'))
440 440 elif bundle:
441 441 msgs = getbundlemsgs(getbundle(dest))
442 442 else:
443 443 msgs = getpatchmsgs(list(getpatches(revs)))
444 444
445 445 showaddrs = []
446 446
447 447 def getaddrs(header, ask=False, default=None):
448 448 configkey = header.lower()
449 449 opt = header.replace('-', '_').lower()
450 450 addrs = opts.get(opt)
451 451 if addrs:
452 452 showaddrs.append('%s: %s' % (header, ', '.join(addrs)))
453 453 return mail.addrlistencode(ui, addrs, _charsets, opts.get('test'))
454 454
455 455 # not on the command line: fallback to config and then maybe ask
456 456 addr = (ui.config('email', configkey) or
457 457 ui.config('patchbomb', configkey) or
458 458 '')
459 459 if not addr and ask:
460 460 addr = prompt(ui, header, default=default)
461 461 if addr:
462 462 showaddrs.append('%s: %s' % (header, addr))
463 463 return mail.addrlistencode(ui, [addr], _charsets, opts.get('test'))
464 464 else:
465 465 return default
466 466
467 467 to = getaddrs('To', ask=True)
468 468 if not to:
469 469 # we can get here in non-interactive mode
470 470 raise util.Abort(_('no recipient addresses provided'))
471 471 cc = getaddrs('Cc', ask=True, default='') or []
472 472 bcc = getaddrs('Bcc') or []
473 473 replyto = getaddrs('Reply-To')
474 474
475 475 if opts.get('diffstat') or opts.get('confirm'):
476 476 ui.write(_('\nFinal summary:\n\n'))
477 477 ui.write(('From: %s\n' % sender))
478 478 for addr in showaddrs:
479 479 ui.write('%s\n' % addr)
480 480 for m, subj, ds in msgs:
481 481 ui.write(('Subject: %s\n' % subj))
482 482 if ds:
483 483 ui.write(ds)
484 484 ui.write('\n')
485 485 if ui.promptchoice(_('are you sure you want to send (yn)?'),
486 486 (_('&Yes'), _('&No'))):
487 487 raise util.Abort(_('patchbomb canceled'))
488 488
489 489 ui.write('\n')
490 490
491 491 parent = opts.get('in_reply_to') or None
492 492 # angle brackets may be omitted, they're not semantically part of the msg-id
493 493 if parent is not None:
494 494 if not parent.startswith('<'):
495 495 parent = '<' + parent
496 496 if not parent.endswith('>'):
497 497 parent += '>'
498 498
499 499 sender_addr = email.Utils.parseaddr(sender)[1]
500 500 sender = mail.addressencode(ui, sender, _charsets, opts.get('test'))
501 501 sendmail = None
502 502 for i, (m, subj, ds) in enumerate(msgs):
503 503 try:
504 504 m['Message-Id'] = genmsgid(m['X-Mercurial-Node'])
505 505 except TypeError:
506 506 m['Message-Id'] = genmsgid('patchbomb')
507 507 if parent:
508 508 m['In-Reply-To'] = parent
509 509 m['References'] = parent
510 510 if not parent or 'X-Mercurial-Node' not in m:
511 511 parent = m['Message-Id']
512 512
513 513 m['User-Agent'] = 'Mercurial-patchbomb/%s' % util.version()
514 514 m['Date'] = email.Utils.formatdate(start_time[0], localtime=True)
515 515
516 516 start_time = (start_time[0] + 1, start_time[1])
517 517 m['From'] = sender
518 518 m['To'] = ', '.join(to)
519 519 if cc:
520 520 m['Cc'] = ', '.join(cc)
521 521 if bcc:
522 522 m['Bcc'] = ', '.join(bcc)
523 523 if replyto:
524 524 m['Reply-To'] = ', '.join(replyto)
525 525 if opts.get('test'):
526 526 ui.status(_('displaying '), subj, ' ...\n')
527 527 ui.flush()
528 528 if 'PAGER' in os.environ and not ui.plain():
529 529 fp = util.popen(os.environ['PAGER'], 'w')
530 530 else:
531 531 fp = ui
532 532 generator = email.Generator.Generator(fp, mangle_from_=False)
533 533 try:
534 534 generator.flatten(m, 0)
535 535 fp.write('\n')
536 536 except IOError, inst:
537 537 if inst.errno != errno.EPIPE:
538 538 raise
539 539 if fp is not ui:
540 540 fp.close()
541 541 else:
542 542 if not sendmail:
543 sendmail = mail.connect(ui, mbox=mbox)
543 verifycert = ui.config('smtp', 'verifycert')
544 if opts.get('insecure'):
545 ui.setconfig('smtp', 'verifycert', 'loose')
546 try:
547 sendmail = mail.connect(ui, mbox=mbox)
548 finally:
549 ui.setconfig('smtp', 'verifycert', verifycert)
544 550 ui.status(_('sending '), subj, ' ...\n')
545 551 ui.progress(_('sending'), i, item=subj, total=len(msgs))
546 552 if not mbox:
547 553 # Exim does not remove the Bcc field
548 554 del m['Bcc']
549 555 fp = cStringIO.StringIO()
550 556 generator = email.Generator.Generator(fp, mangle_from_=False)
551 557 generator.flatten(m, 0)
552 558 sendmail(sender_addr, to + bcc + cc, fp.getvalue())
553 559
554 560 ui.progress(_('writing'), None)
555 561 ui.progress(_('sending'), None)
@@ -1,1509 +1,1519
1 1 The Mercurial system uses a set of configuration files to control
2 2 aspects of its behavior.
3 3
4 4 The configuration files use a simple ini-file format. A configuration
5 5 file consists of sections, led by a ``[section]`` header and followed
6 6 by ``name = value`` entries::
7 7
8 8 [ui]
9 9 username = Firstname Lastname <firstname.lastname@example.net>
10 10 verbose = True
11 11
12 12 The above entries will be referred to as ``ui.username`` and
13 13 ``ui.verbose``, respectively. See the Syntax section below.
14 14
15 15 Files
16 16 =====
17 17
18 18 Mercurial reads configuration data from several files, if they exist.
19 19 These files do not exist by default and you will have to create the
20 20 appropriate configuration files yourself: global configuration like
21 21 the username setting is typically put into
22 22 ``%USERPROFILE%\mercurial.ini`` or ``$HOME/.hgrc`` and local
23 23 configuration is put into the per-repository ``<repo>/.hg/hgrc`` file.
24 24
25 25 The names of these files depend on the system on which Mercurial is
26 26 installed. ``*.rc`` files from a single directory are read in
27 27 alphabetical order, later ones overriding earlier ones. Where multiple
28 28 paths are given below, settings from earlier paths override later
29 29 ones.
30 30
31 31 | (All) ``<repo>/.hg/hgrc``
32 32
33 33 Per-repository configuration options that only apply in a
34 34 particular repository. This file is not version-controlled, and
35 35 will not get transferred during a "clone" operation. Options in
36 36 this file override options in all other configuration files. On
37 37 Plan 9 and Unix, most of this file will be ignored if it doesn't
38 38 belong to a trusted user or to a trusted group. See the documentation
39 39 for the ``[trusted]`` section below for more details.
40 40
41 41 | (Plan 9) ``$home/lib/hgrc``
42 42 | (Unix) ``$HOME/.hgrc``
43 43 | (Windows) ``%USERPROFILE%\.hgrc``
44 44 | (Windows) ``%USERPROFILE%\Mercurial.ini``
45 45 | (Windows) ``%HOME%\.hgrc``
46 46 | (Windows) ``%HOME%\Mercurial.ini``
47 47
48 48 Per-user configuration file(s), for the user running Mercurial. On
49 49 Windows 9x, ``%HOME%`` is replaced by ``%APPDATA%``. Options in these
50 50 files apply to all Mercurial commands executed by this user in any
51 51 directory. Options in these files override per-system and per-installation
52 52 options.
53 53
54 54 | (Plan 9) ``/lib/mercurial/hgrc``
55 55 | (Plan 9) ``/lib/mercurial/hgrc.d/*.rc``
56 56 | (Unix) ``/etc/mercurial/hgrc``
57 57 | (Unix) ``/etc/mercurial/hgrc.d/*.rc``
58 58
59 59 Per-system configuration files, for the system on which Mercurial
60 60 is running. Options in these files apply to all Mercurial commands
61 61 executed by any user in any directory. Options in these files
62 62 override per-installation options.
63 63
64 64 | (Plan 9) ``<install-root>/lib/mercurial/hgrc``
65 65 | (Plan 9) ``<install-root>/lib/mercurial/hgrc.d/*.rc``
66 66 | (Unix) ``<install-root>/etc/mercurial/hgrc``
67 67 | (Unix) ``<install-root>/etc/mercurial/hgrc.d/*.rc``
68 68
69 69 Per-installation configuration files, searched for in the
70 70 directory where Mercurial is installed. ``<install-root>`` is the
71 71 parent directory of the **hg** executable (or symlink) being run. For
72 72 example, if installed in ``/shared/tools/bin/hg``, Mercurial will look
73 73 in ``/shared/tools/etc/mercurial/hgrc``. Options in these files apply
74 74 to all Mercurial commands executed by any user in any directory.
75 75
76 76 | (Windows) ``<install-dir>\Mercurial.ini`` **or**
77 77 | (Windows) ``<install-dir>\hgrc.d\*.rc`` **or**
78 78 | (Windows) ``HKEY_LOCAL_MACHINE\SOFTWARE\Mercurial``
79 79
80 80 Per-installation/system configuration files, for the system on
81 81 which Mercurial is running. Options in these files apply to all
82 82 Mercurial commands executed by any user in any directory. Registry
83 83 keys contain PATH-like strings, every part of which must reference
84 84 a ``Mercurial.ini`` file or be a directory where ``*.rc`` files will
85 85 be read. Mercurial checks each of these locations in the specified
86 86 order until one or more configuration files are detected.
87 87
88 88 Syntax
89 89 ======
90 90
91 91 A configuration file consists of sections, led by a ``[section]`` header
92 92 and followed by ``name = value`` entries (sometimes called
93 93 ``configuration keys``)::
94 94
95 95 [spam]
96 96 eggs=ham
97 97 green=
98 98 eggs
99 99
100 100 Each line contains one entry. If the lines that follow are indented,
101 101 they are treated as continuations of that entry. Leading whitespace is
102 102 removed from values. Empty lines are skipped. Lines beginning with
103 103 ``#`` or ``;`` are ignored and may be used to provide comments.
104 104
105 105 Configuration keys can be set multiple times, in which case Mercurial
106 106 will use the value that was configured last. As an example::
107 107
108 108 [spam]
109 109 eggs=large
110 110 ham=serrano
111 111 eggs=small
112 112
113 113 This would set the configuration key named ``eggs`` to ``small``.
114 114
115 115 It is also possible to define a section multiple times. A section can
116 116 be redefined on the same and/or on different configuration files. For
117 117 example::
118 118
119 119 [foo]
120 120 eggs=large
121 121 ham=serrano
122 122 eggs=small
123 123
124 124 [bar]
125 125 eggs=ham
126 126 green=
127 127 eggs
128 128
129 129 [foo]
130 130 ham=prosciutto
131 131 eggs=medium
132 132 bread=toasted
133 133
134 134 This would set the ``eggs``, ``ham``, and ``bread`` configuration keys
135 135 of the ``foo`` section to ``medium``, ``prosciutto``, and ``toasted``,
136 136 respectively. As you can see there only thing that matters is the last
137 137 value that was set for each of the configuration keys.
138 138
139 139 If a configuration key is set multiple times in different
140 140 configuration files the final value will depend on the order in which
141 141 the different configuration files are read, with settings from earlier
142 142 paths overriding later ones as described on the ``Files`` section
143 143 above.
144 144
145 145 A line of the form ``%include file`` will include ``file`` into the
146 146 current configuration file. The inclusion is recursive, which means
147 147 that included files can include other files. Filenames are relative to
148 148 the configuration file in which the ``%include`` directive is found.
149 149 Environment variables and ``~user`` constructs are expanded in
150 150 ``file``. This lets you do something like::
151 151
152 152 %include ~/.hgrc.d/$HOST.rc
153 153
154 154 to include a different configuration file on each computer you use.
155 155
156 156 A line with ``%unset name`` will remove ``name`` from the current
157 157 section, if it has been set previously.
158 158
159 159 The values are either free-form text strings, lists of text strings,
160 160 or Boolean values. Boolean values can be set to true using any of "1",
161 161 "yes", "true", or "on" and to false using "0", "no", "false", or "off"
162 162 (all case insensitive).
163 163
164 164 List values are separated by whitespace or comma, except when values are
165 165 placed in double quotation marks::
166 166
167 167 allow_read = "John Doe, PhD", brian, betty
168 168
169 169 Quotation marks can be escaped by prefixing them with a backslash. Only
170 170 quotation marks at the beginning of a word is counted as a quotation
171 171 (e.g., ``foo"bar baz`` is the list of ``foo"bar`` and ``baz``).
172 172
173 173 Sections
174 174 ========
175 175
176 176 This section describes the different sections that may appear in a
177 177 Mercurial configuration file, the purpose of each section, its possible
178 178 keys, and their possible values.
179 179
180 180 ``alias``
181 181 ---------
182 182
183 183 Defines command aliases.
184 184 Aliases allow you to define your own commands in terms of other
185 185 commands (or aliases), optionally including arguments. Positional
186 186 arguments in the form of ``$1``, ``$2``, etc in the alias definition
187 187 are expanded by Mercurial before execution. Positional arguments not
188 188 already used by ``$N`` in the definition are put at the end of the
189 189 command to be executed.
190 190
191 191 Alias definitions consist of lines of the form::
192 192
193 193 <alias> = <command> [<argument>]...
194 194
195 195 For example, this definition::
196 196
197 197 latest = log --limit 5
198 198
199 199 creates a new command ``latest`` that shows only the five most recent
200 200 changesets. You can define subsequent aliases using earlier ones::
201 201
202 202 stable5 = latest -b stable
203 203
204 204 .. note:: It is possible to create aliases with the same names as
205 205 existing commands, which will then override the original
206 206 definitions. This is almost always a bad idea!
207 207
208 208 An alias can start with an exclamation point (``!``) to make it a
209 209 shell alias. A shell alias is executed with the shell and will let you
210 210 run arbitrary commands. As an example, ::
211 211
212 212 echo = !echo $@
213 213
214 214 will let you do ``hg echo foo`` to have ``foo`` printed in your
215 215 terminal. A better example might be::
216 216
217 217 purge = !$HG status --no-status --unknown -0 | xargs -0 rm
218 218
219 219 which will make ``hg purge`` delete all unknown files in the
220 220 repository in the same manner as the purge extension.
221 221
222 222 Positional arguments like ``$1``, ``$2``, etc. in the alias definition
223 223 expand to the command arguments. Unmatched arguments are
224 224 removed. ``$0`` expands to the alias name and ``$@`` expands to all
225 225 arguments separated by a space. These expansions happen before the
226 226 command is passed to the shell.
227 227
228 228 Shell aliases are executed in an environment where ``$HG`` expands to
229 229 the path of the Mercurial that was used to execute the alias. This is
230 230 useful when you want to call further Mercurial commands in a shell
231 231 alias, as was done above for the purge alias. In addition,
232 232 ``$HG_ARGS`` expands to the arguments given to Mercurial. In the ``hg
233 233 echo foo`` call above, ``$HG_ARGS`` would expand to ``echo foo``.
234 234
235 235 .. note:: Some global configuration options such as ``-R`` are
236 236 processed before shell aliases and will thus not be passed to
237 237 aliases.
238 238
239 239
240 240 ``annotate``
241 241 ------------
242 242
243 243 Settings used when displaying file annotations. All values are
244 244 Booleans and default to False. See ``diff`` section for related
245 245 options for the diff command.
246 246
247 247 ``ignorews``
248 248 Ignore white space when comparing lines.
249 249
250 250 ``ignorewsamount``
251 251 Ignore changes in the amount of white space.
252 252
253 253 ``ignoreblanklines``
254 254 Ignore changes whose lines are all blank.
255 255
256 256
257 257 ``auth``
258 258 --------
259 259
260 260 Authentication credentials for HTTP authentication. This section
261 261 allows you to store usernames and passwords for use when logging
262 262 *into* HTTP servers. See the ``[web]`` configuration section if
263 263 you want to configure *who* can login to your HTTP server.
264 264
265 265 Each line has the following format::
266 266
267 267 <name>.<argument> = <value>
268 268
269 269 where ``<name>`` is used to group arguments into authentication
270 270 entries. Example::
271 271
272 272 foo.prefix = hg.intevation.org/mercurial
273 273 foo.username = foo
274 274 foo.password = bar
275 275 foo.schemes = http https
276 276
277 277 bar.prefix = secure.example.org
278 278 bar.key = path/to/file.key
279 279 bar.cert = path/to/file.cert
280 280 bar.schemes = https
281 281
282 282 Supported arguments:
283 283
284 284 ``prefix``
285 285 Either ``*`` or a URI prefix with or without the scheme part.
286 286 The authentication entry with the longest matching prefix is used
287 287 (where ``*`` matches everything and counts as a match of length
288 288 1). If the prefix doesn't include a scheme, the match is performed
289 289 against the URI with its scheme stripped as well, and the schemes
290 290 argument, q.v., is then subsequently consulted.
291 291
292 292 ``username``
293 293 Optional. Username to authenticate with. If not given, and the
294 294 remote site requires basic or digest authentication, the user will
295 295 be prompted for it. Environment variables are expanded in the
296 296 username letting you do ``foo.username = $USER``. If the URI
297 297 includes a username, only ``[auth]`` entries with a matching
298 298 username or without a username will be considered.
299 299
300 300 ``password``
301 301 Optional. Password to authenticate with. If not given, and the
302 302 remote site requires basic or digest authentication, the user
303 303 will be prompted for it.
304 304
305 305 ``key``
306 306 Optional. PEM encoded client certificate key file. Environment
307 307 variables are expanded in the filename.
308 308
309 309 ``cert``
310 310 Optional. PEM encoded client certificate chain file. Environment
311 311 variables are expanded in the filename.
312 312
313 313 ``schemes``
314 314 Optional. Space separated list of URI schemes to use this
315 315 authentication entry with. Only used if the prefix doesn't include
316 316 a scheme. Supported schemes are http and https. They will match
317 317 static-http and static-https respectively, as well.
318 318 Default: https.
319 319
320 320 If no suitable authentication entry is found, the user is prompted
321 321 for credentials as usual if required by the remote.
322 322
323 323
324 324 ``decode/encode``
325 325 -----------------
326 326
327 327 Filters for transforming files on checkout/checkin. This would
328 328 typically be used for newline processing or other
329 329 localization/canonicalization of files.
330 330
331 331 Filters consist of a filter pattern followed by a filter command.
332 332 Filter patterns are globs by default, rooted at the repository root.
333 333 For example, to match any file ending in ``.txt`` in the root
334 334 directory only, use the pattern ``*.txt``. To match any file ending
335 335 in ``.c`` anywhere in the repository, use the pattern ``**.c``.
336 336 For each file only the first matching filter applies.
337 337
338 338 The filter command can start with a specifier, either ``pipe:`` or
339 339 ``tempfile:``. If no specifier is given, ``pipe:`` is used by default.
340 340
341 341 A ``pipe:`` command must accept data on stdin and return the transformed
342 342 data on stdout.
343 343
344 344 Pipe example::
345 345
346 346 [encode]
347 347 # uncompress gzip files on checkin to improve delta compression
348 348 # note: not necessarily a good idea, just an example
349 349 *.gz = pipe: gunzip
350 350
351 351 [decode]
352 352 # recompress gzip files when writing them to the working dir (we
353 353 # can safely omit "pipe:", because it's the default)
354 354 *.gz = gzip
355 355
356 356 A ``tempfile:`` command is a template. The string ``INFILE`` is replaced
357 357 with the name of a temporary file that contains the data to be
358 358 filtered by the command. The string ``OUTFILE`` is replaced with the name
359 359 of an empty temporary file, where the filtered data must be written by
360 360 the command.
361 361
362 362 .. note:: The tempfile mechanism is recommended for Windows systems,
363 363 where the standard shell I/O redirection operators often have
364 364 strange effects and may corrupt the contents of your files.
365 365
366 366 This filter mechanism is used internally by the ``eol`` extension to
367 367 translate line ending characters between Windows (CRLF) and Unix (LF)
368 368 format. We suggest you use the ``eol`` extension for convenience.
369 369
370 370
371 371 ``defaults``
372 372 ------------
373 373
374 374 (defaults are deprecated. Don't use them. Use aliases instead)
375 375
376 376 Use the ``[defaults]`` section to define command defaults, i.e. the
377 377 default options/arguments to pass to the specified commands.
378 378
379 379 The following example makes :hg:`log` run in verbose mode, and
380 380 :hg:`status` show only the modified files, by default::
381 381
382 382 [defaults]
383 383 log = -v
384 384 status = -m
385 385
386 386 The actual commands, instead of their aliases, must be used when
387 387 defining command defaults. The command defaults will also be applied
388 388 to the aliases of the commands defined.
389 389
390 390
391 391 ``diff``
392 392 --------
393 393
394 394 Settings used when displaying diffs. Everything except for ``unified``
395 395 is a Boolean and defaults to False. See ``annotate`` section for
396 396 related options for the annotate command.
397 397
398 398 ``git``
399 399 Use git extended diff format.
400 400
401 401 ``nodates``
402 402 Don't include dates in diff headers.
403 403
404 404 ``showfunc``
405 405 Show which function each change is in.
406 406
407 407 ``ignorews``
408 408 Ignore white space when comparing lines.
409 409
410 410 ``ignorewsamount``
411 411 Ignore changes in the amount of white space.
412 412
413 413 ``ignoreblanklines``
414 414 Ignore changes whose lines are all blank.
415 415
416 416 ``unified``
417 417 Number of lines of context to show.
418 418
419 419 ``email``
420 420 ---------
421 421
422 422 Settings for extensions that send email messages.
423 423
424 424 ``from``
425 425 Optional. Email address to use in "From" header and SMTP envelope
426 426 of outgoing messages.
427 427
428 428 ``to``
429 429 Optional. Comma-separated list of recipients' email addresses.
430 430
431 431 ``cc``
432 432 Optional. Comma-separated list of carbon copy recipients'
433 433 email addresses.
434 434
435 435 ``bcc``
436 436 Optional. Comma-separated list of blind carbon copy recipients'
437 437 email addresses.
438 438
439 439 ``method``
440 440 Optional. Method to use to send email messages. If value is ``smtp``
441 441 (default), use SMTP (see the ``[smtp]`` section for configuration).
442 442 Otherwise, use as name of program to run that acts like sendmail
443 443 (takes ``-f`` option for sender, list of recipients on command line,
444 444 message on stdin). Normally, setting this to ``sendmail`` or
445 445 ``/usr/sbin/sendmail`` is enough to use sendmail to send messages.
446 446
447 447 ``charsets``
448 448 Optional. Comma-separated list of character sets considered
449 449 convenient for recipients. Addresses, headers, and parts not
450 450 containing patches of outgoing messages will be encoded in the
451 451 first character set to which conversion from local encoding
452 452 (``$HGENCODING``, ``ui.fallbackencoding``) succeeds. If correct
453 453 conversion fails, the text in question is sent as is. Defaults to
454 454 empty (explicit) list.
455 455
456 456 Order of outgoing email character sets:
457 457
458 458 1. ``us-ascii``: always first, regardless of settings
459 459 2. ``email.charsets``: in order given by user
460 460 3. ``ui.fallbackencoding``: if not in email.charsets
461 461 4. ``$HGENCODING``: if not in email.charsets
462 462 5. ``utf-8``: always last, regardless of settings
463 463
464 464 Email example::
465 465
466 466 [email]
467 467 from = Joseph User <joe.user@example.com>
468 468 method = /usr/sbin/sendmail
469 469 # charsets for western Europeans
470 470 # us-ascii, utf-8 omitted, as they are tried first and last
471 471 charsets = iso-8859-1, iso-8859-15, windows-1252
472 472
473 473
474 474 ``extensions``
475 475 --------------
476 476
477 477 Mercurial has an extension mechanism for adding new features. To
478 478 enable an extension, create an entry for it in this section.
479 479
480 480 If you know that the extension is already in Python's search path,
481 481 you can give the name of the module, followed by ``=``, with nothing
482 482 after the ``=``.
483 483
484 484 Otherwise, give a name that you choose, followed by ``=``, followed by
485 485 the path to the ``.py`` file (including the file name extension) that
486 486 defines the extension.
487 487
488 488 To explicitly disable an extension that is enabled in an hgrc of
489 489 broader scope, prepend its path with ``!``, as in ``foo = !/ext/path``
490 490 or ``foo = !`` when path is not supplied.
491 491
492 492 Example for ``~/.hgrc``::
493 493
494 494 [extensions]
495 495 # (the mq extension will get loaded from Mercurial's path)
496 496 mq =
497 497 # (this extension will get loaded from the file specified)
498 498 myfeature = ~/.hgext/myfeature.py
499 499
500 500
501 501 ``format``
502 502 ----------
503 503
504 504 ``usestore``
505 505 Enable or disable the "store" repository format which improves
506 506 compatibility with systems that fold case or otherwise mangle
507 507 filenames. Enabled by default. Disabling this option will allow
508 508 you to store longer filenames in some situations at the expense of
509 509 compatibility and ensures that the on-disk format of newly created
510 510 repositories will be compatible with Mercurial before version 0.9.4.
511 511
512 512 ``usefncache``
513 513 Enable or disable the "fncache" repository format which enhances
514 514 the "store" repository format (which has to be enabled to use
515 515 fncache) to allow longer filenames and avoids using Windows
516 516 reserved names, e.g. "nul". Enabled by default. Disabling this
517 517 option ensures that the on-disk format of newly created
518 518 repositories will be compatible with Mercurial before version 1.1.
519 519
520 520 ``dotencode``
521 521 Enable or disable the "dotencode" repository format which enhances
522 522 the "fncache" repository format (which has to be enabled to use
523 523 dotencode) to avoid issues with filenames starting with ._ on
524 524 Mac OS X and spaces on Windows. Enabled by default. Disabling this
525 525 option ensures that the on-disk format of newly created
526 526 repositories will be compatible with Mercurial before version 1.7.
527 527
528 528 ``graph``
529 529 ---------
530 530
531 531 Web graph view configuration. This section let you change graph
532 532 elements display properties by branches, for instance to make the
533 533 ``default`` branch stand out.
534 534
535 535 Each line has the following format::
536 536
537 537 <branch>.<argument> = <value>
538 538
539 539 where ``<branch>`` is the name of the branch being
540 540 customized. Example::
541 541
542 542 [graph]
543 543 # 2px width
544 544 default.width = 2
545 545 # red color
546 546 default.color = FF0000
547 547
548 548 Supported arguments:
549 549
550 550 ``width``
551 551 Set branch edges width in pixels.
552 552
553 553 ``color``
554 554 Set branch edges color in hexadecimal RGB notation.
555 555
556 556 ``hooks``
557 557 ---------
558 558
559 559 Commands or Python functions that get automatically executed by
560 560 various actions such as starting or finishing a commit. Multiple
561 561 hooks can be run for the same action by appending a suffix to the
562 562 action. Overriding a site-wide hook can be done by changing its
563 563 value or setting it to an empty string. Hooks can be prioritized
564 564 by adding a prefix of ``priority`` to the hook name on a new line
565 565 and setting the priority. The default priority is 0 if
566 566 not specified.
567 567
568 568 Example ``.hg/hgrc``::
569 569
570 570 [hooks]
571 571 # update working directory after adding changesets
572 572 changegroup.update = hg update
573 573 # do not use the site-wide hook
574 574 incoming =
575 575 incoming.email = /my/email/hook
576 576 incoming.autobuild = /my/build/hook
577 577 # force autobuild hook to run before other incoming hooks
578 578 priority.incoming.autobuild = 1
579 579
580 580 Most hooks are run with environment variables set that give useful
581 581 additional information. For each hook below, the environment
582 582 variables it is passed are listed with names of the form ``$HG_foo``.
583 583
584 584 ``changegroup``
585 585 Run after a changegroup has been added via push, pull or unbundle.
586 586 ID of the first new changeset is in ``$HG_NODE``. URL from which
587 587 changes came is in ``$HG_URL``.
588 588
589 589 ``commit``
590 590 Run after a changeset has been created in the local repository. ID
591 591 of the newly created changeset is in ``$HG_NODE``. Parent changeset
592 592 IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
593 593
594 594 ``incoming``
595 595 Run after a changeset has been pulled, pushed, or unbundled into
596 596 the local repository. The ID of the newly arrived changeset is in
597 597 ``$HG_NODE``. URL that was source of changes came is in ``$HG_URL``.
598 598
599 599 ``outgoing``
600 600 Run after sending changes from local repository to another. ID of
601 601 first changeset sent is in ``$HG_NODE``. Source of operation is in
602 602 ``$HG_SOURCE``; see "preoutgoing" hook for description.
603 603
604 604 ``post-<command>``
605 605 Run after successful invocations of the associated command. The
606 606 contents of the command line are passed as ``$HG_ARGS`` and the result
607 607 code in ``$HG_RESULT``. Parsed command line arguments are passed as
608 608 ``$HG_PATS`` and ``$HG_OPTS``. These contain string representations of
609 609 the python data internally passed to <command>. ``$HG_OPTS`` is a
610 610 dictionary of options (with unspecified options set to their defaults).
611 611 ``$HG_PATS`` is a list of arguments. Hook failure is ignored.
612 612
613 613 ``pre-<command>``
614 614 Run before executing the associated command. The contents of the
615 615 command line are passed as ``$HG_ARGS``. Parsed command line arguments
616 616 are passed as ``$HG_PATS`` and ``$HG_OPTS``. These contain string
617 617 representations of the data internally passed to <command>. ``$HG_OPTS``
618 618 is a dictionary of options (with unspecified options set to their
619 619 defaults). ``$HG_PATS`` is a list of arguments. If the hook returns
620 620 failure, the command doesn't execute and Mercurial returns the failure
621 621 code.
622 622
623 623 ``prechangegroup``
624 624 Run before a changegroup is added via push, pull or unbundle. Exit
625 625 status 0 allows the changegroup to proceed. Non-zero status will
626 626 cause the push, pull or unbundle to fail. URL from which changes
627 627 will come is in ``$HG_URL``.
628 628
629 629 ``precommit``
630 630 Run before starting a local commit. Exit status 0 allows the
631 631 commit to proceed. Non-zero status will cause the commit to fail.
632 632 Parent changeset IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
633 633
634 634 ``prelistkeys``
635 635 Run before listing pushkeys (like bookmarks) in the
636 636 repository. Non-zero status will cause failure. The key namespace is
637 637 in ``$HG_NAMESPACE``.
638 638
639 639 ``preoutgoing``
640 640 Run before collecting changes to send from the local repository to
641 641 another. Non-zero status will cause failure. This lets you prevent
642 642 pull over HTTP or SSH. Also prevents against local pull, push
643 643 (outbound) or bundle commands, but not effective, since you can
644 644 just copy files instead then. Source of operation is in
645 645 ``$HG_SOURCE``. If "serve", operation is happening on behalf of remote
646 646 SSH or HTTP repository. If "push", "pull" or "bundle", operation
647 647 is happening on behalf of repository on same system.
648 648
649 649 ``prepushkey``
650 650 Run before a pushkey (like a bookmark) is added to the
651 651 repository. Non-zero status will cause the key to be rejected. The
652 652 key namespace is in ``$HG_NAMESPACE``, the key is in ``$HG_KEY``,
653 653 the old value (if any) is in ``$HG_OLD``, and the new value is in
654 654 ``$HG_NEW``.
655 655
656 656 ``pretag``
657 657 Run before creating a tag. Exit status 0 allows the tag to be
658 658 created. Non-zero status will cause the tag to fail. ID of
659 659 changeset to tag is in ``$HG_NODE``. Name of tag is in ``$HG_TAG``. Tag is
660 660 local if ``$HG_LOCAL=1``, in repository if ``$HG_LOCAL=0``.
661 661
662 662 ``pretxnchangegroup``
663 663 Run after a changegroup has been added via push, pull or unbundle,
664 664 but before the transaction has been committed. Changegroup is
665 665 visible to hook program. This lets you validate incoming changes
666 666 before accepting them. Passed the ID of the first new changeset in
667 667 ``$HG_NODE``. Exit status 0 allows the transaction to commit. Non-zero
668 668 status will cause the transaction to be rolled back and the push,
669 669 pull or unbundle will fail. URL that was source of changes is in
670 670 ``$HG_URL``.
671 671
672 672 ``pretxncommit``
673 673 Run after a changeset has been created but the transaction not yet
674 674 committed. Changeset is visible to hook program. This lets you
675 675 validate commit message and changes. Exit status 0 allows the
676 676 commit to proceed. Non-zero status will cause the transaction to
677 677 be rolled back. ID of changeset is in ``$HG_NODE``. Parent changeset
678 678 IDs are in ``$HG_PARENT1`` and ``$HG_PARENT2``.
679 679
680 680 ``preupdate``
681 681 Run before updating the working directory. Exit status 0 allows
682 682 the update to proceed. Non-zero status will prevent the update.
683 683 Changeset ID of first new parent is in ``$HG_PARENT1``. If merge, ID
684 684 of second new parent is in ``$HG_PARENT2``.
685 685
686 686 ``listkeys``
687 687 Run after listing pushkeys (like bookmarks) in the repository. The
688 688 key namespace is in ``$HG_NAMESPACE``. ``$HG_VALUES`` is a
689 689 dictionary containing the keys and values.
690 690
691 691 ``pushkey``
692 692 Run after a pushkey (like a bookmark) is added to the
693 693 repository. The key namespace is in ``$HG_NAMESPACE``, the key is in
694 694 ``$HG_KEY``, the old value (if any) is in ``$HG_OLD``, and the new
695 695 value is in ``$HG_NEW``.
696 696
697 697 ``tag``
698 698 Run after a tag is created. ID of tagged changeset is in ``$HG_NODE``.
699 699 Name of tag is in ``$HG_TAG``. Tag is local if ``$HG_LOCAL=1``, in
700 700 repository if ``$HG_LOCAL=0``.
701 701
702 702 ``update``
703 703 Run after updating the working directory. Changeset ID of first
704 704 new parent is in ``$HG_PARENT1``. If merge, ID of second new parent is
705 705 in ``$HG_PARENT2``. If the update succeeded, ``$HG_ERROR=0``. If the
706 706 update failed (e.g. because conflicts not resolved), ``$HG_ERROR=1``.
707 707
708 708 .. note:: It is generally better to use standard hooks rather than the
709 709 generic pre- and post- command hooks as they are guaranteed to be
710 710 called in the appropriate contexts for influencing transactions.
711 711 Also, hooks like "commit" will be called in all contexts that
712 712 generate a commit (e.g. tag) and not just the commit command.
713 713
714 714 .. note:: Environment variables with empty values may not be passed to
715 715 hooks on platforms such as Windows. As an example, ``$HG_PARENT2``
716 716 will have an empty value under Unix-like platforms for non-merge
717 717 changesets, while it will not be available at all under Windows.
718 718
719 719 The syntax for Python hooks is as follows::
720 720
721 721 hookname = python:modulename.submodule.callable
722 722 hookname = python:/path/to/python/module.py:callable
723 723
724 724 Python hooks are run within the Mercurial process. Each hook is
725 725 called with at least three keyword arguments: a ui object (keyword
726 726 ``ui``), a repository object (keyword ``repo``), and a ``hooktype``
727 727 keyword that tells what kind of hook is used. Arguments listed as
728 728 environment variables above are passed as keyword arguments, with no
729 729 ``HG_`` prefix, and names in lower case.
730 730
731 731 If a Python hook returns a "true" value or raises an exception, this
732 732 is treated as a failure.
733 733
734 734
735 735 ``hostfingerprints``
736 736 --------------------
737 737
738 738 Fingerprints of the certificates of known HTTPS servers.
739 739 A HTTPS connection to a server with a fingerprint configured here will
740 740 only succeed if the servers certificate matches the fingerprint.
741 741 This is very similar to how ssh known hosts works.
742 742 The fingerprint is the SHA-1 hash value of the DER encoded certificate.
743 743 The CA chain and web.cacerts is not used for servers with a fingerprint.
744 744
745 745 For example::
746 746
747 747 [hostfingerprints]
748 748 hg.intevation.org = 44:ed:af:1f:97:11:b6:01:7a:48:45:fc:10:3c:b7:f9:d4:89:2a:9d
749 749
750 750 This feature is only supported when using Python 2.6 or later.
751 751
752 752
753 753 ``http_proxy``
754 754 --------------
755 755
756 756 Used to access web-based Mercurial repositories through a HTTP
757 757 proxy.
758 758
759 759 ``host``
760 760 Host name and (optional) port of the proxy server, for example
761 761 "myproxy:8000".
762 762
763 763 ``no``
764 764 Optional. Comma-separated list of host names that should bypass
765 765 the proxy.
766 766
767 767 ``passwd``
768 768 Optional. Password to authenticate with at the proxy server.
769 769
770 770 ``user``
771 771 Optional. User name to authenticate with at the proxy server.
772 772
773 773 ``always``
774 774 Optional. Always use the proxy, even for localhost and any entries
775 775 in ``http_proxy.no``. True or False. Default: False.
776 776
777 777 ``merge-patterns``
778 778 ------------------
779 779
780 780 This section specifies merge tools to associate with particular file
781 781 patterns. Tools matched here will take precedence over the default
782 782 merge tool. Patterns are globs by default, rooted at the repository
783 783 root.
784 784
785 785 Example::
786 786
787 787 [merge-patterns]
788 788 **.c = kdiff3
789 789 **.jpg = myimgmerge
790 790
791 791 ``merge-tools``
792 792 ---------------
793 793
794 794 This section configures external merge tools to use for file-level
795 795 merges.
796 796
797 797 Example ``~/.hgrc``::
798 798
799 799 [merge-tools]
800 800 # Override stock tool location
801 801 kdiff3.executable = ~/bin/kdiff3
802 802 # Specify command line
803 803 kdiff3.args = $base $local $other -o $output
804 804 # Give higher priority
805 805 kdiff3.priority = 1
806 806
807 807 # Define new tool
808 808 myHtmlTool.args = -m $local $other $base $output
809 809 myHtmlTool.regkey = Software\FooSoftware\HtmlMerge
810 810 myHtmlTool.priority = 1
811 811
812 812 Supported arguments:
813 813
814 814 ``priority``
815 815 The priority in which to evaluate this tool.
816 816 Default: 0.
817 817
818 818 ``executable``
819 819 Either just the name of the executable or its pathname. On Windows,
820 820 the path can use environment variables with ${ProgramFiles} syntax.
821 821 Default: the tool name.
822 822
823 823 ``args``
824 824 The arguments to pass to the tool executable. You can refer to the
825 825 files being merged as well as the output file through these
826 826 variables: ``$base``, ``$local``, ``$other``, ``$output``.
827 827 Default: ``$local $base $other``
828 828
829 829 ``premerge``
830 830 Attempt to run internal non-interactive 3-way merge tool before
831 831 launching external tool. Options are ``true``, ``false``, or ``keep``
832 832 to leave markers in the file if the premerge fails.
833 833 Default: True
834 834
835 835 ``binary``
836 836 This tool can merge binary files. Defaults to False, unless tool
837 837 was selected by file pattern match.
838 838
839 839 ``symlink``
840 840 This tool can merge symlinks. Defaults to False, even if tool was
841 841 selected by file pattern match.
842 842
843 843 ``check``
844 844 A list of merge success-checking options:
845 845
846 846 ``changed``
847 847 Ask whether merge was successful when the merged file shows no changes.
848 848 ``conflicts``
849 849 Check whether there are conflicts even though the tool reported success.
850 850 ``prompt``
851 851 Always prompt for merge success, regardless of success reported by tool.
852 852
853 853 ``fixeol``
854 854 Attempt to fix up EOL changes caused by the merge tool.
855 855 Default: False
856 856
857 857 ``gui``
858 858 This tool requires a graphical interface to run. Default: False
859 859
860 860 ``regkey``
861 861 Windows registry key which describes install location of this
862 862 tool. Mercurial will search for this key first under
863 863 ``HKEY_CURRENT_USER`` and then under ``HKEY_LOCAL_MACHINE``.
864 864 Default: None
865 865
866 866 ``regkeyalt``
867 867 An alternate Windows registry key to try if the first key is not
868 868 found. The alternate key uses the same ``regname`` and ``regappend``
869 869 semantics of the primary key. The most common use for this key
870 870 is to search for 32bit applications on 64bit operating systems.
871 871 Default: None
872 872
873 873 ``regname``
874 874 Name of value to read from specified registry key. Defaults to the
875 875 unnamed (default) value.
876 876
877 877 ``regappend``
878 878 String to append to the value read from the registry, typically
879 879 the executable name of the tool.
880 880 Default: None
881 881
882 882
883 883 ``patch``
884 884 ---------
885 885
886 886 Settings used when applying patches, for instance through the 'import'
887 887 command or with Mercurial Queues extension.
888 888
889 889 ``eol``
890 890 When set to 'strict' patch content and patched files end of lines
891 891 are preserved. When set to ``lf`` or ``crlf``, both files end of
892 892 lines are ignored when patching and the result line endings are
893 893 normalized to either LF (Unix) or CRLF (Windows). When set to
894 894 ``auto``, end of lines are again ignored while patching but line
895 895 endings in patched files are normalized to their original setting
896 896 on a per-file basis. If target file does not exist or has no end
897 897 of line, patch line endings are preserved.
898 898 Default: strict.
899 899
900 900
901 901 ``paths``
902 902 ---------
903 903
904 904 Assigns symbolic names to repositories. The left side is the
905 905 symbolic name, and the right gives the directory or URL that is the
906 906 location of the repository. Default paths can be declared by setting
907 907 the following entries.
908 908
909 909 ``default``
910 910 Directory or URL to use when pulling if no source is specified.
911 911 Default is set to repository from which the current repository was
912 912 cloned.
913 913
914 914 ``default-push``
915 915 Optional. Directory or URL to use when pushing if no destination
916 916 is specified.
917 917
918 918 Custom paths can be defined by assigning the path to a name that later can be
919 919 used from the command line. Example::
920 920
921 921 [paths]
922 922 my_path = http://example.com/path
923 923
924 924 To push to the path defined in ``my_path`` run the command::
925 925
926 926 hg push my_path
927 927
928 928
929 929 ``phases``
930 930 ----------
931 931
932 932 Specifies default handling of phases. See :hg:`help phases` for more
933 933 information about working with phases.
934 934
935 935 ``publish``
936 936 Controls draft phase behavior when working as a server. When true,
937 937 pushed changesets are set to public in both client and server and
938 938 pulled or cloned changesets are set to public in the client.
939 939 Default: True
940 940
941 941 ``new-commit``
942 942 Phase of newly-created commits.
943 943 Default: draft
944 944
945 945 ``profiling``
946 946 -------------
947 947
948 948 Specifies profiling type, format, and file output. Two profilers are
949 949 supported: an instrumenting profiler (named ``ls``), and a sampling
950 950 profiler (named ``stat``).
951 951
952 952 In this section description, 'profiling data' stands for the raw data
953 953 collected during profiling, while 'profiling report' stands for a
954 954 statistical text report generated from the profiling data. The
955 955 profiling is done using lsprof.
956 956
957 957 ``type``
958 958 The type of profiler to use.
959 959 Default: ls.
960 960
961 961 ``ls``
962 962 Use Python's built-in instrumenting profiler. This profiler
963 963 works on all platforms, but each line number it reports is the
964 964 first line of a function. This restriction makes it difficult to
965 965 identify the expensive parts of a non-trivial function.
966 966 ``stat``
967 967 Use a third-party statistical profiler, statprof. This profiler
968 968 currently runs only on Unix systems, and is most useful for
969 969 profiling commands that run for longer than about 0.1 seconds.
970 970
971 971 ``format``
972 972 Profiling format. Specific to the ``ls`` instrumenting profiler.
973 973 Default: text.
974 974
975 975 ``text``
976 976 Generate a profiling report. When saving to a file, it should be
977 977 noted that only the report is saved, and the profiling data is
978 978 not kept.
979 979 ``kcachegrind``
980 980 Format profiling data for kcachegrind use: when saving to a
981 981 file, the generated file can directly be loaded into
982 982 kcachegrind.
983 983
984 984 ``frequency``
985 985 Sampling frequency. Specific to the ``stat`` sampling profiler.
986 986 Default: 1000.
987 987
988 988 ``output``
989 989 File path where profiling data or report should be saved. If the
990 990 file exists, it is replaced. Default: None, data is printed on
991 991 stderr
992 992
993 993 ``sort``
994 994 Sort field. Specific to the ``ls`` instrumenting profiler.
995 995 One of ``callcount``, ``reccallcount``, ``totaltime`` and
996 996 ``inlinetime``.
997 997 Default: inlinetime.
998 998
999 999 ``limit``
1000 1000 Number of lines to show. Specific to the ``ls`` instrumenting profiler.
1001 1001 Default: 30.
1002 1002
1003 1003 ``nested``
1004 1004 Show at most this number of lines of drill-down info after each main entry.
1005 1005 This can help explain the difference between Total and Inline.
1006 1006 Specific to the ``ls`` instrumenting profiler.
1007 1007 Default: 5.
1008 1008
1009 1009 ``revsetalias``
1010 1010 ---------------
1011 1011
1012 1012 Alias definitions for revsets. See :hg:`help revsets` for details.
1013 1013
1014 1014 ``server``
1015 1015 ----------
1016 1016
1017 1017 Controls generic server settings.
1018 1018
1019 1019 ``uncompressed``
1020 1020 Whether to allow clients to clone a repository using the
1021 1021 uncompressed streaming protocol. This transfers about 40% more
1022 1022 data than a regular clone, but uses less memory and CPU on both
1023 1023 server and client. Over a LAN (100 Mbps or better) or a very fast
1024 1024 WAN, an uncompressed streaming clone is a lot faster (~10x) than a
1025 1025 regular clone. Over most WAN connections (anything slower than
1026 1026 about 6 Mbps), uncompressed streaming is slower, because of the
1027 1027 extra data transfer overhead. This mode will also temporarily hold
1028 1028 the write lock while determining what data to transfer.
1029 1029 Default is True.
1030 1030
1031 1031 ``preferuncompressed``
1032 1032 When set, clients will try to use the uncompressed streaming
1033 1033 protocol. Default is False.
1034 1034
1035 1035 ``validate``
1036 1036 Whether to validate the completeness of pushed changesets by
1037 1037 checking that all new file revisions specified in manifests are
1038 1038 present. Default is False.
1039 1039
1040 1040 ``smtp``
1041 1041 --------
1042 1042
1043 1043 Configuration for extensions that need to send email messages.
1044 1044
1045 1045 ``host``
1046 1046 Host name of mail server, e.g. "mail.example.com".
1047 1047
1048 1048 ``port``
1049 1049 Optional. Port to connect to on mail server. Default: 25.
1050 1050
1051 1051 ``tls``
1052 1052 Optional. Method to enable TLS when connecting to mail server: starttls,
1053 1053 smtps or none. Default: none.
1054 1054
1055 ``verifycert``
1056 Optional. Verification for the certificate of mail server, when
1057 ``tls`` is starttls or smtps. "strict", "loose" or False. For
1058 "strict" or "loose", the certificate is verified as same as the
1059 verification for HTTPS connections (see ``[hostfingerprints]`` and
1060 ``[web] cacerts`` also). For "strict", sending email is also
1061 aborted, if there is no configuration for mail server in
1062 ``[hostfingerprints]`` and ``[web] cacerts``. --insecure for
1063 :hg:`email` overwrites this as "loose". Default: "strict".
1064
1055 1065 ``username``
1056 1066 Optional. User name for authenticating with the SMTP server.
1057 1067 Default: none.
1058 1068
1059 1069 ``password``
1060 1070 Optional. Password for authenticating with the SMTP server. If not
1061 1071 specified, interactive sessions will prompt the user for a
1062 1072 password; non-interactive sessions will fail. Default: none.
1063 1073
1064 1074 ``local_hostname``
1065 1075 Optional. It's the hostname that the sender can use to identify
1066 1076 itself to the MTA.
1067 1077
1068 1078
1069 1079 ``subpaths``
1070 1080 ------------
1071 1081
1072 1082 Subrepository source URLs can go stale if a remote server changes name
1073 1083 or becomes temporarily unavailable. This section lets you define
1074 1084 rewrite rules of the form::
1075 1085
1076 1086 <pattern> = <replacement>
1077 1087
1078 1088 where ``pattern`` is a regular expression matching a subrepository
1079 1089 source URL and ``replacement`` is the replacement string used to
1080 1090 rewrite it. Groups can be matched in ``pattern`` and referenced in
1081 1091 ``replacements``. For instance::
1082 1092
1083 1093 http://server/(.*)-hg/ = http://hg.server/\1/
1084 1094
1085 1095 rewrites ``http://server/foo-hg/`` into ``http://hg.server/foo/``.
1086 1096
1087 1097 Relative subrepository paths are first made absolute, and the
1088 1098 rewrite rules are then applied on the full (absolute) path. The rules
1089 1099 are applied in definition order.
1090 1100
1091 1101 ``trusted``
1092 1102 -----------
1093 1103
1094 1104 Mercurial will not use the settings in the
1095 1105 ``.hg/hgrc`` file from a repository if it doesn't belong to a trusted
1096 1106 user or to a trusted group, as various hgrc features allow arbitrary
1097 1107 commands to be run. This issue is often encountered when configuring
1098 1108 hooks or extensions for shared repositories or servers. However,
1099 1109 the web interface will use some safe settings from the ``[web]``
1100 1110 section.
1101 1111
1102 1112 This section specifies what users and groups are trusted. The
1103 1113 current user is always trusted. To trust everybody, list a user or a
1104 1114 group with name ``*``. These settings must be placed in an
1105 1115 *already-trusted file* to take effect, such as ``$HOME/.hgrc`` of the
1106 1116 user or service running Mercurial.
1107 1117
1108 1118 ``users``
1109 1119 Comma-separated list of trusted users.
1110 1120
1111 1121 ``groups``
1112 1122 Comma-separated list of trusted groups.
1113 1123
1114 1124
1115 1125 ``ui``
1116 1126 ------
1117 1127
1118 1128 User interface controls.
1119 1129
1120 1130 ``archivemeta``
1121 1131 Whether to include the .hg_archival.txt file containing meta data
1122 1132 (hashes for the repository base and for tip) in archives created
1123 1133 by the :hg:`archive` command or downloaded via hgweb.
1124 1134 Default is True.
1125 1135
1126 1136 ``askusername``
1127 1137 Whether to prompt for a username when committing. If True, and
1128 1138 neither ``$HGUSER`` nor ``$EMAIL`` has been specified, then the user will
1129 1139 be prompted to enter a username. If no username is entered, the
1130 1140 default ``USER@HOST`` is used instead.
1131 1141 Default is False.
1132 1142
1133 1143 ``commitsubrepos``
1134 1144 Whether to commit modified subrepositories when committing the
1135 1145 parent repository. If False and one subrepository has uncommitted
1136 1146 changes, abort the commit.
1137 1147 Default is False.
1138 1148
1139 1149 ``debug``
1140 1150 Print debugging information. True or False. Default is False.
1141 1151
1142 1152 ``editor``
1143 1153 The editor to use during a commit. Default is ``$EDITOR`` or ``vi``.
1144 1154
1145 1155 ``fallbackencoding``
1146 1156 Encoding to try if it's not possible to decode the changelog using
1147 1157 UTF-8. Default is ISO-8859-1.
1148 1158
1149 1159 ``ignore``
1150 1160 A file to read per-user ignore patterns from. This file should be
1151 1161 in the same format as a repository-wide .hgignore file. This
1152 1162 option supports hook syntax, so if you want to specify multiple
1153 1163 ignore files, you can do so by setting something like
1154 1164 ``ignore.other = ~/.hgignore2``. For details of the ignore file
1155 1165 format, see the ``hgignore(5)`` man page.
1156 1166
1157 1167 ``interactive``
1158 1168 Allow to prompt the user. True or False. Default is True.
1159 1169
1160 1170 ``logtemplate``
1161 1171 Template string for commands that print changesets.
1162 1172
1163 1173 ``merge``
1164 1174 The conflict resolution program to use during a manual merge.
1165 1175 For more information on merge tools see :hg:`help merge-tools`.
1166 1176 For configuring merge tools see the ``[merge-tools]`` section.
1167 1177
1168 1178 ``portablefilenames``
1169 1179 Check for portable filenames. Can be ``warn``, ``ignore`` or ``abort``.
1170 1180 Default is ``warn``.
1171 1181 If set to ``warn`` (or ``true``), a warning message is printed on POSIX
1172 1182 platforms, if a file with a non-portable filename is added (e.g. a file
1173 1183 with a name that can't be created on Windows because it contains reserved
1174 1184 parts like ``AUX``, reserved characters like ``:``, or would cause a case
1175 1185 collision with an existing file).
1176 1186 If set to ``ignore`` (or ``false``), no warning is printed.
1177 1187 If set to ``abort``, the command is aborted.
1178 1188 On Windows, this configuration option is ignored and the command aborted.
1179 1189
1180 1190 ``quiet``
1181 1191 Reduce the amount of output printed. True or False. Default is False.
1182 1192
1183 1193 ``remotecmd``
1184 1194 remote command to use for clone/push/pull operations. Default is ``hg``.
1185 1195
1186 1196 ``reportoldssl``
1187 1197 Warn if an SSL certificate is unable to be due to using Python
1188 1198 2.5 or earlier. True or False. Default is True.
1189 1199
1190 1200 ``report_untrusted``
1191 1201 Warn if a ``.hg/hgrc`` file is ignored due to not being owned by a
1192 1202 trusted user or group. True or False. Default is True.
1193 1203
1194 1204 ``slash``
1195 1205 Display paths using a slash (``/``) as the path separator. This
1196 1206 only makes a difference on systems where the default path
1197 1207 separator is not the slash character (e.g. Windows uses the
1198 1208 backslash character (``\``)).
1199 1209 Default is False.
1200 1210
1201 1211 ``ssh``
1202 1212 command to use for SSH connections. Default is ``ssh``.
1203 1213
1204 1214 ``strict``
1205 1215 Require exact command names, instead of allowing unambiguous
1206 1216 abbreviations. True or False. Default is False.
1207 1217
1208 1218 ``style``
1209 1219 Name of style to use for command output.
1210 1220
1211 1221 ``timeout``
1212 1222 The timeout used when a lock is held (in seconds), a negative value
1213 1223 means no timeout. Default is 600.
1214 1224
1215 1225 ``traceback``
1216 1226 Mercurial always prints a traceback when an unknown exception
1217 1227 occurs. Setting this to True will make Mercurial print a traceback
1218 1228 on all exceptions, even those recognized by Mercurial (such as
1219 1229 IOError or MemoryError). Default is False.
1220 1230
1221 1231 ``username``
1222 1232 The committer of a changeset created when running "commit".
1223 1233 Typically a person's name and email address, e.g. ``Fred Widget
1224 1234 <fred@example.com>``. Default is ``$EMAIL`` or ``username@hostname``. If
1225 1235 the username in hgrc is empty, it has to be specified manually or
1226 1236 in a different hgrc file (e.g. ``$HOME/.hgrc``, if the admin set
1227 1237 ``username =`` in the system hgrc). Environment variables in the
1228 1238 username are expanded.
1229 1239
1230 1240 ``verbose``
1231 1241 Increase the amount of output printed. True or False. Default is False.
1232 1242
1233 1243
1234 1244 ``web``
1235 1245 -------
1236 1246
1237 1247 Web interface configuration. The settings in this section apply to
1238 1248 both the builtin webserver (started by :hg:`serve`) and the script you
1239 1249 run through a webserver (``hgweb.cgi`` and the derivatives for FastCGI
1240 1250 and WSGI).
1241 1251
1242 1252 The Mercurial webserver does no authentication (it does not prompt for
1243 1253 usernames and passwords to validate *who* users are), but it does do
1244 1254 authorization (it grants or denies access for *authenticated users*
1245 1255 based on settings in this section). You must either configure your
1246 1256 webserver to do authentication for you, or disable the authorization
1247 1257 checks.
1248 1258
1249 1259 For a quick setup in a trusted environment, e.g., a private LAN, where
1250 1260 you want it to accept pushes from anybody, you can use the following
1251 1261 command line::
1252 1262
1253 1263 $ hg --config web.allow_push=* --config web.push_ssl=False serve
1254 1264
1255 1265 Note that this will allow anybody to push anything to the server and
1256 1266 that this should not be used for public servers.
1257 1267
1258 1268 The full set of options is:
1259 1269
1260 1270 ``accesslog``
1261 1271 Where to output the access log. Default is stdout.
1262 1272
1263 1273 ``address``
1264 1274 Interface address to bind to. Default is all.
1265 1275
1266 1276 ``allow_archive``
1267 1277 List of archive format (bz2, gz, zip) allowed for downloading.
1268 1278 Default is empty.
1269 1279
1270 1280 ``allowbz2``
1271 1281 (DEPRECATED) Whether to allow .tar.bz2 downloading of repository
1272 1282 revisions.
1273 1283 Default is False.
1274 1284
1275 1285 ``allowgz``
1276 1286 (DEPRECATED) Whether to allow .tar.gz downloading of repository
1277 1287 revisions.
1278 1288 Default is False.
1279 1289
1280 1290 ``allowpull``
1281 1291 Whether to allow pulling from the repository. Default is True.
1282 1292
1283 1293 ``allow_push``
1284 1294 Whether to allow pushing to the repository. If empty or not set,
1285 1295 push is not allowed. If the special value ``*``, any remote user can
1286 1296 push, including unauthenticated users. Otherwise, the remote user
1287 1297 must have been authenticated, and the authenticated user name must
1288 1298 be present in this list. The contents of the allow_push list are
1289 1299 examined after the deny_push list.
1290 1300
1291 1301 ``allow_read``
1292 1302 If the user has not already been denied repository access due to
1293 1303 the contents of deny_read, this list determines whether to grant
1294 1304 repository access to the user. If this list is not empty, and the
1295 1305 user is unauthenticated or not present in the list, then access is
1296 1306 denied for the user. If the list is empty or not set, then access
1297 1307 is permitted to all users by default. Setting allow_read to the
1298 1308 special value ``*`` is equivalent to it not being set (i.e. access
1299 1309 is permitted to all users). The contents of the allow_read list are
1300 1310 examined after the deny_read list.
1301 1311
1302 1312 ``allowzip``
1303 1313 (DEPRECATED) Whether to allow .zip downloading of repository
1304 1314 revisions. Default is False. This feature creates temporary files.
1305 1315
1306 1316 ``archivesubrepos``
1307 1317 Whether to recurse into subrepositories when archiving. Default is
1308 1318 False.
1309 1319
1310 1320 ``baseurl``
1311 1321 Base URL to use when publishing URLs in other locations, so
1312 1322 third-party tools like email notification hooks can construct
1313 1323 URLs. Example: ``http://hgserver/repos/``.
1314 1324
1315 1325 ``cacerts``
1316 1326 Path to file containing a list of PEM encoded certificate
1317 1327 authority certificates. Environment variables and ``~user``
1318 1328 constructs are expanded in the filename. If specified on the
1319 1329 client, then it will verify the identity of remote HTTPS servers
1320 1330 with these certificates.
1321 1331
1322 1332 This feature is only supported when using Python 2.6 or later. If you wish
1323 1333 to use it with earlier versions of Python, install the backported
1324 1334 version of the ssl library that is available from
1325 1335 ``http://pypi.python.org``.
1326 1336
1327 1337 To disable SSL verification temporarily, specify ``--insecure`` from
1328 1338 command line.
1329 1339
1330 1340 You can use OpenSSL's CA certificate file if your platform has
1331 1341 one. On most Linux systems this will be
1332 1342 ``/etc/ssl/certs/ca-certificates.crt``. Otherwise you will have to
1333 1343 generate this file manually. The form must be as follows::
1334 1344
1335 1345 -----BEGIN CERTIFICATE-----
1336 1346 ... (certificate in base64 PEM encoding) ...
1337 1347 -----END CERTIFICATE-----
1338 1348 -----BEGIN CERTIFICATE-----
1339 1349 ... (certificate in base64 PEM encoding) ...
1340 1350 -----END CERTIFICATE-----
1341 1351
1342 1352 ``cache``
1343 1353 Whether to support caching in hgweb. Defaults to True.
1344 1354
1345 1355 ``collapse``
1346 1356 With ``descend`` enabled, repositories in subdirectories are shown at
1347 1357 a single level alongside repositories in the current path. With
1348 1358 ``collapse`` also enabled, repositories residing at a deeper level than
1349 1359 the current path are grouped behind navigable directory entries that
1350 1360 lead to the locations of these repositories. In effect, this setting
1351 1361 collapses each collection of repositories found within a subdirectory
1352 1362 into a single entry for that subdirectory. Default is False.
1353 1363
1354 1364 ``comparisoncontext``
1355 1365 Number of lines of context to show in side-by-side file comparison. If
1356 1366 negative or the value ``full``, whole files are shown. Default is 5.
1357 1367 This setting can be overridden by a ``context`` request parameter to the
1358 1368 ``comparison`` command, taking the same values.
1359 1369
1360 1370 ``contact``
1361 1371 Name or email address of the person in charge of the repository.
1362 1372 Defaults to ui.username or ``$EMAIL`` or "unknown" if unset or empty.
1363 1373
1364 1374 ``deny_push``
1365 1375 Whether to deny pushing to the repository. If empty or not set,
1366 1376 push is not denied. If the special value ``*``, all remote users are
1367 1377 denied push. Otherwise, unauthenticated users are all denied, and
1368 1378 any authenticated user name present in this list is also denied. The
1369 1379 contents of the deny_push list are examined before the allow_push list.
1370 1380
1371 1381 ``deny_read``
1372 1382 Whether to deny reading/viewing of the repository. If this list is
1373 1383 not empty, unauthenticated users are all denied, and any
1374 1384 authenticated user name present in this list is also denied access to
1375 1385 the repository. If set to the special value ``*``, all remote users
1376 1386 are denied access (rarely needed ;). If deny_read is empty or not set,
1377 1387 the determination of repository access depends on the presence and
1378 1388 content of the allow_read list (see description). If both
1379 1389 deny_read and allow_read are empty or not set, then access is
1380 1390 permitted to all users by default. If the repository is being
1381 1391 served via hgwebdir, denied users will not be able to see it in
1382 1392 the list of repositories. The contents of the deny_read list have
1383 1393 priority over (are examined before) the contents of the allow_read
1384 1394 list.
1385 1395
1386 1396 ``descend``
1387 1397 hgwebdir indexes will not descend into subdirectories. Only repositories
1388 1398 directly in the current path will be shown (other repositories are still
1389 1399 available from the index corresponding to their containing path).
1390 1400
1391 1401 ``description``
1392 1402 Textual description of the repository's purpose or contents.
1393 1403 Default is "unknown".
1394 1404
1395 1405 ``encoding``
1396 1406 Character encoding name. Default is the current locale charset.
1397 1407 Example: "UTF-8"
1398 1408
1399 1409 ``errorlog``
1400 1410 Where to output the error log. Default is stderr.
1401 1411
1402 1412 ``guessmime``
1403 1413 Control MIME types for raw download of file content.
1404 1414 Set to True to let hgweb guess the content type from the file
1405 1415 extension. This will serve HTML files as ``text/html`` and might
1406 1416 allow cross-site scripting attacks when serving untrusted
1407 1417 repositories. Default is False.
1408 1418
1409 1419 ``hidden``
1410 1420 Whether to hide the repository in the hgwebdir index.
1411 1421 Default is False.
1412 1422
1413 1423 ``ipv6``
1414 1424 Whether to use IPv6. Default is False.
1415 1425
1416 1426 ``logoimg``
1417 1427 File name of the logo image that some templates display on each page.
1418 1428 The file name is relative to ``staticurl``. That is, the full path to
1419 1429 the logo image is "staticurl/logoimg".
1420 1430 If unset, ``hglogo.png`` will be used.
1421 1431
1422 1432 ``logourl``
1423 1433 Base URL to use for logos. If unset, ``http://mercurial.selenic.com/``
1424 1434 will be used.
1425 1435
1426 1436 ``maxchanges``
1427 1437 Maximum number of changes to list on the changelog. Default is 10.
1428 1438
1429 1439 ``maxfiles``
1430 1440 Maximum number of files to list per changeset. Default is 10.
1431 1441
1432 1442 ``maxshortchanges``
1433 1443 Maximum number of changes to list on the shortlog, graph or filelog
1434 1444 pages. Default is 60.
1435 1445
1436 1446 ``name``
1437 1447 Repository name to use in the web interface. Default is current
1438 1448 working directory.
1439 1449
1440 1450 ``port``
1441 1451 Port to listen on. Default is 8000.
1442 1452
1443 1453 ``prefix``
1444 1454 Prefix path to serve from. Default is '' (server root).
1445 1455
1446 1456 ``push_ssl``
1447 1457 Whether to require that inbound pushes be transported over SSL to
1448 1458 prevent password sniffing. Default is True.
1449 1459
1450 1460 ``staticurl``
1451 1461 Base URL to use for static files. If unset, static files (e.g. the
1452 1462 hgicon.png favicon) will be served by the CGI script itself. Use
1453 1463 this setting to serve them directly with the HTTP server.
1454 1464 Example: ``http://hgserver/static/``.
1455 1465
1456 1466 ``stripes``
1457 1467 How many lines a "zebra stripe" should span in multi-line output.
1458 1468 Default is 1; set to 0 to disable.
1459 1469
1460 1470 ``style``
1461 1471 Which template map style to use.
1462 1472
1463 1473 ``templates``
1464 1474 Where to find the HTML templates. Default is install path.
1465 1475
1466 1476 ``websub``
1467 1477 ----------
1468 1478
1469 1479 Web substitution filter definition. You can use this section to
1470 1480 define a set of regular expression substitution patterns which
1471 1481 let you automatically modify the hgweb server output.
1472 1482
1473 1483 The default hgweb templates only apply these substitution patterns
1474 1484 on the revision description fields. You can apply them anywhere
1475 1485 you want when you create your own templates by adding calls to the
1476 1486 "websub" filter (usually after calling the "escape" filter).
1477 1487
1478 1488 This can be used, for example, to convert issue references to links
1479 1489 to your issue tracker, or to convert "markdown-like" syntax into
1480 1490 HTML (see the examples below).
1481 1491
1482 1492 Each entry in this section names a substitution filter.
1483 1493 The value of each entry defines the substitution expression itself.
1484 1494 The websub expressions follow the old interhg extension syntax,
1485 1495 which in turn imitates the Unix sed replacement syntax::
1486 1496
1487 1497 pattername = s/SEARCH_REGEX/REPLACE_EXPRESSION/[i]
1488 1498
1489 1499 You can use any separator other than "/". The final "i" is optional
1490 1500 and indicates that the search must be case insensitive.
1491 1501
1492 1502 Examples::
1493 1503
1494 1504 [websub]
1495 1505 issues = s|issue(\d+)|<a href="http://bts.example.org/issue\1">issue\1</a>|i
1496 1506 italic = s/\b_(\S+)_\b/<i>\1<\/i>/
1497 1507 bold = s/\*\b(\S+)\b\*/<b>\1<\/b>/
1498 1508
1499 1509 ``worker``
1500 1510 ----------
1501 1511
1502 1512 Parallel master/worker configuration. We currently perform working
1503 1513 directory updates in parallel on Unix-like systems, which greatly
1504 1514 helps performance.
1505 1515
1506 1516 ``numcpus``
1507 1517 Number of CPUs to use for parallel operations. Default is 4 or the
1508 1518 number of CPUs on the system, whichever is larger. A zero or
1509 1519 negative value is treated as ``use the default``.
@@ -1,308 +1,322
1 1 # mail.py - mail sending bits for mercurial
2 2 #
3 3 # Copyright 2006 Matt Mackall <mpm@selenic.com>
4 4 #
5 5 # This software may be used and distributed according to the terms of the
6 6 # GNU General Public License version 2 or any later version.
7 7
8 8 from i18n import _
9 9 import util, encoding, sslutil
10 10 import os, smtplib, socket, quopri, time
11 11 import email.Header, email.MIMEText, email.Utils
12 12
13 13 _oldheaderinit = email.Header.Header.__init__
14 14 def _unifiedheaderinit(self, *args, **kw):
15 15 """
16 16 Python 2.7 introduces a backwards incompatible change
17 17 (Python issue1974, r70772) in email.Generator.Generator code:
18 18 pre-2.7 code passed "continuation_ws='\t'" to the Header
19 19 constructor, and 2.7 removed this parameter.
20 20
21 21 Default argument is continuation_ws=' ', which means that the
22 22 behaviour is different in <2.7 and 2.7
23 23
24 24 We consider the 2.7 behaviour to be preferable, but need
25 25 to have an unified behaviour for versions 2.4 to 2.7
26 26 """
27 27 # override continuation_ws
28 28 kw['continuation_ws'] = ' '
29 29 _oldheaderinit(self, *args, **kw)
30 30
31 31 email.Header.Header.__dict__['__init__'] = _unifiedheaderinit
32 32
33 33 class STARTTLS(smtplib.SMTP):
34 34 '''Derived class to verify the peer certificate for STARTTLS.
35 35
36 36 This class allows to pass any keyword arguments to SSL socket creation.
37 37 '''
38 38 def __init__(self, sslkwargs, **kwargs):
39 39 smtplib.SMTP.__init__(self, **kwargs)
40 40 self._sslkwargs = sslkwargs
41 41
42 42 def starttls(self, keyfile=None, certfile=None):
43 43 if not self.has_extn("starttls"):
44 44 msg = "STARTTLS extension not supported by server"
45 45 raise smtplib.SMTPException(msg)
46 46 (resp, reply) = self.docmd("STARTTLS")
47 47 if resp == 220:
48 48 self.sock = sslutil.ssl_wrap_socket(self.sock, keyfile, certfile,
49 49 **self._sslkwargs)
50 50 if not util.safehasattr(self.sock, "read"):
51 51 # using httplib.FakeSocket with Python 2.5.x or earlier
52 52 self.sock.read = self.sock.recv
53 53 self.file = smtplib.SSLFakeFile(self.sock)
54 54 self.helo_resp = None
55 55 self.ehlo_resp = None
56 56 self.esmtp_features = {}
57 57 self.does_esmtp = 0
58 58 return (resp, reply)
59 59
60 60 if util.safehasattr(smtplib.SMTP, '_get_socket'):
61 61 class SMTPS(smtplib.SMTP):
62 62 '''Derived class to verify the peer certificate for SMTPS.
63 63
64 64 This class allows to pass any keyword arguments to SSL socket creation.
65 65 '''
66 66 def __init__(self, sslkwargs, keyfile=None, certfile=None, **kwargs):
67 67 self.keyfile = keyfile
68 68 self.certfile = certfile
69 69 smtplib.SMTP.__init__(self, **kwargs)
70 70 self.default_port = smtplib.SMTP_SSL_PORT
71 71 self._sslkwargs = sslkwargs
72 72
73 73 def _get_socket(self, host, port, timeout):
74 74 if self.debuglevel > 0:
75 75 print >> stderr, 'connect:', (host, port)
76 76 new_socket = socket.create_connection((host, port), timeout)
77 77 new_socket = sslutil.ssl_wrap_socket(new_socket,
78 78 self.keyfile, self.certfile,
79 79 **self._sslkwargs)
80 80 self.file = smtplib.SSLFakeFile(new_socket)
81 81 return new_socket
82 82 else:
83 83 def SMTPS(sslkwargs, keyfile=None, certfile=None, **kwargs):
84 84 raise util.Abort(_('SMTPS requires Python 2.6 or later'))
85 85
86 86 def _smtp(ui):
87 87 '''build an smtp connection and return a function to send mail'''
88 88 local_hostname = ui.config('smtp', 'local_hostname')
89 89 tls = ui.config('smtp', 'tls', 'none')
90 90 # backward compatible: when tls = true, we use starttls.
91 91 starttls = tls == 'starttls' or util.parsebool(tls)
92 92 smtps = tls == 'smtps'
93 93 if (starttls or smtps) and not util.safehasattr(socket, 'ssl'):
94 94 raise util.Abort(_("can't use TLS: Python SSL support not installed"))
95 if smtps:
96 ui.note(_('(using smtps)\n'))
97 s = smtplib.SMTP_SSL(local_hostname=local_hostname)
98 else:
99 s = smtplib.SMTP(local_hostname=local_hostname)
100 95 mailhost = ui.config('smtp', 'host')
101 96 if not mailhost:
102 97 raise util.Abort(_('smtp.host not configured - cannot send mail'))
98 verifycert = ui.config('smtp', 'verifycert', 'strict')
99 if verifycert not in ['strict', 'loose']:
100 if util.parsebool(verifycert) is not False:
101 raise util.Abort(_('invalid smtp.verifycert configuration: %s')
102 % (verifycert))
103 if (starttls or smtps) and verifycert:
104 sslkwargs = sslutil.sslkwargs(ui, mailhost)
105 else:
106 sslkwargs = {}
107 if smtps:
108 ui.note(_('(using smtps)\n'))
109 s = SMTPS(sslkwargs, local_hostname=local_hostname)
110 elif starttls:
111 s = STARTTLS(sslkwargs, local_hostname=local_hostname)
112 else:
113 s = smtplib.SMTP(local_hostname=local_hostname)
103 114 mailport = util.getport(ui.config('smtp', 'port', 25))
104 115 ui.note(_('sending mail: smtp host %s, port %s\n') %
105 116 (mailhost, mailport))
106 117 s.connect(host=mailhost, port=mailport)
107 118 if starttls:
108 119 ui.note(_('(using starttls)\n'))
109 120 s.ehlo()
110 121 s.starttls()
111 122 s.ehlo()
123 if (starttls or smtps) and verifycert:
124 ui.note(_('(verifying remote certificate)\n'))
125 sslutil.validator(ui, mailhost)(s.sock, verifycert == 'strict')
112 126 username = ui.config('smtp', 'username')
113 127 password = ui.config('smtp', 'password')
114 128 if username and not password:
115 129 password = ui.getpass()
116 130 if username and password:
117 131 ui.note(_('(authenticating to mail server as %s)\n') %
118 132 (username))
119 133 try:
120 134 s.login(username, password)
121 135 except smtplib.SMTPException, inst:
122 136 raise util.Abort(inst)
123 137
124 138 def send(sender, recipients, msg):
125 139 try:
126 140 return s.sendmail(sender, recipients, msg)
127 141 except smtplib.SMTPRecipientsRefused, inst:
128 142 recipients = [r[1] for r in inst.recipients.values()]
129 143 raise util.Abort('\n' + '\n'.join(recipients))
130 144 except smtplib.SMTPException, inst:
131 145 raise util.Abort(inst)
132 146
133 147 return send
134 148
135 149 def _sendmail(ui, sender, recipients, msg):
136 150 '''send mail using sendmail.'''
137 151 program = ui.config('email', 'method')
138 152 cmdline = '%s -f %s %s' % (program, util.email(sender),
139 153 ' '.join(map(util.email, recipients)))
140 154 ui.note(_('sending mail: %s\n') % cmdline)
141 155 fp = util.popen(cmdline, 'w')
142 156 fp.write(msg)
143 157 ret = fp.close()
144 158 if ret:
145 159 raise util.Abort('%s %s' % (
146 160 os.path.basename(program.split(None, 1)[0]),
147 161 util.explainexit(ret)[0]))
148 162
149 163 def _mbox(mbox, sender, recipients, msg):
150 164 '''write mails to mbox'''
151 165 fp = open(mbox, 'ab+')
152 166 # Should be time.asctime(), but Windows prints 2-characters day
153 167 # of month instead of one. Make them print the same thing.
154 168 date = time.strftime('%a %b %d %H:%M:%S %Y', time.localtime())
155 169 fp.write('From %s %s\n' % (sender, date))
156 170 fp.write(msg)
157 171 fp.write('\n\n')
158 172 fp.close()
159 173
160 174 def connect(ui, mbox=None):
161 175 '''make a mail connection. return a function to send mail.
162 176 call as sendmail(sender, list-of-recipients, msg).'''
163 177 if mbox:
164 178 open(mbox, 'wb').close()
165 179 return lambda s, r, m: _mbox(mbox, s, r, m)
166 180 if ui.config('email', 'method', 'smtp') == 'smtp':
167 181 return _smtp(ui)
168 182 return lambda s, r, m: _sendmail(ui, s, r, m)
169 183
170 184 def sendmail(ui, sender, recipients, msg, mbox=None):
171 185 send = connect(ui, mbox=mbox)
172 186 return send(sender, recipients, msg)
173 187
174 188 def validateconfig(ui):
175 189 '''determine if we have enough config data to try sending email.'''
176 190 method = ui.config('email', 'method', 'smtp')
177 191 if method == 'smtp':
178 192 if not ui.config('smtp', 'host'):
179 193 raise util.Abort(_('smtp specified as email transport, '
180 194 'but no smtp host configured'))
181 195 else:
182 196 if not util.findexe(method):
183 197 raise util.Abort(_('%r specified as email transport, '
184 198 'but not in PATH') % method)
185 199
186 200 def mimetextpatch(s, subtype='plain', display=False):
187 201 '''Return MIME message suitable for a patch.
188 202 Charset will be detected as utf-8 or (possibly fake) us-ascii.
189 203 Transfer encodings will be used if necessary.'''
190 204
191 205 cs = 'us-ascii'
192 206 if not display:
193 207 try:
194 208 s.decode('us-ascii')
195 209 except UnicodeDecodeError:
196 210 try:
197 211 s.decode('utf-8')
198 212 cs = 'utf-8'
199 213 except UnicodeDecodeError:
200 214 # We'll go with us-ascii as a fallback.
201 215 pass
202 216
203 217 return mimetextqp(s, subtype, cs)
204 218
205 219 def mimetextqp(body, subtype, charset):
206 220 '''Return MIME message.
207 221 Quoted-printable transfer encoding will be used if necessary.
208 222 '''
209 223 enc = None
210 224 for line in body.splitlines():
211 225 if len(line) > 950:
212 226 body = quopri.encodestring(body)
213 227 enc = "quoted-printable"
214 228 break
215 229
216 230 msg = email.MIMEText.MIMEText(body, subtype, charset)
217 231 if enc:
218 232 del msg['Content-Transfer-Encoding']
219 233 msg['Content-Transfer-Encoding'] = enc
220 234 return msg
221 235
222 236 def _charsets(ui):
223 237 '''Obtains charsets to send mail parts not containing patches.'''
224 238 charsets = [cs.lower() for cs in ui.configlist('email', 'charsets')]
225 239 fallbacks = [encoding.fallbackencoding.lower(),
226 240 encoding.encoding.lower(), 'utf-8']
227 241 for cs in fallbacks: # find unique charsets while keeping order
228 242 if cs not in charsets:
229 243 charsets.append(cs)
230 244 return [cs for cs in charsets if not cs.endswith('ascii')]
231 245
232 246 def _encode(ui, s, charsets):
233 247 '''Returns (converted) string, charset tuple.
234 248 Finds out best charset by cycling through sendcharsets in descending
235 249 order. Tries both encoding and fallbackencoding for input. Only as
236 250 last resort send as is in fake ascii.
237 251 Caveat: Do not use for mail parts containing patches!'''
238 252 try:
239 253 s.decode('ascii')
240 254 except UnicodeDecodeError:
241 255 sendcharsets = charsets or _charsets(ui)
242 256 for ics in (encoding.encoding, encoding.fallbackencoding):
243 257 try:
244 258 u = s.decode(ics)
245 259 except UnicodeDecodeError:
246 260 continue
247 261 for ocs in sendcharsets:
248 262 try:
249 263 return u.encode(ocs), ocs
250 264 except UnicodeEncodeError:
251 265 pass
252 266 except LookupError:
253 267 ui.warn(_('ignoring invalid sendcharset: %s\n') % ocs)
254 268 # if ascii, or all conversion attempts fail, send (broken) ascii
255 269 return s, 'us-ascii'
256 270
257 271 def headencode(ui, s, charsets=None, display=False):
258 272 '''Returns RFC-2047 compliant header from given string.'''
259 273 if not display:
260 274 # split into words?
261 275 s, cs = _encode(ui, s, charsets)
262 276 return str(email.Header.Header(s, cs))
263 277 return s
264 278
265 279 def _addressencode(ui, name, addr, charsets=None):
266 280 name = headencode(ui, name, charsets)
267 281 try:
268 282 acc, dom = addr.split('@')
269 283 acc = acc.encode('ascii')
270 284 dom = dom.decode(encoding.encoding).encode('idna')
271 285 addr = '%s@%s' % (acc, dom)
272 286 except UnicodeDecodeError:
273 287 raise util.Abort(_('invalid email address: %s') % addr)
274 288 except ValueError:
275 289 try:
276 290 # too strict?
277 291 addr = addr.encode('ascii')
278 292 except UnicodeDecodeError:
279 293 raise util.Abort(_('invalid local address: %s') % addr)
280 294 return email.Utils.formataddr((name, addr))
281 295
282 296 def addressencode(ui, address, charsets=None, display=False):
283 297 '''Turns address into RFC-2047 compliant header.'''
284 298 if display or not address:
285 299 return address or ''
286 300 name, addr = email.Utils.parseaddr(address)
287 301 return _addressencode(ui, name, addr, charsets)
288 302
289 303 def addrlistencode(ui, addrs, charsets=None, display=False):
290 304 '''Turns a list of addresses into a list of RFC-2047 compliant headers.
291 305 A single element of input list may contain multiple addresses, but output
292 306 always has one address per item'''
293 307 if display:
294 308 return [a.strip() for a in addrs if a.strip()]
295 309
296 310 result = []
297 311 for name, addr in email.Utils.getaddresses(addrs):
298 312 if name or addr:
299 313 result.append(_addressencode(ui, name, addr, charsets))
300 314 return result
301 315
302 316 def mimeencode(ui, s, charsets=None, display=False):
303 317 '''creates mime text object, encodes it if needed, and sets
304 318 charset and transfer-encoding accordingly.'''
305 319 cs = 'us-ascii'
306 320 if not display:
307 321 s, cs = _encode(ui, s, charsets)
308 322 return mimetextqp(s, 'plain', cs)
General Comments 0
You need to be logged in to leave comments. Login now