Rev 6448: (jelmer) Support passing in file ids as tuples to the Tree API. (Jelmer in file:///srv/pqm.bazaar-vcs.org/archives/thelove/bzr/%2Btrunk/

Patch Queue Manager pqm at pqm.ubuntu.com
Fri Jan 27 15:23:56 UTC 2012


At file:///srv/pqm.bazaar-vcs.org/archives/thelove/bzr/%2Btrunk/

------------------------------------------------------------
revno: 6448 [merge]
revision-id: pqm at pqm.ubuntu.com-20120127152356-p0jildfhjjauuu6j
parent: pqm at pqm.ubuntu.com-20120127142832-qcv2y1c3i0mbt9bl
parent: jelmer at samba.org-20120124161008-liqxwpnsbyz9s83m
committer: Patch Queue Manager <pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Fri 2012-01-27 15:23:56 +0000
message:
  (jelmer) Support passing in file ids as tuples to the Tree API. (Jelmer
   Vernooij)
modified:
  bzrlib/revisiontree.py         revisiontree.py-20060724012533-bg8xyryhxd0o0i0h-1
  bzrlib/tree.py                 tree.py-20050309040759-9d5f2496be663e77
  bzrlib/workingtree.py          workingtree.py-20050511021032-29b6ec0a681e02e3
  bzrlib/workingtree_4.py        workingtree_4.py-20070208044105-5fgpc5j3ljlh5q6c-1
  doc/en/release-notes/bzr-2.6.txt bzr2.6.txt-20120116134316-8w1xxom1c7vcu1t5-1
=== modified file 'bzrlib/revisiontree.py'
--- a/bzrlib/revisiontree.py	2012-01-24 15:41:21 +0000
+++ b/bzrlib/revisiontree.py	2012-01-24 16:10:08 +0000
@@ -103,7 +103,8 @@
         self._inventory = inv
 
     def get_file_mtime(self, file_id, path=None):
-        ie = self.inventory[file_id]
+        inv, inv_file_id = self._unpack_file_id(file_id)
+        ie = inv[inv_file_id]
         try:
             revision = self._repository.get_revision(ie.revision)
         except errors.NoSuchRevision:
@@ -111,20 +112,24 @@
         return revision.timestamp
 
     def get_file_size(self, file_id):
-        return self.inventory[file_id].text_size
+        inv, inv_file_id = self._unpack_file_id(file_id)
+        return inv[inv_file_id].text_size
 
     def get_file_sha1(self, file_id, path=None, stat_value=None):
-        ie = self.inventory[file_id]
+        inv, inv_file_id = self._unpack_file_id(file_id)
+        ie = inv[inv_file_id]
         if ie.kind == "file":
             return ie.text_sha1
         return None
 
     def get_file_revision(self, file_id, path=None):
-        ie = self.inventory[file_id]
+        inv, inv_file_id = self._unpack_file_id(file_id)
+        ie = inv[inv_file_id]
         return ie.revision
 
     def is_executable(self, file_id, path=None):
-        ie = self.inventory[file_id]
+        inv, inv_file_id = self._unpack_file_id(file_id)
+        ie = inv[inv_file_id]
         if ie.kind != "file":
             return False
         return ie.executable
@@ -138,8 +143,7 @@
             from_dir_id = None
             inv = self.inventory
         else:
-            inv = self.inventory
-            from_dir_id = self.path2id(from_dir)
+            inv, from_dir_id = self._path2inv_file_id(from_dir)
             if from_dir_id is None:
                 # Directory not versioned
                 return
@@ -151,26 +155,29 @@
             yield path, 'V', entry.kind, entry.file_id, entry
 
     def get_symlink_target(self, file_id, path=None):
-        ie = self.inventory[file_id]
+        inv, inv_file_id = self._unpack_file_id(file_id)
+        ie = inv[inv_file_id]
         # Inventories store symlink targets in unicode
         return ie.symlink_target
 
     def get_reference_revision(self, file_id, path=None):
-        return self.inventory[file_id].reference_revision
+        inv, inv_file_id = self._unpack_file_id(file_id)
+        return inv[inv_file_id].reference_revision
 
     def get_root_id(self):
         if self.inventory.root:
             return self.inventory.root.file_id
 
     def kind(self, file_id):
-        return self.inventory[file_id].kind
+        inv, inv_file_id = self._unpack_file_id(file_id)
+        return inv[inv_file_id].kind
 
     def path_content_summary(self, path):
         """See Tree.path_content_summary."""
-        file_id = self.path2id(path)
+        inv, file_id = self._path2inv_file_id(path)
         if file_id is None:
             return ('missing', None, None, None)
-        entry = self.inventory[file_id]
+        entry = inv[file_id]
         kind = entry.kind
         if kind == 'file':
             return (kind, entry.text_size, entry.executable, entry.text_sha1)
@@ -189,8 +196,7 @@
 
     def walkdirs(self, prefix=""):
         _directory = 'directory'
-        inv = self.inventory
-        top_id = self.path2id(prefix)
+        inv, top_id = self._path2inv_file_id(prefix)
         if top_id is None:
             pending = []
         else:

=== modified file 'bzrlib/tree.py'
--- a/bzrlib/tree.py	2012-01-24 15:40:58 +0000
+++ b/bzrlib/tree.py	2012-01-24 16:10:08 +0000
@@ -774,23 +774,46 @@
     inventory = property(_get_inventory,
                          doc="Inventory of this Tree")
 
+    def _unpack_file_id(self, file_id):
+        """Find the inventory and inventory file id for a tree file id.
+
+        :param file_id: The tree file id, as bytestring or tuple
+        :return: Inventory and inventory file id
+        """
+        if isinstance(file_id, tuple):
+            if len(file_id) != 1:
+                raise ValueError("nested trees not yet supported: %r" % file_id)
+            file_id = file_id[0]
+        return self.inventory, file_id
+
     @needs_read_lock
     def path2id(self, path):
         """Return the id for path in this tree."""
-        return self.inventory.path2id(path)
+        return self._path2inv_file_id(path)[1]
+
+    def _path2inv_file_id(self, path):
+        """Lookup a inventory and inventory file id by path.
+
+        :param path: Path to look up
+        :return: tuple with inventory and inventory file id
+        """
+        return self.inventory, self.inventory.path2id(path)
 
     def id2path(self, file_id):
         """Return the path for a file id.
 
         :raises NoSuchId:
         """
-        return self.inventory.id2path(file_id)
+        inventory, file_id = self._unpack_file_id(file_id)
+        return inventory.id2path(file_id)
 
     def has_id(self, file_id):
-        return self.inventory.has_id(file_id)
+        inventory, file_id = self._unpack_file_id(file_id)
+        return inventory.has_id(file_id)
 
     def has_or_had_id(self, file_id):
-        return self.inventory.has_id(file_id)
+        inventory, file_id = self._unpack_file_id(file_id)
+        return inventory.has_id(file_id)
 
     def all_file_ids(self):
         return set(
@@ -823,8 +846,18 @@
             down to specific_file_ids that have been requested. This has no
             impact if specific_file_ids is None.
         """
+        if specific_file_ids is None:
+            inventory_file_ids = None
+        else:
+            inventory_file_ids = []
+            for tree_file_id in specific_file_ids:
+                inventory, inv_file_id = self._unpack_file_id(tree_file_id)
+                if not inventory is self.inventory: # for now
+                    raise AssertionError("%r != %r" % (
+                        inventory, self.inventory))
+                inventory_file_ids.append(inv_file_id)
         return self.inventory.iter_entries_by_dir(
-            specific_file_ids=specific_file_ids, yield_parents=yield_parents)
+            specific_file_ids=inventory_file_ids, yield_parents=yield_parents)
 
     @deprecated_method(deprecated_in((2, 5, 0)))
     def get_file_by_path(self, path):

=== modified file 'bzrlib/workingtree.py'
--- a/bzrlib/workingtree.py	2012-01-24 15:42:02 +0000
+++ b/bzrlib/workingtree.py	2012-01-24 16:10:08 +0000
@@ -2069,15 +2069,17 @@
 
     def has_id(self, file_id):
         # files that have been deleted are excluded
-        if not self.inventory.has_id(file_id):
+        inv, inv_file_id = self._unpack_file_id(file_id)
+        if not inv.has_id(inv_file_id):
             return False
-        path = self.inventory.id2path(file_id)
+        path = inv.id2path(inv_file_id)
         return osutils.lexists(self.abspath(path))
 
     def has_or_had_id(self, file_id):
         if file_id == self.inventory.root.file_id:
             return True
-        return self.inventory.has_id(file_id)
+        inv, inv_file_id = self._unpack_file_id(file_id)
+        return inv.has_id(inv_file_id)
 
     def all_file_ids(self):
         """Iterate through file_ids for this tree.
@@ -2177,12 +2179,12 @@
             raise
 
     def _is_executable_from_path_and_stat_from_basis(self, path, stat_result):
-        file_id = self.path2id(path)
+        inv, file_id = self._path2inv_file_id(path)
         if file_id is None:
             # For unversioned files on win32, we just assume they are not
             # executable
             return False
-        return self.inventory[file_id].executable
+        return inv[file_id].executable
 
     def _is_executable_from_path_and_stat_from_stat(self, path, stat_result):
         mode = stat_result.st_mode
@@ -2190,7 +2192,8 @@
 
     def is_executable(self, file_id, path=None):
         if not self._supports_executable():
-            return self.inventory[file_id].executable
+            inv, inv_file_id = self._unpack_file_id(file_id)
+            return inv[inv_file_id].executable
         else:
             if not path:
                 path = self.id2path(file_id)
@@ -2457,8 +2460,7 @@
 
         # directory file_id, relative path, absolute path, reverse sorted children
         if from_dir is not None:
-            inv = self.inventory
-            from_dir_id = self.path2id(from_dir)
+            inv, from_dir_id = self._path2inv_file_id(from_dir)
             if from_dir_id is None:
                 # Directory not versioned
                 return
@@ -2606,12 +2608,12 @@
         if not self.has_filename(to_dir):
             raise errors.BzrMoveFailedError('',to_dir,
                 errors.NotInWorkingDirectory(to_dir))
-        to_dir_id = self.path2id(to_dir)
+        to_inv, to_dir_id = self._path2inv_file_id(to_dir)
         if to_dir_id is None:
             raise errors.BzrMoveFailedError('',to_dir,
                 errors.NotVersionedError(path=to_dir))
 
-        to_dir_ie = self.inventory[to_dir_id]
+        to_dir_ie = to_inv[to_dir_id]
         if to_dir_ie.kind != 'directory':
             raise errors.BzrMoveFailedError('',to_dir,
                 errors.NotADirectory(to_abs))
@@ -2619,12 +2621,12 @@
         # create rename entries and tuples
         for from_rel in from_paths:
             from_tail = splitpath(from_rel)[-1]
-            from_id = self.path2id(from_rel)
+            from_inv, from_id = self._path2inv_file_id(from_rel)
             if from_id is None:
                 raise errors.BzrMoveFailedError(from_rel,to_dir,
                     errors.NotVersionedError(path=from_rel))
 
-            from_entry = self.inventory[from_id]
+            from_entry = from_inv[from_id]
             from_parent_id = from_entry.parent_id
             to_rel = pathjoin(to_dir, from_tail)
             rename_entry = InventoryWorkingTree._RenameEntry(
@@ -2649,7 +2651,8 @@
             # restore the inventory on error
             self._inventory_is_modified = original_modified
             raise
-        self._write_inventory(self.inventory)
+        #FIXME: Should potentially also write the from_invs
+        self._write_inventory(to_inv)
         return rename_tuples
 
     @needs_tree_write_lock
@@ -2679,7 +2682,7 @@
 
         # create rename entries and tuples
         from_tail = splitpath(from_rel)[-1]
-        from_id = self.path2id(from_rel)
+        from_inv, from_id = self._path2inv_file_id(from_rel)
         if from_id is None:
             # if file is missing in the inventory maybe it's in the basis_tree
             basis_tree = self.branch.basis_tree()
@@ -2689,12 +2692,13 @@
                     errors.NotVersionedError(path=from_rel))
             # put entry back in the inventory so we can rename it
             from_entry = basis_tree.inventory[from_id].copy()
-            self.inventory.add(from_entry)
+            from_inv.add(from_entry)
         else:
-            from_entry = self.inventory[from_id]
+            from_inv, from_inv_id = self._unpack_file_id(from_id)
+            from_entry = from_inv[from_inv_id]
         from_parent_id = from_entry.parent_id
         to_dir, to_tail = os.path.split(to_rel)
-        to_dir_id = self.path2id(to_dir)
+        to_inv, to_dir_id = self._path2inv_file_id(to_dir)
         rename_entry = InventoryWorkingTree._RenameEntry(from_rel=from_rel,
                                      from_id=from_id,
                                      from_tail=from_tail,
@@ -2722,7 +2726,7 @@
                from_id, from_rel, to_rel, to_dir, to_dir_id)
 
         self._move(rename_entries)
-        self._write_inventory(self.inventory)
+        self._write_inventory(to_inv)
 
     class _RenameEntry(object):
         def __init__(self, from_rel, from_id, from_tail, from_parent_id,
@@ -2881,7 +2885,8 @@
 
     def stored_kind(self, file_id):
         """See Tree.stored_kind"""
-        return self.inventory[file_id].kind
+        inv, inv_file_id = self._unpack_file_id(file_id)
+        return inv[inv_file_id].kind
 
     def extras(self):
         """Yield all unversioned files in this WorkingTree.
@@ -2937,8 +2942,7 @@
         """
         _directory = 'directory'
         # get the root in the inventory
-        inv = self.inventory
-        top_id = inv.path2id(prefix)
+        inv, top_id = self._path2inv_file_id(prefix)
         if top_id is None:
             pending = []
         else:

=== modified file 'bzrlib/workingtree_4.py'
--- a/bzrlib/workingtree_4.py	2012-01-27 12:31:04 +0000
+++ b/bzrlib/workingtree_4.py	2012-01-27 15:23:56 +0000
@@ -1873,21 +1873,24 @@
 
     @needs_read_lock
     def get_file_revision(self, file_id):
-        return self.inventory[file_id].revision
+        inv, inv_file_id = self._unpack_file_id(file_id)
+        return inv[inv_file_id].revision
 
     def get_file(self, file_id, path=None):
         return StringIO(self.get_file_text(file_id))
 
     def get_file_size(self, file_id):
         """See Tree.get_file_size"""
-        return self.inventory[file_id].text_size
+        inv, inv_file_id = self._unpack_file_id(file_id)
+        return inv[inv_file_id].text_size
 
     def get_file_text(self, file_id, path=None):
         _, content = list(self.iter_files_bytes([(file_id, None)]))[0]
         return ''.join(content)
 
     def get_reference_revision(self, file_id, path=None):
-        return self.inventory[file_id].reference_revision
+        inv, inv_file_id = self._unpack_file_id(file_id)
+        return inv[inv_file_id].reference_revision
 
     def iter_files_bytes(self, desired_files):
         """See Tree.iter_files_bytes.
@@ -1947,10 +1950,10 @@
 
     def path_content_summary(self, path):
         """See Tree.path_content_summary."""
-        file_id = self.path2id(path)
-        if file_id is None:
+        inv, inv_file_id = self._path2inv_file_id(path)
+        if inv_file_id is None:
             return ('missing', None, None, None)
-        entry = self.inventory[file_id]
+        entry = inv[inv_file_id]
         kind = entry.kind
         if kind == 'file':
             return (kind, entry.text_size, entry.executable, entry.text_sha1)
@@ -1960,7 +1963,8 @@
             return (kind, None, None, None)
 
     def is_executable(self, file_id, path=None):
-        ie = self.inventory[file_id]
+        inv, inv_file_id = self._unpack_file_id(file_id)
+        ie = inv[inv_file_id]
         if ie.kind != "file":
             return False
         return ie.executable
@@ -1975,8 +1979,7 @@
             inv = self.inventory
             from_dir_id = None
         else:
-            inv = self.inventory
-            from_dir_id = self.path2id(from_dir)
+            inv, from_dir_id = self._path2inv_file_id(from_dir)
             if from_dir_id is None:
                 # Directory not versioned
                 return

=== modified file 'doc/en/release-notes/bzr-2.6.txt'
--- a/doc/en/release-notes/bzr-2.6.txt	2012-01-23 15:07:14 +0000
+++ b/doc/en/release-notes/bzr-2.6.txt	2012-01-24 16:10:08 +0000
@@ -48,6 +48,10 @@
 .. Changes that may require updates in plugins or other code that uses
    bzrlib.
 
+* File ids in the ``Tree`` API can now be bytestring as previously,
+  or tuples of bytestrings.
+  (Jelmer Vernooij)
+
 Internals
 *********
 




More information about the bazaar-commits mailing list