307 except OSError, err: |
310 except OSError, err: |
308 if err.errno != errno.ENOENT: raise |
311 if err.errno != errno.ENOENT: raise |
309 return _date2 |
312 return _date2 |
310 def read(f): |
313 def read(f): |
311 return repo.wread(f) |
314 return repo.wread(f) |
|
315 def renamed(f): |
|
316 return repo.dirstate.copies.get(f) |
312 |
317 |
313 if repo.ui.quiet: |
318 if repo.ui.quiet: |
314 r = None |
319 r = None |
315 else: |
320 else: |
316 hexfunc = repo.ui.verbose and hex or short |
321 hexfunc = repo.ui.verbose and hex or short |
317 r = [hexfunc(node) for node in [node1, node2] if node] |
322 r = [hexfunc(node) for node in [node1, node2] if node] |
318 |
323 |
|
324 if opts.git: |
|
325 copied = {} |
|
326 for f in added: |
|
327 src = renamed(f) |
|
328 if src: |
|
329 copied[f] = src |
|
330 srcs = [x[1] for x in copied.items()] |
|
331 |
319 all = modified + added + removed |
332 all = modified + added + removed |
320 all.sort() |
333 all.sort() |
321 for f in all: |
334 for f in all: |
322 to = None |
335 to = None |
323 tn = None |
336 tn = None |
|
337 dodiff = True |
324 if f in mmap: |
338 if f in mmap: |
325 to = repo.file(f).read(mmap[f]) |
339 to = repo.file(f).read(mmap[f]) |
326 if f not in removed: |
340 if f not in removed: |
327 tn = read(f) |
341 tn = read(f) |
328 fp.write(mdiff.unidiff(to, date1, tn, date2(f), f, r, opts=opts)) |
342 if opts.git: |
|
343 def gitmode(x): |
|
344 return x and '100755' or '100644' |
|
345 def addmodehdr(header, omode, nmode): |
|
346 if omode != nmode: |
|
347 header.append('old mode %s\n' % omode) |
|
348 header.append('new mode %s\n' % nmode) |
|
349 |
|
350 a, b = f, f |
|
351 header = [] |
|
352 if f in added: |
|
353 if node2: |
|
354 mode = gitmode(mmap2.execf(f)) |
|
355 else: |
|
356 mode = gitmode(util.is_exec(repo.wjoin(f), None)) |
|
357 if f in copied: |
|
358 a = copied[f] |
|
359 omode = gitmode(mmap.execf(a)) |
|
360 addmodehdr(header, omode, mode) |
|
361 op = a in removed and 'rename' or 'copy' |
|
362 header.append('%s from %s\n' % (op, a)) |
|
363 header.append('%s to %s\n' % (op, f)) |
|
364 to = repo.file(a).read(mmap[a]) |
|
365 else: |
|
366 header.append('new file mode %s\n' % mode) |
|
367 elif f in removed: |
|
368 if f in srcs: |
|
369 dodiff = False |
|
370 else: |
|
371 mode = gitmode(mmap.execf(f)) |
|
372 header.append('deleted file mode %s\n' % mode) |
|
373 else: |
|
374 omode = gitmode(mmap.execf(f)) |
|
375 nmode = gitmode(util.is_exec(repo.wjoin(f), mmap.execf(f))) |
|
376 addmodehdr(header, omode, nmode) |
|
377 r = None |
|
378 if dodiff: |
|
379 header.insert(0, 'diff --git a/%s b/%s\n' % (a, b)) |
|
380 fp.write(''.join(header)) |
|
381 if dodiff: |
|
382 fp.write(mdiff.unidiff(to, date1, tn, date2(f), f, r, opts=opts)) |
329 |
383 |
330 def export(repo, revs, template='hg-%h.patch', fp=None, switch_parent=False, |
384 def export(repo, revs, template='hg-%h.patch', fp=None, switch_parent=False, |
331 opts=None): |
385 opts=None): |
332 '''export changesets as hg patches.''' |
386 '''export changesets as hg patches.''' |
333 |
387 |