Rev 2998: (John Arbash Meinel) Fix bug #161131: when exactly 2 items were in file:///home/pqm/archives/thelove/bzr/%2Btrunk/
Canonical.com Patch Queue Manager
pqm at pqm.ubuntu.com
Thu Nov 15 14:48:03 GMT 2007
At file:///home/pqm/archives/thelove/bzr/%2Btrunk/
------------------------------------------------------------
revno: 2998
revision-id: pqm at pqm.ubuntu.com-20071115144759-zx0nd44rgp38riwr
parent: pqm at pqm.ubuntu.com-20071115084907-6bzfegb0kf5e2zte
parent: john at arbash-meinel.com-20071115010751-v1v42nuv5es0ybxx
committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Thu 2007-11-15 14:47:59 +0000
message:
(John Arbash Meinel) Fix bug #161131: when exactly 2 items were
deleted, it would remove all items in a directory.
modified:
bzrlib/dirstate.py dirstate.py-20060728012006-d6mvoihjb3je9peu-1
bzrlib/tests/test_dirstate.py test_dirstate.py-20060728012006-d6mvoihjb3je9peu-2
------------------------------------------------------------
revno: 2984.1.1
merged: john at arbash-meinel.com-20071115010751-v1v42nuv5es0ybxx
parent: pqm at pqm.ubuntu.com-20071113204938-n5t7vld9jwo0hv4v
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: update_basis_161131
timestamp: Wed 2007-11-14 19:07:51 -0600
message:
Fix bug #161131: Correct DirState._discard_merge_parents logic.
When there were 2 entries to remove, it was removing all entries.
=== modified file 'bzrlib/dirstate.py'
--- a/bzrlib/dirstate.py 2007-11-05 19:40:28 +0000
+++ b/bzrlib/dirstate.py 2007-11-15 01:07:51 +0000
@@ -914,7 +914,7 @@
if (entry[1][0][0], entry[1][1][0]) in dead_patterns:
deleted_positions.append(pos)
if deleted_positions:
- if len(deleted_positions) == len(block):
+ if len(deleted_positions) == len(block[1]):
del block[1][:]
else:
for pos in reversed(deleted_positions):
=== modified file 'bzrlib/tests/test_dirstate.py'
--- a/bzrlib/tests/test_dirstate.py 2007-11-13 17:48:49 +0000
+++ b/bzrlib/tests/test_dirstate.py 2007-11-15 01:07:51 +0000
@@ -2311,3 +2311,168 @@
self.assertEqual(expected, state._find_block(key))
finally:
state.unlock()
+
+
+class TestDiscardMergeParents(TestCaseWithDirState):
+
+ def test_discard_no_parents(self):
+ # This should be a no-op
+ state = self.create_empty_dirstate()
+ self.addCleanup(state.unlock)
+ state._discard_merge_parents()
+ state._validate()
+
+ def test_discard_one_parent(self):
+ # No-op
+ packed_stat = 'AAAAREUHaIpFB2iKAAADAQAtkqUAAIGk'
+ root_entry_direntry = ('', '', 'a-root-value'), [
+ ('d', '', 0, False, packed_stat),
+ ('d', '', 0, False, packed_stat),
+ ]
+ dirblocks = []
+ dirblocks.append(('', [root_entry_direntry]))
+ dirblocks.append(('', []))
+
+ state = self.create_empty_dirstate()
+ self.addCleanup(state.unlock)
+ state._set_data(['parent-id'], dirblocks[:])
+ state._validate()
+
+ state._discard_merge_parents()
+ state._validate()
+ self.assertEqual(dirblocks, state._dirblocks)
+
+ def test_discard_simple(self):
+ # No-op
+ packed_stat = 'AAAAREUHaIpFB2iKAAADAQAtkqUAAIGk'
+ root_entry_direntry = ('', '', 'a-root-value'), [
+ ('d', '', 0, False, packed_stat),
+ ('d', '', 0, False, packed_stat),
+ ('d', '', 0, False, packed_stat),
+ ]
+ expected_root_entry_direntry = ('', '', 'a-root-value'), [
+ ('d', '', 0, False, packed_stat),
+ ('d', '', 0, False, packed_stat),
+ ]
+ dirblocks = []
+ dirblocks.append(('', [root_entry_direntry]))
+ dirblocks.append(('', []))
+
+ state = self.create_empty_dirstate()
+ self.addCleanup(state.unlock)
+ state._set_data(['parent-id', 'merged-id'], dirblocks[:])
+ state._validate()
+
+ # This should strip of the extra column
+ state._discard_merge_parents()
+ state._validate()
+ expected_dirblocks = [('', [expected_root_entry_direntry]), ('', [])]
+ self.assertEqual(expected_dirblocks, state._dirblocks)
+
+ def test_discard_absent(self):
+ """If entries are only in a merge, discard should remove the entries"""
+ null_stat = dirstate.DirState.NULLSTAT
+ present_dir = ('d', '', 0, False, null_stat)
+ present_file = ('f', '', 0, False, null_stat)
+ absent = dirstate.DirState.NULL_PARENT_DETAILS
+ root_key = ('', '', 'a-root-value')
+ file_in_root_key = ('', 'file-in-root', 'a-file-id')
+ file_in_merged_key = ('', 'file-in-merged', 'b-file-id')
+ dirblocks = [('', [(root_key, [present_dir, present_dir, present_dir])]),
+ ('', [(file_in_merged_key,
+ [absent, absent, present_file]),
+ (file_in_root_key,
+ [present_file, present_file, present_file]),
+ ]),
+ ]
+
+ state = self.create_empty_dirstate()
+ self.addCleanup(state.unlock)
+ state._set_data(['parent-id', 'merged-id'], dirblocks[:])
+ state._validate()
+
+ exp_dirblocks = [('', [(root_key, [present_dir, present_dir])]),
+ ('', [(file_in_root_key,
+ [present_file, present_file]),
+ ]),
+ ]
+ state._discard_merge_parents()
+ state._validate()
+ self.assertEqual(exp_dirblocks, state._dirblocks)
+
+ def test_discard_renamed(self):
+ null_stat = dirstate.DirState.NULLSTAT
+ present_dir = ('d', '', 0, False, null_stat)
+ present_file = ('f', '', 0, False, null_stat)
+ absent = dirstate.DirState.NULL_PARENT_DETAILS
+ root_key = ('', '', 'a-root-value')
+ file_in_root_key = ('', 'file-in-root', 'a-file-id')
+ # Renamed relative to parent
+ file_rename_s_key = ('', 'file-s', 'b-file-id')
+ file_rename_t_key = ('', 'file-t', 'b-file-id')
+ # And one that is renamed between the parents, but absent in this
+ key_in_1 = ('', 'file-in-1', 'c-file-id')
+ key_in_2 = ('', 'file-in-2', 'c-file-id')
+
+ dirblocks = [
+ ('', [(root_key, [present_dir, present_dir, present_dir])]),
+ ('', [(key_in_1,
+ [absent, present_file, ('r', 'file-in-2', 'c-file-id')]),
+ (key_in_2,
+ [absent, ('r', 'file-in-1', 'c-file-id'), present_file]),
+ (file_in_root_key,
+ [present_file, present_file, present_file]),
+ (file_rename_s_key,
+ [('r', 'file-t', 'b-file-id'), absent, present_file]),
+ (file_rename_t_key,
+ [present_file, absent, ('r', 'file-s', 'b-file-id')]),
+ ]),
+ ]
+ exp_dirblocks = [
+ ('', [(root_key, [present_dir, present_dir])]),
+ ('', [(key_in_1, [absent, present_file]),
+ (file_in_root_key, [present_file, present_file]),
+ (file_rename_t_key, [present_file, absent]),
+ ]),
+ ]
+ state = self.create_empty_dirstate()
+ self.addCleanup(state.unlock)
+ state._set_data(['parent-id', 'merged-id'], dirblocks[:])
+ state._validate()
+
+ state._discard_merge_parents()
+ state._validate()
+ self.assertEqual(exp_dirblocks, state._dirblocks)
+
+ def test_discard_all_subdir(self):
+ null_stat = dirstate.DirState.NULLSTAT
+ present_dir = ('d', '', 0, False, null_stat)
+ present_file = ('f', '', 0, False, null_stat)
+ absent = dirstate.DirState.NULL_PARENT_DETAILS
+ root_key = ('', '', 'a-root-value')
+ subdir_key = ('', 'sub', 'dir-id')
+ child1_key = ('sub', 'child1', 'child1-id')
+ child2_key = ('sub', 'child2', 'child2-id')
+ child3_key = ('sub', 'child3', 'child3-id')
+
+ dirblocks = [
+ ('', [(root_key, [present_dir, present_dir, present_dir])]),
+ ('', [(subdir_key, [present_dir, present_dir, present_dir])]),
+ ('sub', [(child1_key, [absent, absent, present_file]),
+ (child2_key, [absent, absent, present_file]),
+ (child3_key, [absent, absent, present_file]),
+ ]),
+ ]
+ exp_dirblocks = [
+ ('', [(root_key, [present_dir, present_dir])]),
+ ('', [(subdir_key, [present_dir, present_dir])]),
+ ('sub', []),
+ ]
+ state = self.create_empty_dirstate()
+ self.addCleanup(state.unlock)
+ state._set_data(['parent-id', 'merged-id'], dirblocks[:])
+ state._validate()
+
+ state._discard_merge_parents()
+ state._validate()
+ self.assertEqual(exp_dirblocks, state._dirblocks)
More information about the bazaar-commits
mailing list