comparison hgext/extdiff.py @ 8065:66d0a03d3afc

extdiff: preserve execute-bit across copies (issue1562) Bug report and test by Mads Kiilerich <mads@kiilerich.com>
author Patrick Mezard <pmezard@gmail.com>
date Thu, 09 Apr 2009 14:32:44 +0200
parents 5c7bc1aece9e
children aece3c9e62f1
comparison
equal deleted inserted replaced
8064:5c7bc1aece9e 8065:66d0a03d3afc
65 ui.note(_('making snapshot of %d files from rev %s\n') % 65 ui.note(_('making snapshot of %d files from rev %s\n') %
66 (len(files), short(node))) 66 (len(files), short(node)))
67 else: 67 else:
68 ui.note(_('making snapshot of %d files from working dir\n') % 68 ui.note(_('making snapshot of %d files from working dir\n') %
69 (len(files))) 69 (len(files)))
70 70 wopener = util.opener(base)
71 fns_and_mtime = [] 71 fns_and_mtime = []
72 ctx = repo[node] 72 ctx = repo[node]
73 for fn in files: 73 for fn in files:
74 wfn = util.pconvert(fn) 74 wfn = util.pconvert(fn)
75 if not wfn in ctx: 75 if not wfn in ctx:
76 # skipping new file after a merge ? 76 # skipping new file after a merge ?
77 continue 77 continue
78 ui.note(' %s\n' % wfn) 78 ui.note(' %s\n' % wfn)
79 dest = os.path.join(base, wfn) 79 dest = os.path.join(base, wfn)
80 destdir = os.path.dirname(dest) 80 fctx = ctx[wfn]
81 if not os.path.isdir(destdir): 81 data = repo.wwritedata(wfn, fctx.data())
82 os.makedirs(destdir) 82 if 'l' in fctx.flags():
83 data = repo.wwritedata(wfn, ctx[wfn].data()) 83 wopener.symlink(data, wfn)
84 open(dest, 'wb').write(data) 84 else:
85 wopener(wfn, 'w').write(data)
86 if 'x' in fctx.flags():
87 util.set_flags(dest, False, True)
85 if node is None: 88 if node is None:
86 fns_and_mtime.append((dest, repo.wjoin(fn), os.path.getmtime(dest))) 89 fns_and_mtime.append((dest, repo.wjoin(fn), os.path.getmtime(dest)))
87 return dirname, fns_and_mtime 90 return dirname, fns_and_mtime
88 91
89 def dodiff(ui, repo, diffcmd, diffopts, pats, opts): 92 def dodiff(ui, repo, diffcmd, diffopts, pats, opts):