# HG changeset patch # User Bryan O'Sullivan # Date 1122655348 28800 # Node ID d0fb9efa2b2d972c2ca5357acdbad0414c8def0c # Parent f199e1887889f208806f70d348678c617839bbb2 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. diff -r f199e1887889 -r d0fb9efa2b2d 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"""