1
# Copyright (C) 2005 Canonical Ltd
1
# Copyright (C) 2005, 2007 Canonical Ltd
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
28
29
"""Tree viewing a previous revision.
30
31
File text can be retrieved from the text store.
32
TODO: Some kind of `__repr__` method, but a good one
33
probably means knowing the branch and revision number,
34
or at least passing a description to the constructor.
37
34
def __init__(self, branch, inv, revision_id):
45
42
self._inventory = inv
46
43
self._revision_id = osutils.safe_revision_id(revision_id)
45
def supports_tree_reference(self):
48
48
def get_parent_ids(self):
49
49
"""See Tree.get_parent_ids.
51
51
A RevisionTree's parents match the revision graph.
53
if self._revision_id not in (None, 'null:'):
53
if self._revision_id in (None, revision.NULL_REVISION):
54
56
parent_ids = self._repository.get_revision(
55
57
self._revision_id).parent_ids
60
60
def get_revision_id(self):
128
128
ie = self._inventory[file_id]
129
129
return ie.symlink_target;
131
def get_reference_revision(self, file_id, path=None):
132
return self.inventory[file_id].reference_revision
134
def get_root_id(self):
135
if self.inventory.root:
136
return self.inventory.root.file_id
131
138
def kind(self, file_id):
132
139
file_id = osutils.safe_file_id(file_id)
133
140
return self._inventory[file_id].kind
144
151
def lock_read(self):
145
152
self._repository.lock_read()
155
return '<%s instance at %x, rev_id=%r>' % (
156
self.__class__.__name__, id(self), self._revision_id)
147
158
def unlock(self):
148
159
self._repository.unlock()
161
def walkdirs(self, prefix=""):
162
_directory = 'directory'
164
top_id = inv.path2id(prefix)
168
pending = [(prefix, '', _directory, None, top_id, None)]
171
currentdir = pending.pop()
172
# 0 - relpath, 1- basename, 2- kind, 3- stat, id, v-kind
174
relroot = currentdir[0] + '/'
177
# FIXME: stash the node in pending
178
entry = inv[currentdir[4]]
179
for name, child in entry.sorted_children():
180
toppath = relroot + name
181
dirblock.append((toppath, name, child.kind, None,
182
child.file_id, child.kind
184
yield (currentdir[0], entry.file_id), dirblock
185
# push the user specified dirs from dirblock
186
for dir in reversed(dirblock):
187
if dir[2] == _directory: