##// 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 return -1
1281 return -1
1282 return err
1282 return err
1283
1283
1284 def _updatedir(ui, repo, patches, similarity=0):
1284 def _externalpatch(ui, repo, patcher, patchname, strip, cwd, files,
1285 '''Update dirstate after patch application according to metadata'''
1285 similarity):
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):
1318 """use <patcher> to apply <patchname> to the working directory.
1286 """use <patcher> to apply <patchname> to the working directory.
1319 returns whether patch was applied with fuzz factor."""
1287 returns whether patch was applied with fuzz factor."""
1320
1288
@@ -1324,27 +1292,35 b' def _externalpatch(patcher, patchname, u'
1324 args.append('-d %s' % util.shellquote(cwd))
1292 args.append('-d %s' % util.shellquote(cwd))
1325 fp = util.popen('%s %s -p%d < %s' % (patcher, ' '.join(args), strip,
1293 fp = util.popen('%s %s -p%d < %s' % (patcher, ' '.join(args), strip,
1326 util.shellquote(patchname)))
1294 util.shellquote(patchname)))
1327
1295 try:
1328 for line in fp:
1296 for line in fp:
1329 line = line.rstrip()
1297 line = line.rstrip()
1330 ui.note(line + '\n')
1298 ui.note(line + '\n')
1331 if line.startswith('patching file '):
1299 if line.startswith('patching file '):
1332 pf = util.parsepatchoutput(line)
1300 pf = util.parsepatchoutput(line)
1333 printed_file = False
1301 printed_file = False
1334 files.setdefault(pf, None)
1302 files.setdefault(pf, None)
1335 elif line.find('with fuzz') >= 0:
1303 elif line.find('with fuzz') >= 0:
1336 fuzz = True
1304 fuzz = True
1337 if not printed_file:
1305 if not printed_file:
1338 ui.warn(pf + '\n')
1306 ui.warn(pf + '\n')
1339 printed_file = True
1307 printed_file = True
1340 ui.warn(line + '\n')
1308 ui.warn(line + '\n')
1341 elif line.find('saving rejects to file') >= 0:
1309 elif line.find('saving rejects to file') >= 0:
1342 ui.warn(line + '\n')
1310 ui.warn(line + '\n')
1343 elif line.find('FAILED') >= 0:
1311 elif line.find('FAILED') >= 0:
1344 if not printed_file:
1312 if not printed_file:
1345 ui.warn(pf + '\n')
1313 ui.warn(pf + '\n')
1346 printed_file = True
1314 printed_file = True
1347 ui.warn(line + '\n')
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 code = fp.close()
1324 code = fp.close()
1349 if code:
1325 if code:
1350 raise PatchError(_("patch command failed: %s") %
1326 raise PatchError(_("patch command failed: %s") %
@@ -1397,12 +1373,8 b' def patch(ui, repo, patchname, strip=1, '
1397 files = {}
1373 files = {}
1398 try:
1374 try:
1399 if patcher:
1375 if patcher:
1400 try:
1376 return _externalpatch(ui, repo, patcher, patchname, strip,
1401 return _externalpatch(patcher, patchname, ui, strip, cwd,
1377 cwd, files, similarity)
1402 files)
1403 finally:
1404 touched = _updatedir(ui, repo, files, similarity)
1405 files.update(dict.fromkeys(touched))
1406 return internalpatch(ui, repo, patchname, strip, files, eolmode,
1378 return internalpatch(ui, repo, patchname, strip, files, eolmode,
1407 similarity)
1379 similarity)
1408 except PatchError, err:
1380 except PatchError, err:
General Comments 0
You need to be logged in to leave comments. Login now