Show More
@@ -1683,44 +1683,7 b' def import_(ui, repo, patch1, *patches, ' | |||
|
1683 | 1683 | ui.debug(_('message:\n%s\n') % message) |
|
1684 | 1684 | |
|
1685 | 1685 | files, fuzz = patch.patch(tmpname, ui, strip=strip, cwd=repo.root) |
|
1686 | removes = [] | |
|
1687 | if len(files) > 0: | |
|
1688 | cfiles = files.keys() | |
|
1689 | copies = [] | |
|
1690 | copts = {'after': False, 'force': False} | |
|
1691 | cwd = repo.getcwd() | |
|
1692 | if cwd: | |
|
1693 | cfiles = [util.pathto(cwd, f) for f in files.keys()] | |
|
1694 | for f in files: | |
|
1695 | ctype, gp = files[f] | |
|
1696 | if ctype == 'RENAME': | |
|
1697 | copies.append((gp.oldpath, gp.path, gp.copymod)) | |
|
1698 | removes.append(gp.oldpath) | |
|
1699 | elif ctype == 'COPY': | |
|
1700 | copies.append((gp.oldpath, gp.path, gp.copymod)) | |
|
1701 | elif ctype == 'DELETE': | |
|
1702 | removes.append(gp.path) | |
|
1703 | for src, dst, after in copies: | |
|
1704 | absdst = os.path.join(repo.root, dst) | |
|
1705 | if not after and os.path.exists(absdst): | |
|
1706 | raise util.Abort(_('patch creates existing file %s') % dst) | |
|
1707 | if cwd: | |
|
1708 | src, dst = [util.pathto(cwd, f) for f in (src, dst)] | |
|
1709 | copts['after'] = after | |
|
1710 | errs, copied = docopy(ui, repo, (src, dst), copts, wlock=wlock) | |
|
1711 | if errs: | |
|
1712 | raise util.Abort(errs) | |
|
1713 | if removes: | |
|
1714 | repo.remove(removes, True, wlock=wlock) | |
|
1715 | for f in files: | |
|
1716 | ctype, gp = files[f] | |
|
1717 | if gp and gp.mode: | |
|
1718 | x = gp.mode & 0100 != 0 | |
|
1719 | dst = os.path.join(repo.root, gp.path) | |
|
1720 | util.set_exec(dst, x) | |
|
1721 | cmdutil.addremove(repo, cfiles, wlock=wlock) | |
|
1722 | files = files.keys() | |
|
1723 | files.extend([r for r in removes if r not in files]) | |
|
1686 | files = patch.updatedir(ui, repo, files, wlock=wlock) | |
|
1724 | 1687 | repo.commit(files, message, user, date, wlock=wlock, lock=lock) |
|
1725 | 1688 | finally: |
|
1726 | 1689 | os.unlink(tmpname) |
@@ -11,6 +11,28 b' from node import *' | |||
|
11 | 11 | demandload(globals(), "cmdutil mdiff util") |
|
12 | 12 | demandload(globals(), "cStringIO email.Parser os re shutil sys tempfile") |
|
13 | 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 | |
|
35 | ||
|
14 | 36 | def extract(ui, fileobj): |
|
15 | 37 | '''extract patch from data read from fileobj. |
|
16 | 38 | |
@@ -174,21 +196,7 b' def dogitpatch(patchname, gitpatches):' | |||
|
174 | 196 | if not p.copymod: |
|
175 | 197 | continue |
|
176 | 198 | |
|
177 |
|
|
|
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)) | |
|
199 | copyfile(p.oldpath, p.path) | |
|
192 | 200 | |
|
193 | 201 | # rewrite patch hunk |
|
194 | 202 | while pfline < p.lineno: |
@@ -281,6 +289,45 b' def diffopts(ui, opts={}):' | |||
|
281 | 289 | ignoreblanklines=(opts.get('ignore_blank_lines') or |
|
282 | 290 | ui.configbool('diff', 'ignoreblanklines', None))) |
|
283 | 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 | |
|
330 | ||
|
284 | 331 | def diff(repo, node1=None, node2=None, files=None, match=util.always, |
|
285 | 332 | fp=None, changes=None, opts=None): |
|
286 | 333 | '''print diff of changes to files between two nodes, or node and |
General Comments 0
You need to be logged in to leave comments.
Login now