Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/patch.py @ 14565:3cacc232f27f
patch: stop updating changed files set in applydiff()
This information is more correctly returned by backends.
The extra updated file removed from test-mq-merge.t output came from changes
from git patches being counted before being really applied in some cases.
author | Patrick Mezard <pmezard@gmail.com> |
---|---|
date | Sat, 11 Jun 2011 14:14:13 +0200 |
parents | 65f4512e40e4 |
children | d0c2cc11e611 |
comparison
equal
deleted
inserted
replaced
14564:65f4512e40e4 | 14565:3cacc232f27f |
---|---|
1191 | 1191 |
1192 while gitpatches: | 1192 while gitpatches: |
1193 gp = gitpatches.pop()[2] | 1193 gp = gitpatches.pop()[2] |
1194 yield 'file', ('a/' + gp.path, 'b/' + gp.path, None, gp) | 1194 yield 'file', ('a/' + gp.path, 'b/' + gp.path, None, gp) |
1195 | 1195 |
1196 def applydiff(ui, fp, changed, backend, store, strip=1, eolmode='strict'): | 1196 def applydiff(ui, fp, backend, store, strip=1, eolmode='strict'): |
1197 """Reads a patch from fp and tries to apply it. | 1197 """Reads a patch from fp and tries to apply it. |
1198 | 1198 |
1199 The dict 'changed' is filled in with all of the filenames changed | 1199 Returns 0 for a clean patch, -1 if any rejects were found and 1 if |
1200 by the patch. Returns 0 for a clean patch, -1 if any rejects were | 1200 there was any fuzz. |
1201 found and 1 if there was any fuzz. | |
1202 | 1201 |
1203 If 'eolmode' is 'strict', the patch content and patched file are | 1202 If 'eolmode' is 'strict', the patch content and patched file are |
1204 read in binary mode. Otherwise, line endings are ignored when | 1203 read in binary mode. Otherwise, line endings are ignored when |
1205 patching then normalized according to 'eolmode'. | 1204 patching then normalized according to 'eolmode'. |
1206 """ | 1205 """ |
1207 return _applydiff(ui, fp, patchfile, backend, store, changed, strip=strip, | 1206 return _applydiff(ui, fp, patchfile, backend, store, strip=strip, |
1208 eolmode=eolmode) | 1207 eolmode=eolmode) |
1209 | 1208 |
1210 def _applydiff(ui, fp, patcher, backend, store, changed, strip=1, | 1209 def _applydiff(ui, fp, patcher, backend, store, strip=1, |
1211 eolmode='strict'): | 1210 eolmode='strict'): |
1212 | 1211 |
1213 def pstrip(p): | 1212 def pstrip(p): |
1214 return pathstrip(p, strip - 1)[1] | 1213 return pathstrip(p, strip - 1)[1] |
1215 | 1214 |
1220 for state, values in iterhunks(fp): | 1219 for state, values in iterhunks(fp): |
1221 if state == 'hunk': | 1220 if state == 'hunk': |
1222 if not current_file: | 1221 if not current_file: |
1223 continue | 1222 continue |
1224 ret = current_file.apply(values) | 1223 ret = current_file.apply(values) |
1225 if ret >= 0: | 1224 if ret > 0: |
1226 changed.add(current_file.fname) | 1225 err = 1 |
1227 if ret > 0: | |
1228 err = 1 | |
1229 elif state == 'file': | 1226 elif state == 'file': |
1230 if current_file: | 1227 if current_file: |
1231 rejects += current_file.close() | 1228 rejects += current_file.close() |
1232 current_file = None | 1229 current_file = None |
1233 afile, bfile, first_hunk, gp = values | 1230 afile, bfile, first_hunk, gp = values |
1234 copysource = None | 1231 copysource = None |
1235 if gp: | 1232 if gp: |
1236 path = pstrip(gp.path) | 1233 path = pstrip(gp.path) |
1237 if gp.oldpath: | 1234 if gp.oldpath: |
1238 copysource = pstrip(gp.oldpath) | 1235 copysource = pstrip(gp.oldpath) |
1239 changed.add(path) | |
1240 if gp.op == 'RENAME': | 1236 if gp.op == 'RENAME': |
1241 backend.unlink(copysource) | 1237 backend.unlink(copysource) |
1242 if not first_hunk: | 1238 if not first_hunk: |
1243 if gp.op == 'DELETE': | 1239 if gp.op == 'DELETE': |
1244 backend.unlink(path) | 1240 backend.unlink(path) |
1352 try: | 1348 try: |
1353 fp = open(patchobj, 'rb') | 1349 fp = open(patchobj, 'rb') |
1354 except TypeError: | 1350 except TypeError: |
1355 fp = patchobj | 1351 fp = patchobj |
1356 try: | 1352 try: |
1357 ret = applydiff(ui, fp, files, backend, store, strip=strip, | 1353 ret = applydiff(ui, fp, backend, store, strip=strip, |
1358 eolmode=eolmode) | 1354 eolmode=eolmode) |
1359 finally: | 1355 finally: |
1360 if fp != patchobj: | 1356 if fp != patchobj: |
1361 fp.close() | 1357 fp.close() |
1362 files.update(backend.close()) | 1358 files.update(backend.close()) |