Mercurial > public > mercurial-scm > hg
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 |