Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/patch.py @ 2933:439fd013360d
Move import's working dir update code into patch.updatedir
author | Brendan Cully <brendan@kublai.com> |
---|---|
date | Wed, 16 Aug 2006 19:46:18 -0700 |
parents | 773c5b82d052 |
children | 2f190e998eb3 |
comparison
equal
deleted
inserted
replaced
2926:13cd2cdeff6a | 2933:439fd013360d |
---|---|
8 from demandload import demandload | 8 from demandload import demandload |
9 from i18n import gettext as _ | 9 from i18n import gettext as _ |
10 from node import * | 10 from node import * |
11 demandload(globals(), "cmdutil mdiff util") | 11 demandload(globals(), "cmdutil mdiff util") |
12 demandload(globals(), "cStringIO email.Parser os re shutil sys tempfile") | 12 demandload(globals(), "cStringIO email.Parser os re shutil sys tempfile") |
13 | |
14 # helper functions | |
15 | |
16 def copyfile(src, dst, basedir=None): | |
17 if not basedir: | |
18 basedir = os.getcwd() | |
19 | |
20 abssrc, absdst = [os.path.join(basedir, n) for n in (src, dst)] | |
21 if os.path.exists(absdst): | |
22 raise util.Abort(_("cannot create %s: destination already exists") % | |
23 dst) | |
24 | |
25 targetdir = os.path.dirname(absdst) | |
26 if not os.path.isdir(targetdir): | |
27 os.makedirs(targetdir) | |
28 try: | |
29 shutil.copyfile(abssrc, absdst) | |
30 shutil.copymode(abssrc, absdst) | |
31 except shutil.Error, inst: | |
32 raise util.Abort(str(inst)) | |
33 | |
34 # public functions | |
13 | 35 |
14 def extract(ui, fileobj): | 36 def extract(ui, fileobj): |
15 '''extract patch from data read from fileobj. | 37 '''extract patch from data read from fileobj. |
16 | 38 |
17 patch can be normal patch or contained in email message. | 39 patch can be normal patch or contained in email message. |
172 for i in range(len(gitpatches)): | 194 for i in range(len(gitpatches)): |
173 p = gitpatches[i] | 195 p = gitpatches[i] |
174 if not p.copymod: | 196 if not p.copymod: |
175 continue | 197 continue |
176 | 198 |
177 if os.path.exists(p.path): | 199 copyfile(p.oldpath, p.path) |
178 raise util.Abort(_("cannot create %s: destination already exists") % | |
179 p.path) | |
180 | |
181 (src, dst) = [os.path.join(os.getcwd(), n) | |
182 for n in (p.oldpath, p.path)] | |
183 | |
184 targetdir = os.path.dirname(dst) | |
185 if not os.path.isdir(targetdir): | |
186 os.makedirs(targetdir) | |
187 try: | |
188 shutil.copyfile(src, dst) | |
189 shutil.copymode(src, dst) | |
190 except shutil.Error, inst: | |
191 raise util.Abort(str(inst)) | |
192 | 200 |
193 # rewrite patch hunk | 201 # rewrite patch hunk |
194 while pfline < p.lineno: | 202 while pfline < p.lineno: |
195 tmpfp.write(pf.readline()) | 203 tmpfp.write(pf.readline()) |
196 pfline += 1 | 204 pfline += 1 |
278 ui.configbool('diff', 'ignorews', None)), | 286 ui.configbool('diff', 'ignorews', None)), |
279 ignorewsamount=(opts.get('ignore_space_change') or | 287 ignorewsamount=(opts.get('ignore_space_change') or |
280 ui.configbool('diff', 'ignorewsamount', None)), | 288 ui.configbool('diff', 'ignorewsamount', None)), |
281 ignoreblanklines=(opts.get('ignore_blank_lines') or | 289 ignoreblanklines=(opts.get('ignore_blank_lines') or |
282 ui.configbool('diff', 'ignoreblanklines', None))) | 290 ui.configbool('diff', 'ignoreblanklines', None))) |
291 | |
292 def updatedir(ui, repo, patches, wlock=None): | |
293 '''Update dirstate after patch application according to metadata''' | |
294 if not patches: | |
295 return | |
296 copies = [] | |
297 removes = [] | |
298 cfiles = patches.keys() | |
299 copts = {'after': False, 'force': False} | |
300 cwd = repo.getcwd() | |
301 if cwd: | |
302 cfiles = [util.pathto(cwd, f) for f in patches.keys()] | |
303 for f in patches: | |
304 ctype, gp = patches[f] | |
305 if ctype == 'RENAME': | |
306 copies.append((gp.oldpath, gp.path, gp.copymod)) | |
307 removes.append(gp.oldpath) | |
308 elif ctype == 'COPY': | |
309 copies.append((gp.oldpath, gp.path, gp.copymod)) | |
310 elif ctype == 'DELETE': | |
311 removes.append(gp.path) | |
312 for src, dst, after in copies: | |
313 if not after: | |
314 copyfile(src, dst, repo.root) | |
315 repo.copy(src, dst, wlock=wlock) | |
316 if removes: | |
317 repo.remove(removes, True, wlock=wlock) | |
318 for f in patches: | |
319 ctype, gp = patches[f] | |
320 if gp and gp.mode: | |
321 x = gp.mode & 0100 != 0 | |
322 dst = os.path.join(repo.root, gp.path) | |
323 util.set_exec(dst, x) | |
324 cmdutil.addremove(repo, cfiles, wlock=wlock) | |
325 files = patches.keys() | |
326 files.extend([r for r in removes if r not in files]) | |
327 files.sort() | |
328 | |
329 return files | |
283 | 330 |
284 def diff(repo, node1=None, node2=None, files=None, match=util.always, | 331 def diff(repo, node1=None, node2=None, files=None, match=util.always, |
285 fp=None, changes=None, opts=None): | 332 fp=None, changes=None, opts=None): |
286 '''print diff of changes to files between two nodes, or node and | 333 '''print diff of changes to files between two nodes, or node and |
287 working directory. | 334 working directory. |