convert: clear the dirstate before a conversion, invalidate it afterwards
authorAlexis S. L. Carvalho <alexis@cecm.usp.br>
Sat, 01 Sep 2007 02:49:18 -0300
changeset 5279 2dbd750b3ddd
parent 5278 70e9a527cc61
child 5280 11e1e574da02
convert: clear the dirstate before a conversion, invalidate it afterwards Clearing it before the conversion protects us from whatever data were there (file copies in particular). Invalidating it after the conversion avoids writing a possibly inconsistent dirstate to disk.
hgext/convert/hg.py
tests/test-convert-hg-sink
tests/test-convert-hg-sink.out
--- a/hgext/convert/hg.py	Sat Sep 01 02:49:18 2007 -0300
+++ b/hgext/convert/hg.py	Sat Sep 01 02:49:18 2007 -0300
@@ -32,8 +32,10 @@
     def before(self):
         self.wlock = self.repo.wlock()
         self.lock = self.repo.lock()
+        self.repo.dirstate.clear()
 
     def after(self):
+        self.repo.dirstate.invalidate()
         self.lock = None
         self.wlock = None
 
--- a/tests/test-convert-hg-sink	Sat Sep 01 02:49:18 2007 -0300
+++ b/tests/test-convert-hg-sink	Sat Sep 01 02:49:18 2007 -0300
@@ -24,4 +24,30 @@
 hg convert orig new 2>&1 | grep -v 'subversion python bindings could not be loaded'
 cd new
 hg out ../orig
-true
+
+echo '% dirstate should be empty:'
+hg debugstate
+hg parents -q
+
+hg up -C
+hg copy bar baz
+echo '% put something in the dirstate:'
+hg debugstate > debugstate
+grep baz debugstate
+
+echo '% add a new revision in the original repo'
+cd ../orig
+echo baz > baz
+hg ci -qAm 'add baz'
+
+cd ..
+hg convert orig new 2>&1 | grep -v 'subversion python bindings could not be loaded'
+cd new
+hg out ../orig
+echo '% dirstate should be the same (no output below):'
+hg debugstate > new-debugstate
+diff debugstate new-debugstate
+
+echo '% no copies'
+hg up -C
+hg debugrename baz
--- a/tests/test-convert-hg-sink.out	Sat Sep 01 02:49:18 2007 -0300
+++ b/tests/test-convert-hg-sink.out	Sat Sep 01 02:49:18 2007 -0300
@@ -31,3 +31,21 @@
 comparing with ../orig
 searching for changes
 no changes found
+% dirstate should be empty:
+3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+% put something in the dirstate:
+a   0         -1 unset             baz
+copy: bar -> baz
+% add a new revision in the original repo
+destination new is a Mercurial repository
+scanning source...
+sorting...
+converting...
+0 add baz
+comparing with ../orig
+searching for changes
+no changes found
+% dirstate should be the same (no output below):
+% no copies
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+baz not renamed