dirstate-tags commit fails with "integrity error" after moving directories around
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
Bazaar |
Fix Released
|
Critical
|
John A Meinel |
Bug Description
iacobs@moria ~/tmp $ mkdir tst
iacobs@moria ~/tmp $ cd tst
iacobs@moria ~/tmp/tst $ bzr init --dirstate-tags
iacobs@moria ~/tmp/tst $ mkdir -p some/test/dir
iacobs@moria ~/tmp/tst $ touch some/test/
iacobs@moria ~/tmp/tst $ touch some/test/foo.txt
iacobs@moria ~/tmp/tst $ bzr add .
added some
added some/test
added some/test/dir
added some/test/foo.txt
added some/test/
iacobs@moria ~/tmp/tst $ bzr ci -m "bug take 1"
added some
added some/test
added some/test/dir
added some/test/
added some/test/foo.txt
Committed revision 1.
iacobs@moria ~/tmp/tst $ bzr mv some/test/* some/
some/test/dir => some/dir
some/test/foo.txt => some/foo.txt
iacobs@moria ~/tmp/tst $ bzr ci -m "bug take 2"
renamed some/test/dir => some/dir
bzr: ERROR: integrity error ? : mismatching tree_index, file_id and path
commenting out the code that issues the error seems to work, but I'm not
sure about the implications (there probably are cases when what it does
is useful, right?);
I did some primitive debugging by adding prints here and there and
raising an unhendled exception to get a backtrace; here's what I got:
renamed some/test/dir => some/dir txt-20070320092 826-snuzo3d2flq q9737-5' , None) commands. main(sys. argv) python2. 4/site- packages/ bzrlib/ commands. py", line 643, catch_errors( argv) python2. 4/site- packages/ bzrlib/ commands. py", line 650, catch_errors python2. 4/site- packages/ bzrlib/ commands. py", line 612, python2. 4/site- packages/ bzrlib/ commands. py", line 304, **all_cmd_ args) python2. 4/site- packages/ bzrlib/ builtins. py", line 2119, reporter) python2. 4/site- packages/ bzrlib/ decorators. py", line python2. 4/site- packages/ bzrlib/ workingtree_ 4.py", line commit( self, message, revprops, *args, **kwargs) python2. 4/site- packages/ bzrlib/ decorators. py", line python2. 4/site- packages/ bzrlib/ mutabletree. py", line revprops, *args, **kwargs) python2. 4/site- packages/ bzrlib/ commit. py", line 319, in _populate_ new_inv( ) python2. 4/site- packages/ bzrlib/ commit. py", line 611, in tree.kind( file_id) python2. 4/site- packages/ bzrlib/ decorators. py", line python2. 4/site- packages/ bzrlib/ workingtree_ 4.py", line file_id) python2. 4/site- packages/ bzrlib/ decorators. py", line python2. 4/site- packages/ bzrlib/ workingtree_ 4.py", line entry(file_ id=file_ id) python2. 4/site- packages/ bzrlib/ workingtree_ 4.py", line utf8=file_ id, path_utf8=path) python2. 4/site- packages/ bzrlib/ dirstate. py", line 1401, utf8=real_ path) python2. 4/site- packages/ bzrlib/ dirstate. py", line 1364, 20070320092826- snuzo3d2flqq973 7-5 some/dir
('file.
Traceback (most recent call last):
File "/usr/bin/bzr", line 95, in ?
exit_val = bzrlib.
File "/usr/lib/
in main
ret = run_bzr_
File "/usr/lib/
in run_bzr_
return run_bzr(argv)
File "/usr/lib/
in run_bzr
ret = run(*run_argv)
File "/usr/lib/
in run_argv_aliases
return self.run(
File "/usr/lib/
in run
reporter=
File "/usr/lib/
165, in write_locked
return unbound(self, *args, **kwargs)
File "/usr/lib/
244, in commit
result = WorkingTree3.
File "/usr/lib/
165, in write_locked
return unbound(self, *args, **kwargs)
File "/usr/lib/
160, in commit
revprops=
File "/usr/lib/
commit
self.
File "/usr/lib/
_populate_new_inv
kind = self.work_
File "/usr/lib/
127, in read_locked
return unbound(self, *args, **kwargs)
File "/usr/lib/
532, in kind
relpath = self.id2path(
File "/usr/lib/
127, in read_locked
return unbound(self, *args, **kwargs)
File "/usr/lib/
469, in id2path
entry = self._get_
File "/usr/lib/
405, in _get_entry
return state._get_entry(0, fileid_
File "/usr/lib/
in _get_entry
path_
File "/usr/lib/
in _get_entry
raise "aaaaaaaaaaaa %s %s" % (fileid_utf8, path_utf8)
aaaaaaaaaaaa file.txt-
the funny thing is, the first print is in workingtree_4.py, _get_entry,
line 404, right before calling state._get_entry, and path is None, but
then the dirstate get_entry receives "some/dir";
/me very confused