Rev 3623: Refactor TreeTransform to extract _generate_inventory_delta (abentley) in file:///home/pqm/archives/thelove/bzr/%2Btrunk/
Canonical.com Patch Queue Manager
pqm at pqm.ubuntu.com
Wed Aug 13 04:40:06 BST 2008
At file:///home/pqm/archives/thelove/bzr/%2Btrunk/
------------------------------------------------------------
revno: 3623
revision-id: pqm at pqm.ubuntu.com-20080813033958-o4nve9kwgoa1nlir
parent: pqm at pqm.ubuntu.com-20080813025404-kmul7igvg0d7w4va
parent: aaron at aaronbentley.com-20080812141923-khi07xuwwi6gnm86
committer: Canonical.com Patch Queue Manager <pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Wed 2008-08-13 04:39:58 +0100
message:
Refactor TreeTransform to extract _generate_inventory_delta (abentley)
modified:
bzrlib/tests/test_transform.py test_transaction.py-20060105172520-b3ffb3946550e6c4
bzrlib/transform.py transform.py-20060105172343-dd99e54394d91687
------------------------------------------------------------
revno: 3619.2.11
revision-id: aaron at aaronbentley.com-20080812141923-khi07xuwwi6gnm86
parent: aaron at aaronbentley.com-20080812140341-nytxmmhztdg5zxfh
committer: Aaron Bentley <aaron at aaronbentley.com>
branch nick: separate-delta
timestamp: Tue 2008-08-12 10:19:23 -0400
message:
Tweak new_paths logic
modified:
bzrlib/transform.py transform.py-20060105172343-dd99e54394d91687
------------------------------------------------------------
revno: 3619.2.10
revision-id: aaron at aaronbentley.com-20080812140341-nytxmmhztdg5zxfh
parent: aaron at aaronbentley.com-20080812130646-d74yxibi8fm4n40g
committer: Aaron Bentley <aaron at aaronbentley.com>
branch nick: separate-delta
timestamp: Tue 2008-08-12 10:03:41 -0400
message:
Compensate for stale entries in TT._needs_rename
modified:
bzrlib/tests/test_transform.py test_transaction.py-20060105172520-b3ffb3946550e6c4
bzrlib/transform.py transform.py-20060105172343-dd99e54394d91687
------------------------------------------------------------
revno: 3619.2.9
revision-id: aaron at aaronbentley.com-20080812130646-d74yxibi8fm4n40g
parent: aaron at aaronbentley.com-20080812130323-drs3nke90pq02t5g
committer: Aaron Bentley <aaron at aaronbentley.com>
branch nick: separate-delta
timestamp: Tue 2008-08-12 09:06:46 -0400
message:
Update docs
modified:
bzrlib/transform.py transform.py-20060105172343-dd99e54394d91687
------------------------------------------------------------
revno: 3619.2.8
revision-id: aaron at aaronbentley.com-20080812130323-drs3nke90pq02t5g
parent: abentley at stumpy-20080812073116-qrnxjlrjyozq270v
committer: Aaron Bentley <aaron at aaronbentley.com>
branch nick: separate-delta
timestamp: Tue 2008-08-12 09:03:23 -0400
message:
Reorganize execute-bit handling
modified:
bzrlib/transform.py transform.py-20060105172343-dd99e54394d91687
------------------------------------------------------------
revno: 3619.2.7
revision-id: abentley at stumpy-20080812073116-qrnxjlrjyozq270v
parent: aaron at aaronbentley.com-20080812062153-dxnnuq4s8di98xob
committer: Aaron Bentley <abentley at stumpy>
branch nick: separate-delta
timestamp: Tue 2008-08-12 03:31:16 -0400
message:
Fix progress handling
modified:
bzrlib/transform.py transform.py-20060105172343-dd99e54394d91687
------------------------------------------------------------
revno: 3619.2.6
revision-id: aaron at aaronbentley.com-20080812062153-dxnnuq4s8di98xob
parent: aaron at aaronbentley.com-20080812061438-bc1hxhxz0fd829qw
committer: Aaron Bentley <aaron at aaronbentley.com>
branch nick: separate-delta
timestamp: Tue 2008-08-12 02:21:53 -0400
message:
More tweaking
modified:
bzrlib/transform.py transform.py-20060105172343-dd99e54394d91687
------------------------------------------------------------
revno: 3619.2.5
revision-id: aaron at aaronbentley.com-20080812061438-bc1hxhxz0fd829qw
parent: aaron at aaronbentley.com-20080812055617-p3womlx16jei3sgf
committer: Aaron Bentley <aaron at aaronbentley.com>
branch nick: separate-delta
timestamp: Tue 2008-08-12 02:14:38 -0400
message:
Reduce set tests
modified:
bzrlib/transform.py transform.py-20060105172343-dd99e54394d91687
------------------------------------------------------------
revno: 3619.2.4
revision-id: aaron at aaronbentley.com-20080812055617-p3womlx16jei3sgf
parent: aaron at aaronbentley.com-20080812044904-gjotd2kgh2i3675n
committer: Aaron Bentley <aaron at aaronbentley.com>
branch nick: separate-delta
timestamp: Tue 2008-08-12 01:56:17 -0400
message:
Further restructuring
modified:
bzrlib/transform.py transform.py-20060105172343-dd99e54394d91687
------------------------------------------------------------
revno: 3619.2.3
revision-id: aaron at aaronbentley.com-20080812044904-gjotd2kgh2i3675n
parent: aaron at aaronbentley.com-20080812041312-ydtwxp53d1jjwvky
committer: Aaron Bentley <aaron at aaronbentley.com>
branch nick: separate-delta
timestamp: Tue 2008-08-12 00:49:04 -0400
message:
Remove unused code
modified:
bzrlib/transform.py transform.py-20060105172343-dd99e54394d91687
------------------------------------------------------------
revno: 3619.2.2
revision-id: aaron at aaronbentley.com-20080812041312-ydtwxp53d1jjwvky
parent: aaron at aaronbentley.com-20080812033329-9t2sw9fve78ri7hy
committer: Aaron Bentley <aaron at aaronbentley.com>
branch nick: separate-delta
timestamp: Tue 2008-08-12 00:13:12 -0400
message:
Further cleanup
modified:
bzrlib/transform.py transform.py-20060105172343-dd99e54394d91687
------------------------------------------------------------
revno: 3619.2.1
revision-id: aaron at aaronbentley.com-20080812033329-9t2sw9fve78ri7hy
parent: pqm at pqm.ubuntu.com-20080811083307-tbibm26paa3r4hg8
committer: Aaron Bentley <aaron at aaronbentley.com>
branch nick: separate-delta
timestamp: Mon 2008-08-11 23:33:29 -0400
message:
Refactor inventory delta generation out of apply_insersions/removals
modified:
bzrlib/transform.py transform.py-20060105172343-dd99e54394d91687
=== modified file 'bzrlib/tests/test_transform.py'
--- a/bzrlib/tests/test_transform.py 2008-08-02 16:11:23 +0000
+++ b/bzrlib/tests/test_transform.py 2008-08-12 14:03:41 +0000
@@ -1299,6 +1299,13 @@
self.assertEqual(wt.inventory.get_file_kind(wt.path2id("foo")),
"file")
+ def test_no_final_path(self):
+ transform, root = self.get_transform()
+ trans_id = transform.trans_id_file_id('foo')
+ transform.create_file('bar', trans_id)
+ transform.cancel_creation(trans_id)
+ transform.apply()
+
class TransformGroup(object):
=== modified file 'bzrlib/transform.py'
--- a/bzrlib/transform.py 2008-08-01 16:10:59 +0000
+++ b/bzrlib/transform.py 2008-08-12 14:19:23 +0000
@@ -470,7 +470,12 @@
"""
new_ids = set()
if filesystem_only:
- id_sets = (self._needs_rename, self._new_executability)
+ stale_ids = self._needs_rename.difference(self._new_name)
+ stale_ids.difference_update(self._new_parent)
+ stale_ids.difference_update(self._new_contents)
+ stale_ids.difference_update(self._new_id)
+ needs_rename = self._needs_rename.difference(stale_ids)
+ id_sets = (needs_rename, self._new_executability)
else:
id_sets = (self._new_name, self._new_parent, self._new_contents,
self._new_id, self._new_executability)
@@ -478,6 +483,20 @@
new_ids.update(id_set)
return sorted(FinalPaths(self).get_paths(new_ids))
+ def _inventory_altered(self):
+ """Get the trans_ids and paths of files needing new inv entries."""
+ new_ids = set()
+ for id_set in [self._new_name, self._new_parent, self._new_id,
+ self._new_executability]:
+ new_ids.update(id_set)
+ changed_kind = set(self._removed_contents)
+ changed_kind.intersection_update(self._new_contents)
+ changed_kind.difference_update(new_ids)
+ changed_kind = (t for t in changed_kind if self.tree_kind(t) !=
+ self.final_kind(t))
+ new_ids.update(changed_kind)
+ return sorted(FinalPaths(self).get_paths(new_ids))
+
def tree_kind(self, trans_id):
"""Determine the file kind in the working tree.
@@ -870,12 +889,10 @@
self._limbo_files[trans_id] = limbo_name
return limbo_name
- def _set_executability(self, path, entry, trans_id):
+ def _set_executability(self, path, trans_id):
"""Set the executability of versioned files """
- new_executability = self._new_executability[trans_id]
- if entry is not None:
- entry.executable = new_executability
if supports_executable():
+ new_executability = self._new_executability[trans_id]
abspath = self._tree.abspath(path)
current_mode = os.stat(abspath).st_mode
if new_executability:
@@ -1203,24 +1220,24 @@
conflicts = self.find_conflicts()
if len(conflicts) != 0:
raise MalformedTransform(conflicts=conflicts)
- if precomputed_delta is None:
- new_inventory_delta = []
- inventory_delta = new_inventory_delta
- else:
- new_inventory_delta = None
- inventory_delta = precomputed_delta
child_pb = bzrlib.ui.ui_factory.nested_progress_bar()
try:
+ if precomputed_delta is None:
+ child_pb.update('Apply phase', 0, 2)
+ inventory_delta = self._generate_inventory_delta()
+ offset = 1
+ else:
+ inventory_delta = precomputed_delta
+ offset = 0
if _mover is None:
mover = _FileMover()
else:
mover = _mover
try:
- child_pb.update('Apply phase', 0, 2)
- kind_changes = self._apply_removals(new_inventory_delta, mover)
- child_pb.update('Apply phase', 1, 2)
- modified_paths = self._apply_insertions(new_inventory_delta,
- mover, kind_changes)
+ child_pb.update('Apply phase', 0 + offset, 2 + offset)
+ self._apply_removals(mover)
+ child_pb.update('Apply phase', 1 + offset, 2 + offset)
+ modified_paths = self._apply_insertions(mover)
except:
mover.rollback()
raise
@@ -1233,7 +1250,68 @@
self.finalize()
return _TransformResults(modified_paths, self.rename_count)
- def _apply_removals(self, inventory_delta, mover):
+ def _generate_inventory_delta(self):
+ """Generate an inventory delta for the current transform."""
+ inventory_delta = []
+ child_pb = bzrlib.ui.ui_factory.nested_progress_bar()
+ new_paths = self._inventory_altered()
+ total_entries = len(new_paths) + len(self._removed_id)
+ try:
+ for num, trans_id in enumerate(self._removed_id):
+ if (num % 10) == 0:
+ child_pb.update('removing file', num, total_entries)
+ if trans_id == self._new_root:
+ file_id = self._tree.get_root_id()
+ else:
+ file_id = self.tree_file_id(trans_id)
+ # File-id isn't really being deleted, just moved
+ if file_id in self._r_new_id:
+ continue
+ path = self._tree_id_paths[trans_id]
+ inventory_delta.append((path, None, file_id, None))
+ new_path_file_ids = dict((t, self.final_file_id(t)) for p, t in
+ new_paths)
+ entries = self._tree.iter_entries_by_dir(
+ new_path_file_ids.values())
+ old_paths = dict((e.file_id, p) for p, e in entries)
+ final_kinds = {}
+ for num, (path, trans_id) in enumerate(new_paths):
+ if (num % 10) == 0:
+ child_pb.update('adding file',
+ num + len(self._removed_id), total_entries)
+ file_id = new_path_file_ids[trans_id]
+ if file_id is None:
+ continue
+ needs_entry = False
+ try:
+ kind = self.final_kind(trans_id)
+ except NoSuchFile:
+ kind = self._tree.stored_kind(file_id)
+ parent_trans_id = self.final_parent(trans_id)
+ parent_file_id = new_path_file_ids.get(parent_trans_id)
+ if parent_file_id is None:
+ parent_file_id = self.final_file_id(parent_trans_id)
+ if trans_id in self._new_reference_revision:
+ new_entry = inventory.TreeReference(
+ file_id,
+ self._new_name[trans_id],
+ self.final_file_id(self._new_parent[trans_id]),
+ None, self._new_reference_revision[trans_id])
+ else:
+ new_entry = inventory.make_entry(kind,
+ self.final_name(trans_id),
+ parent_file_id, file_id)
+ old_path = old_paths.get(new_entry.file_id)
+ new_executability = self._new_executability.get(trans_id)
+ if new_executability is not None:
+ new_entry.executable = new_executability
+ inventory_delta.append(
+ (old_path, path, new_entry.file_id, new_entry))
+ finally:
+ child_pb.finished()
+ return inventory_delta
+
+ def _apply_removals(self, mover):
"""Perform tree operations that remove directory/inventory names.
That is, delete files that are to be deleted, and put any files that
@@ -1252,12 +1330,6 @@
child_pb.update('removing file', num, len(tree_paths))
full_path = self._tree.abspath(path)
if trans_id in self._removed_contents:
- try:
- if (self.tree_kind(trans_id)
- != self.final_kind(trans_id)):
- kind_changes.add(trans_id)
- except NoSuchFile:
- pass
mover.pre_delete(full_path, os.path.join(self._deletiondir,
trans_id))
elif trans_id in self._new_name or trans_id in \
@@ -1269,21 +1341,11 @@
raise
else:
self.rename_count += 1
- if (trans_id in self._removed_id
- and inventory_delta is not None):
- if trans_id == self._new_root:
- file_id = self._tree.get_root_id()
- else:
- file_id = self.tree_file_id(trans_id)
- # File-id isn't really being deleted, just moved
- if file_id in self._r_new_id:
- continue
- inventory_delta.append((path, None, file_id, None))
finally:
child_pb.finished()
return kind_changes
- def _apply_insertions(self, inventory_delta, mover, kind_changes):
+ def _apply_insertions(self, mover):
"""Perform tree operations that insert directory/inventory names.
That is, create any files that need to be created, and restore from
@@ -1296,19 +1358,13 @@
kind_changes is a set of trans ids where the entry has changed
kind, and so an inventory delta entry should be created for them.
"""
- new_paths = self.new_paths(filesystem_only=(inventory_delta is None))
+ new_paths = self.new_paths(filesystem_only=True)
modified_paths = []
- completed_new = []
new_path_file_ids = dict((t, self.final_file_id(t)) for p, t in
new_paths)
- if inventory_delta is not None:
- entries = self._tree.iter_entries_by_dir(
- new_path_file_ids.values())
- old_paths = dict((e.file_id, p) for p, e in entries)
child_pb = bzrlib.ui.ui_factory.nested_progress_bar()
try:
for num, (path, trans_id) in enumerate(new_paths):
- new_entry = None
if (num % 10) == 0:
child_pb.update('adding file', num, len(new_paths))
full_path = self._tree.abspath(path)
@@ -1321,50 +1377,15 @@
raise
else:
self.rename_count += 1
- if inventory_delta is not None:
- if (trans_id in self._new_contents or
- self.path_changed(trans_id)):
- if trans_id in self._new_contents:
- modified_paths.append(full_path)
- completed_new.append(trans_id)
- file_id = new_path_file_ids[trans_id]
- if file_id is not None and (trans_id in self._new_id or
- trans_id in self._new_name or
- trans_id in self._new_parent
- or trans_id in self._new_executability
- or trans_id in kind_changes):
- try:
- kind = self.final_kind(trans_id)
- except NoSuchFile:
- kind = self._tree.stored_kind(file_id)
- parent_trans_id = self.final_parent(trans_id)
- parent_file_id = new_path_file_ids.get(parent_trans_id)
- if parent_file_id is None:
- parent_file_id = self.final_file_id(
- parent_trans_id)
- if trans_id in self._new_reference_revision:
- new_entry = inventory.TreeReference(
- file_id,
- self._new_name[trans_id],
- self.final_file_id(self._new_parent[trans_id]),
- None, self._new_reference_revision[trans_id])
- else:
- new_entry = inventory.make_entry(kind,
- self.final_name(trans_id),
- parent_file_id, file_id)
- old_path = old_paths.get(new_entry.file_id)
- inventory_delta.append(
- (old_path, path, new_entry.file_id, new_entry))
-
+ if (trans_id in self._new_contents or
+ self.path_changed(trans_id)):
+ if trans_id in self._new_contents:
+ modified_paths.append(full_path)
if trans_id in self._new_executability:
- self._set_executability(path, new_entry, trans_id)
+ self._set_executability(path, trans_id)
finally:
child_pb.finished()
- if inventory_delta is None:
- self._new_contents.clear()
- else:
- for trans_id in completed_new:
- del self._new_contents[trans_id]
+ self._new_contents.clear()
return modified_paths
More information about the bazaar-commits
mailing list