Show More
@@ -18,25 +18,6 b" gitre = re.compile('diff --git a/(.*) b/" | |||
|
18 | 18 | class PatchError(Exception): |
|
19 | 19 | pass |
|
20 | 20 | |
|
21 | # helper functions | |
|
22 | ||
|
23 | def copyfile(src, dst, basedir): | |
|
24 | abssrc, absdst = [scmutil.canonpath(basedir, basedir, x) | |
|
25 | for x in [src, dst]] | |
|
26 | if os.path.lexists(absdst): | |
|
27 | raise util.Abort(_("cannot create %s: destination already exists") % | |
|
28 | dst) | |
|
29 | ||
|
30 | dstdir = os.path.dirname(absdst) | |
|
31 | if dstdir and not os.path.isdir(dstdir): | |
|
32 | try: | |
|
33 | os.makedirs(dstdir) | |
|
34 | except IOError: | |
|
35 | raise util.Abort( | |
|
36 | _("cannot create %s: unable to create destination directory") | |
|
37 | % dst) | |
|
38 | ||
|
39 | util.copyfile(abssrc, absdst) | |
|
40 | 21 | |
|
41 | 22 | # public functions |
|
42 | 23 | |
@@ -406,10 +387,17 b' class abstractbackend(object):' | |||
|
406 | 387 | """ |
|
407 | 388 | pass |
|
408 | 389 | |
|
390 | def copy(self, src, dst): | |
|
391 | """Copy src file into dst file. Create intermediate directories if | |
|
392 | necessary. Files are specified relatively to the patching base | |
|
393 | directory. | |
|
394 | """ | |
|
395 | raise NotImplementedError | |
|
396 | ||
|
409 | 397 | class fsbackend(abstractbackend): |
|
410 |
def __init__(self, ui, |
|
|
398 | def __init__(self, ui, basedir): | |
|
411 | 399 | super(fsbackend, self).__init__(ui) |
|
412 | self.opener = opener | |
|
400 | self.opener = scmutil.opener(basedir) | |
|
413 | 401 | |
|
414 | 402 | def readlines(self, fname): |
|
415 | 403 | if os.path.islink(fname): |
@@ -456,6 +444,23 b' class fsbackend(abstractbackend):' | |||
|
456 | 444 | fp.writelines(lines) |
|
457 | 445 | fp.close() |
|
458 | 446 | |
|
447 | def copy(self, src, dst): | |
|
448 | basedir = self.opener.base | |
|
449 | abssrc, absdst = [scmutil.canonpath(basedir, basedir, x) | |
|
450 | for x in [src, dst]] | |
|
451 | if os.path.lexists(absdst): | |
|
452 | raise util.Abort(_("cannot create %s: destination already exists") | |
|
453 | % dst) | |
|
454 | dstdir = os.path.dirname(absdst) | |
|
455 | if dstdir and not os.path.isdir(dstdir): | |
|
456 | try: | |
|
457 | os.makedirs(dstdir) | |
|
458 | except IOError: | |
|
459 | raise util.Abort( | |
|
460 | _("cannot create %s: unable to create destination directory") | |
|
461 | % dst) | |
|
462 | util.copyfile(abssrc, absdst) | |
|
463 | ||
|
459 | 464 | # @@ -start,len +start,len @@ or @@ -start +start @@ if len is 1 |
|
460 | 465 | unidesc = re.compile('@@ -(\d+)(,(\d+))? \+(\d+)(,(\d+))? @@') |
|
461 | 466 | contextdesc = re.compile('(---|\*\*\*) (\d+)(,(\d+))? (---|\*\*\*)') |
@@ -1147,15 +1152,15 b' def applydiff(ui, fp, changed, strip=1, ' | |||
|
1147 | 1152 | Callers probably want to call '_updatedir' after this to |
|
1148 | 1153 | apply certain categories of changes not done by this function. |
|
1149 | 1154 | """ |
|
1150 |
return _applydiff(ui, fp, patchfile, |
|
|
1155 | return _applydiff(ui, fp, patchfile, changed, strip=strip, | |
|
1151 | 1156 | eolmode=eolmode) |
|
1152 | 1157 | |
|
1153 |
def _applydiff(ui, fp, patcher |
|
|
1158 | def _applydiff(ui, fp, patcher, changed, strip=1, eolmode='strict'): | |
|
1154 | 1159 | rejects = 0 |
|
1155 | 1160 | err = 0 |
|
1156 | 1161 | current_file = None |
|
1157 | 1162 | cwd = os.getcwd() |
|
1158 |
backend = fsbackend(ui, s |
|
|
1163 | backend = fsbackend(ui, os.getcwd()) | |
|
1159 | 1164 | |
|
1160 | 1165 | for state, values in iterhunks(fp): |
|
1161 | 1166 | if state == 'hunk': |
@@ -1188,7 +1193,7 b' def _applydiff(ui, fp, patcher, copyfn, ' | |||
|
1188 | 1193 | # Binary patches really overwrite target files, copying them |
|
1189 | 1194 | # will just make it fails with "target file exists" |
|
1190 | 1195 | if gp.op in ('COPY', 'RENAME') and not gp.binary: |
|
1191 |
copy |
|
|
1196 | backend.copy(gp.oldpath, gp.path) | |
|
1192 | 1197 | changed[gp.path] = gp |
|
1193 | 1198 | else: |
|
1194 | 1199 | raise util.Abort(_('unsupported parser state: %s') % state) |
General Comments 0
You need to be logged in to leave comments.
Login now