Mercurial > hg
comparison hgext/patchbomb.py @ 7615:ab39d1813e51
patch: export shouldn't close files received as a parameter
We rely on __del__ to close the fd instead. Patchbomb was relying
on this behaviour, fix it.
Thanks to Manuel Barkhau for reporting it.
author | Benoit Boissinot <benoit.boissinot@ens-lyon.org> |
---|---|
date | Fri, 09 Jan 2009 01:36:35 +0100 |
parents | f7739cf3833c |
children | b9bd6f789633 |
comparison
equal
deleted
inserted
replaced
7611:dafcc96c1285 | 7615:ab39d1813e51 |
---|---|
61 That should be all. Now your patchbomb is on its way out.''' | 61 That should be all. Now your patchbomb is on its way out.''' |
62 | 62 |
63 import os, errno, socket, tempfile, cStringIO | 63 import os, errno, socket, tempfile, cStringIO |
64 import email.MIMEMultipart, email.MIMEBase | 64 import email.MIMEMultipart, email.MIMEBase |
65 import email.Utils, email.Encoders, email.Generator | 65 import email.Utils, email.Encoders, email.Generator |
66 from mercurial import cmdutil, commands, hg, mail, patch, util | 66 from mercurial import cmdutil, commands, hg, mail, mdiff, patch, util |
67 from mercurial.i18n import _ | 67 from mercurial.i18n import _ |
68 from mercurial.node import bin | 68 from mercurial.node import bin |
69 | |
70 class exportee: | |
71 def __init__(self, container): | |
72 self.lines = [] | |
73 self.container = container | |
74 self.name = 'email' | |
75 | |
76 def write(self, data): | |
77 self.lines.append(data) | |
78 | |
79 def close(self): | |
80 self.container.append(''.join(self.lines).split('\n')) | |
81 self.lines = [] | |
82 | 69 |
83 def prompt(ui, prompt, default=None, rest=': ', empty_ok=False): | 70 def prompt(ui, prompt, default=None, rest=': ', empty_ok=False): |
84 if not ui.interactive: | 71 if not ui.interactive: |
85 return default | 72 return default |
86 if default: | 73 if default: |
232 ui.status(_("no changes found\n")) | 219 ui.status(_("no changes found\n")) |
233 return [] | 220 return [] |
234 o = repo.changelog.nodesbetween(o, revs or None)[0] | 221 o = repo.changelog.nodesbetween(o, revs or None)[0] |
235 return [str(repo.changelog.rev(r)) for r in o] | 222 return [str(repo.changelog.rev(r)) for r in o] |
236 | 223 |
224 def getpatches(revs): | |
225 for r in cmdutil.revrange(repo, revs): | |
226 output = cStringIO.StringIO() | |
227 p = patch.export(repo, [r], fp=output, | |
228 opts=mdiff.diffopts(git=opts.get('git'))) | |
229 yield output.getvalue().split('\n') | |
230 | |
237 def getbundle(dest): | 231 def getbundle(dest): |
238 tmpdir = tempfile.mkdtemp(prefix='hg-email-bundle-') | 232 tmpdir = tempfile.mkdtemp(prefix='hg-email-bundle-') |
239 tmpfn = os.path.join(tmpdir, 'bundle') | 233 tmpfn = os.path.join(tmpdir, 'bundle') |
240 try: | 234 try: |
241 commands.bundle(ui, repo, tmpfn, dest, **opts) | 235 commands.bundle(ui, repo, tmpfn, dest, **opts) |
353 | 347 |
354 sender = (opts.get('from') or ui.config('email', 'from') or | 348 sender = (opts.get('from') or ui.config('email', 'from') or |
355 ui.config('patchbomb', 'from') or | 349 ui.config('patchbomb', 'from') or |
356 prompt(ui, 'From', ui.username())) | 350 prompt(ui, 'From', ui.username())) |
357 | 351 |
352 # internal option used by pbranches | |
358 patches = opts.get('patches') | 353 patches = opts.get('patches') |
359 if patches: | 354 if patches: |
360 msgs = getpatchmsgs(patches, opts.get('patchnames')) | 355 msgs = getpatchmsgs(patches, opts.get('patchnames')) |
361 elif opts.get('bundle'): | 356 elif opts.get('bundle'): |
362 msgs = getbundlemsgs(getbundle(dest)) | 357 msgs = getbundlemsgs(getbundle(dest)) |
363 else: | 358 else: |
364 patches = [] | 359 msgs = getpatchmsgs(list(getpatches(revs))) |
365 commands.export(ui, repo, *revs, **{'output': exportee(patches), | |
366 'switch_parent': False, | |
367 'text': None, | |
368 'git': opts.get('git')}) | |
369 msgs = getpatchmsgs(patches) | |
370 | 360 |
371 def getaddrs(opt, prpt, default = None): | 361 def getaddrs(opt, prpt, default = None): |
372 addrs = opts.get(opt) or (ui.config('email', opt) or | 362 addrs = opts.get(opt) or (ui.config('email', opt) or |
373 ui.config('patchbomb', opt) or | 363 ui.config('patchbomb', opt) or |
374 prompt(ui, prpt, default)).split(',') | 364 prompt(ui, prpt, default)).split(',') |