Fix performance regression in addremove command.
authorBryan O'Sullivan <bos@serpentine.com>
Fri, 29 Jul 2005 08:42:28 -0800
changeset 809 d0fb9efa2b2d
parent 787 f199e1887889
child 810 790a0ff306f2
Fix performance regression in addremove command. When I rewrote addremove, I lazily put a call to repo.changes in, which was unnecessary and slow. This is a new rewrite, preserving the file name behaviour, but replacing the call to repo.changes with a walk, which is much cheaper, and avoids calls to os.stat on all but files that have probably been deleted.
mercurial/commands.py
--- a/mercurial/commands.py	Thu Jul 28 07:46:08 2005 -0800
+++ b/mercurial/commands.py	Fri Jul 29 08:42:28 2005 -0800
@@ -339,17 +339,17 @@
 def addremove(ui, repo, *pats, **opts):
     """add all new files, delete all missing files"""
     q = dict(zip(pats, pats))
-    cwd = repo.getcwd()
-    n = (cwd and len(cwd) + 1) or 0
-    c, a, d, u = repo.changes(match = matchpats(cwd, pats, opts))
-    for f in u:
-        if f not in q:
-            ui.status('adding %s\n' % f[n:])
-    repo.add(u)
-    for f in d:
-        if f not in q:
-            ui.status('removing %s\n' % f[n:])
-    repo.remove(d)
+    add, remove = [], []
+    for src, abs, rel in walk(repo, pats, opts):
+        if src == 'f':
+            if repo.dirstate.state(abs) == '?':
+                add.append(abs)
+                if rel not in q: ui.status('adding ', rel, '\n')
+        elif repo.dirstate.state(abs) != 'r' and not os.path.exists(rel):
+            remove.append(abs)
+            if rel not in q: ui.status('removing ', rel, '\n')
+    repo.add(add)
+    repo.remove(remove)
 
 def annotate(ui, repo, *pats, **opts):
     """show changeset information per file line"""