##// END OF EJS Templates
patch: merge _updatedir() into externalpatch()
Patrick Mezard -
r14381:d4192500 default
parent child Browse files
Show More
@@ -1281,40 +1281,8 b' def _applydiff(ui, fp, patcher, backend,'
1281 1281 return -1
1282 1282 return err
1283 1283
1284 def _updatedir(ui, repo, patches, similarity=0):
1285 '''Update dirstate after patch application according to metadata'''
1286 if not patches:
1287 return []
1288 copies = []
1289 removes = set()
1290 cfiles = patches.keys()
1291 cwd = repo.getcwd()
1292 if cwd:
1293 cfiles = [util.pathto(repo.root, cwd, f) for f in patches.keys()]
1294 for f in patches:
1295 gp = patches[f]
1296 if not gp:
1297 continue
1298 if gp.op == 'RENAME':
1299 copies.append((gp.oldpath, gp.path))
1300 removes.add(gp.oldpath)
1301 elif gp.op == 'COPY':
1302 copies.append((gp.oldpath, gp.path))
1303 elif gp.op == 'DELETE':
1304 removes.add(gp.path)
1305
1306 wctx = repo[None]
1307 for src, dst in copies:
1308 scmutil.dirstatecopy(ui, repo, wctx, src, dst, cwd=cwd)
1309 if (not similarity) and removes:
1310 wctx.remove(sorted(removes))
1311
1312 scmutil.addremove(repo, cfiles, similarity=similarity)
1313 files = patches.keys()
1314 files.extend([r for r in removes if r not in files])
1315 return sorted(files)
1316
1317 def _externalpatch(patcher, patchname, ui, strip, cwd, files):
1284 def _externalpatch(ui, repo, patcher, patchname, strip, cwd, files,
1285 similarity):
1318 1286 """use <patcher> to apply <patchname> to the working directory.
1319 1287 returns whether patch was applied with fuzz factor."""
1320 1288
@@ -1324,27 +1292,35 b' def _externalpatch(patcher, patchname, u'
1324 1292 args.append('-d %s' % util.shellquote(cwd))
1325 1293 fp = util.popen('%s %s -p%d < %s' % (patcher, ' '.join(args), strip,
1326 1294 util.shellquote(patchname)))
1327
1328 for line in fp:
1329 line = line.rstrip()
1330 ui.note(line + '\n')
1331 if line.startswith('patching file '):
1332 pf = util.parsepatchoutput(line)
1333 printed_file = False
1334 files.setdefault(pf, None)
1335 elif line.find('with fuzz') >= 0:
1336 fuzz = True
1337 if not printed_file:
1338 ui.warn(pf + '\n')
1339 printed_file = True
1340 ui.warn(line + '\n')
1341 elif line.find('saving rejects to file') >= 0:
1342 ui.warn(line + '\n')
1343 elif line.find('FAILED') >= 0:
1344 if not printed_file:
1345 ui.warn(pf + '\n')
1346 printed_file = True
1347 ui.warn(line + '\n')
1295 try:
1296 for line in fp:
1297 line = line.rstrip()
1298 ui.note(line + '\n')
1299 if line.startswith('patching file '):
1300 pf = util.parsepatchoutput(line)
1301 printed_file = False
1302 files.setdefault(pf, None)
1303 elif line.find('with fuzz') >= 0:
1304 fuzz = True
1305 if not printed_file:
1306 ui.warn(pf + '\n')
1307 printed_file = True
1308 ui.warn(line + '\n')
1309 elif line.find('saving rejects to file') >= 0:
1310 ui.warn(line + '\n')
1311 elif line.find('FAILED') >= 0:
1312 if not printed_file:
1313 ui.warn(pf + '\n')
1314 printed_file = True
1315 ui.warn(line + '\n')
1316 finally:
1317 if files:
1318 cfiles = list(files)
1319 cwd = repo.getcwd()
1320 if cwd:
1321 cfiles = [util.pathto(repo.root, cwd, f)
1322 for f in cfile]
1323 scmutil.addremove(repo, cfiles, similarity=similarity)
1348 1324 code = fp.close()
1349 1325 if code:
1350 1326 raise PatchError(_("patch command failed: %s") %
@@ -1397,12 +1373,8 b' def patch(ui, repo, patchname, strip=1, '
1397 1373 files = {}
1398 1374 try:
1399 1375 if patcher:
1400 try:
1401 return _externalpatch(patcher, patchname, ui, strip, cwd,
1402 files)
1403 finally:
1404 touched = _updatedir(ui, repo, files, similarity)
1405 files.update(dict.fromkeys(touched))
1376 return _externalpatch(ui, repo, patcher, patchname, strip,
1377 cwd, files, similarity)
1406 1378 return internalpatch(ui, repo, patchname, strip, files, eolmode,
1407 1379 similarity)
1408 1380 except PatchError, err:
General Comments 0
You need to be logged in to leave comments. Login now