comparison mercurial/cmdutil.py @ 18613:1a2f4c633410

export: clobber files with -o (bc) (issue3652) This violated user expectation. Updated the code to clobber files, but preserve the behavior of appending multiple patches requested in a single export. Includes tests.
author Augie Fackler <raf@durin42.com>
date Sat, 09 Feb 2013 15:38:57 -0600
parents 94317c2d53b8
children 76b69cccb07a
comparison
equal deleted inserted replaced
18612:0b6e6eacc939 18613:1a2f4c633410
168 except KeyError, inst: 168 except KeyError, inst:
169 raise util.Abort(_("invalid format spec '%%%s' in output filename") % 169 raise util.Abort(_("invalid format spec '%%%s' in output filename") %
170 inst.args[0]) 170 inst.args[0])
171 171
172 def makefileobj(repo, pat, node=None, desc=None, total=None, 172 def makefileobj(repo, pat, node=None, desc=None, total=None,
173 seqno=None, revwidth=None, mode='wb', pathname=None): 173 seqno=None, revwidth=None, mode='wb', modemap={},
174 pathname=None):
174 175
175 writable = mode not in ('r', 'rb') 176 writable = mode not in ('r', 'rb')
176 177
177 if not pat or pat == '-': 178 if not pat or pat == '-':
178 fp = writable and repo.ui.fout or repo.ui.fin 179 fp = writable and repo.ui.fout or repo.ui.fin
194 return wrappedfileobj(fp) 195 return wrappedfileobj(fp)
195 if util.safehasattr(pat, 'write') and writable: 196 if util.safehasattr(pat, 'write') and writable:
196 return pat 197 return pat
197 if util.safehasattr(pat, 'read') and 'r' in mode: 198 if util.safehasattr(pat, 'read') and 'r' in mode:
198 return pat 199 return pat
199 return open(makefilename(repo, pat, node, desc, total, seqno, revwidth, 200 fn = makefilename(repo, pat, node, desc, total, seqno, revwidth, pathname)
200 pathname), 201 mode = modemap.get(fn, mode)
201 mode) 202 if mode == 'wb':
203 modemap[fn] = 'ab'
204 return open(fn, mode)
202 205
203 def openrevlog(repo, cmd, file_, opts): 206 def openrevlog(repo, cmd, file_, opts):
204 """opens the changelog, manifest, a filelog or a given revlog""" 207 """opens the changelog, manifest, a filelog or a given revlog"""
205 cl = opts['changelog'] 208 cl = opts['changelog']
206 mf = opts['manifest'] 209 mf = opts['manifest']
537 opts=None): 540 opts=None):
538 '''export changesets as hg patches.''' 541 '''export changesets as hg patches.'''
539 542
540 total = len(revs) 543 total = len(revs)
541 revwidth = max([len(str(rev)) for rev in revs]) 544 revwidth = max([len(str(rev)) for rev in revs])
545 filemode = {}
542 546
543 def single(rev, seqno, fp): 547 def single(rev, seqno, fp):
544 ctx = repo[rev] 548 ctx = repo[rev]
545 node = ctx.node() 549 node = ctx.node()
546 parents = [p.node() for p in ctx.parents() if p] 550 parents = [p.node() for p in ctx.parents() if p]
552 shouldclose = False 556 shouldclose = False
553 if not fp and len(template) > 0: 557 if not fp and len(template) > 0:
554 desc_lines = ctx.description().rstrip().split('\n') 558 desc_lines = ctx.description().rstrip().split('\n')
555 desc = desc_lines[0] #Commit always has a first line. 559 desc = desc_lines[0] #Commit always has a first line.
556 fp = makefileobj(repo, template, node, desc=desc, total=total, 560 fp = makefileobj(repo, template, node, desc=desc, total=total,
557 seqno=seqno, revwidth=revwidth, mode='ab') 561 seqno=seqno, revwidth=revwidth, mode='wb',
562 modemap=filemode)
558 if fp != template: 563 if fp != template:
559 shouldclose = True 564 shouldclose = True
560 if fp and fp != sys.stdout and util.safehasattr(fp, 'name'): 565 if fp and fp != sys.stdout and util.safehasattr(fp, 'name'):
561 repo.ui.note("%s\n" % fp.name) 566 repo.ui.note("%s\n" % fp.name)
562 567