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