comparison mercurial/commands.py @ 6107:41bb88cb913e

commands.revert: don't call hg.revert commands.revert calculates everything that has to be done and then calls hg.revert to checkout and remove files. Unfortunately, hg.revert has to recalculate everything and that can take a long while, since it always operates on the whole working dir. Changing commands.revert to manually checkout and remove files makes things considerably faster, especially if we're reverting a single file in a repo with a huge number of files. This should be enough to close issue857.
author Alexis S. L. Carvalho <alexis@cecm.usp.br>
date Thu, 14 Feb 2008 18:08:16 -0200
parents cb2f7652ad1b
children 5086576a2152
comparison
equal deleted inserted replaced
6106:cb2f7652ad1b 6107:41bb88cb913e
2249 revert = ([], _('reverting %s\n')) 2249 revert = ([], _('reverting %s\n'))
2250 add = ([], _('adding %s\n')) 2250 add = ([], _('adding %s\n'))
2251 remove = ([], _('removing %s\n')) 2251 remove = ([], _('removing %s\n'))
2252 forget = ([], _('forgetting %s\n')) 2252 forget = ([], _('forgetting %s\n'))
2253 undelete = ([], _('undeleting %s\n')) 2253 undelete = ([], _('undeleting %s\n'))
2254 update = {}
2255 2254
2256 disptable = ( 2255 disptable = (
2257 # dispatch table: 2256 # dispatch table:
2258 # file state 2257 # file state
2259 # action if in target manifest 2258 # action if in target manifest
2272 for abs, (rel, exact) in entries: 2271 for abs, (rel, exact) in entries:
2273 mfentry = mf.get(abs) 2272 mfentry = mf.get(abs)
2274 target = repo.wjoin(abs) 2273 target = repo.wjoin(abs)
2275 def handle(xlist, dobackup): 2274 def handle(xlist, dobackup):
2276 xlist[0].append(abs) 2275 xlist[0].append(abs)
2277 update[abs] = 1
2278 if dobackup and not opts['no_backup'] and util.lexists(target): 2276 if dobackup and not opts['no_backup'] and util.lexists(target):
2279 bakname = "%s.orig" % rel 2277 bakname = "%s.orig" % rel
2280 ui.note(_('saving current version of %s as %s\n') % 2278 ui.note(_('saving current version of %s as %s\n') %
2281 (rel, bakname)) 2279 (rel, bakname))
2282 if not opts.get('dry_run'): 2280 if not opts.get('dry_run'):
2315 handle(revert, False) 2313 handle(revert, False)
2316 else: 2314 else:
2317 handle(remove, False) 2315 handle(remove, False)
2318 2316
2319 if not opts.get('dry_run'): 2317 if not opts.get('dry_run'):
2318 def checkout(f):
2319 fc = ctx[f]
2320 repo.wwrite(f, fc.data(), fc.fileflags())
2321
2320 for f in forget[0]: 2322 for f in forget[0]:
2321 repo.dirstate.forget(f) 2323 repo.dirstate.forget(f)
2322 r = hg.revert(repo, node, update.has_key) 2324
2325 for f in revert[0]:
2326 checkout(f)
2327
2323 for f in add[0]: 2328 for f in add[0]:
2329 checkout(f)
2324 repo.dirstate.add(f) 2330 repo.dirstate.add(f)
2331
2325 for f in undelete[0]: 2332 for f in undelete[0]:
2333 checkout(f)
2326 repo.dirstate.normal(f) 2334 repo.dirstate.normal(f)
2335
2336 audit_path = util.path_auditor(repo.root)
2327 for f in remove[0]: 2337 for f in remove[0]:
2338 audit_path(f)
2339 try:
2340 util.unlink(repo.wjoin(f))
2341 except OSError:
2342 pass
2328 repo.dirstate.remove(f) 2343 repo.dirstate.remove(f)
2329 return r
2330 finally: 2344 finally:
2331 del wlock 2345 del wlock
2332 2346
2333 def rollback(ui, repo): 2347 def rollback(ui, repo):
2334 """roll back the last transaction 2348 """roll back the last transaction