# HG changeset patch # User Benoit Boissinot # Date 1268002768 -3600 # Node ID 5868dd69fb035c2deb4fd0df17d32ff170798a38 # Parent 3077ee5ca7506ec71df9a2a6b2011c49df213cc9 addremove: atomically update the dirstate In case someone hits ^C during the similarity search, properly rollback diff -r 3077ee5ca750 -r 5868dd69fb03 mercurial/cmdutil.py --- a/mercurial/cmdutil.py Sun Mar 07 13:10:23 2010 -0500 +++ b/mercurial/cmdutil.py Sun Mar 07 23:59:28 2010 +0100 @@ -356,9 +356,7 @@ removed.append(abs) elif repo.dirstate[abs] == 'a': added.append(abs) - if not dry_run: - repo.remove(deleted) - repo.add(unknown) + copies = {} if similarity > 0: for old, new, score in findrenames(repo, added + unknown, removed + deleted, similarity): @@ -366,8 +364,17 @@ repo.ui.status(_('recording removal of %s as rename to %s ' '(%d%% similar)\n') % (m.rel(old), m.rel(new), score * 100)) - if not dry_run: + copies[new] = old + + if not dry_run: + wlock = repo.wlock() + try: + repo.remove(deleted) + repo.add(unknown) + for new, old in copies.iteritems(): repo.copy(old, new) + finally: + wlock.release() def copy(ui, repo, pats, opts, rename=False): # called with the repo lock held