21
from cStringIO import StringIO
23
24
from bzrlib.trace import mutter, note
24
from bzrlib.errors import BzrError
25
from bzrlib.errors import BzrError, BzrCheckError
25
26
from bzrlib.inventory import Inventory
26
from bzrlib.osutils import pumpfile, appendpath, fingerprint_file
27
from bzrlib.osutils import appendpath, fingerprint_file
92
95
"store is probably damaged/corrupt"])
95
def print_file(self, fileid):
96
"""Print file with id `fileid` to stdout."""
98
def print_file(self, file_id):
99
"""Print file with id `file_id` to stdout."""
98
pumpfile(self.get_file(fileid), sys.stdout)
101
sys.stdout.write(self.get_file_text(file_id))
101
104
def export(self, dest, format='dir', root=None):
119
122
or at least passing a description to the constructor.
122
def __init__(self, store, inv):
125
def __init__(self, weave_store, inv, revision_id):
126
self._weave_store = weave_store
124
127
self._inventory = inv
128
self._revision_id = revision_id
130
def get_weave(self, file_id):
131
# FIXME: RevisionTree should be given a branch
132
# not a store, or the store should know the branch.
133
import bzrlib.transactions as transactions
134
return self._weave_store.get_weave(file_id,
135
transactions.PassThroughTransaction())
138
def get_file_lines(self, file_id):
139
ie = self._inventory[file_id]
140
weave = self.get_weave(file_id)
141
return weave.get(ie.revision)
144
def get_file_text(self, file_id):
145
return ''.join(self.get_file_lines(file_id))
126
148
def get_file(self, file_id):
127
ie = self._inventory[file_id]
128
f = self._store[ie.text_id]
129
mutter(" get fileid{%s} from %r" % (file_id, self))
130
self._check_retrieved(ie, f)
149
return StringIO(self.get_file_text(file_id))
133
151
def get_file_size(self, file_id):
134
152
return self._inventory[file_id].text_size
136
154
def get_file_sha1(self, file_id):
137
155
ie = self._inventory[file_id]
156
if ie.kind == "file":
159
def is_executable(self, file_id):
160
return self._inventory[file_id].executable
140
162
def has_filename(self, filename):
141
163
return bool(self.inventory.path2id(filename))
143
165
def list_files(self):
144
166
# The only files returned by this are those from the version
145
167
for path, entry in self.inventory.iter_entries():
146
yield path, 'V', entry.kind, entry.file_id
168
yield path, 'V', entry.kind, entry.file_id, entry
170
def get_symlink_target(self, file_id):
171
ie = self._inventory[file_id]
172
return ie.symlink_target;
149
175
class EmptyTree(Tree):
150
176
def __init__(self):
151
177
self._inventory = Inventory()
179
def get_symlink_target(self, file_id):
153
182
def has_filename(self, filename):
156
185
def list_files(self):
157
if False: # just to make it a generator
188
def __contains__(self, file_id):
189
return file_id in self._inventory
191
def get_file_sha1(self, file_id):
192
assert self._inventory[file_id].kind == "root_directory"
162
196
######################################################################
245
279
mutter('export version %r' % tree)
246
280
inv = tree.inventory
247
281
for dp, ie in inv.iter_entries():
249
fullpath = appendpath(dest, dp)
250
if kind == 'directory':
253
pumpfile(tree.get_file(ie.file_id), file(fullpath, 'wb'))
255
raise BzrError("don't know how to export {%s} of kind %r" % (ie.file_id, kind))
256
mutter(" export {%s} kind %s to %s" % (ie.file_id, kind, fullpath))
282
ie.put_on_disk(dest, dp, tree)
257
284
exporters['dir'] = dir_exporter
302
329
inv = tree.inventory
303
330
for dp, ie in inv.iter_entries():
304
331
mutter(" export {%s} kind %s to %s" % (ie.file_id, ie.kind, dest))
305
item = tarfile.TarInfo(os.path.join(root, dp))
306
# TODO: would be cool to actually set it to the timestamp of the
307
# revision it was last changed
309
if ie.kind == 'directory':
310
item.type = tarfile.DIRTYPE
315
elif ie.kind == 'file':
316
item.type = tarfile.REGTYPE
317
fileobj = tree.get_file(ie.file_id)
318
item.size = _find_file_size(fileobj)
321
raise BzrError("don't know how to export {%s} of kind %r" %
322
(ie.file_id, ie.kind))
332
item, fileobj = ie.get_tar_item(root, dp, now, tree)
324
333
ball.addfile(item, fileobj)
326
336
exporters['tar'] = tar_exporter
328
338
def tgz_exporter(tree, dest, root):
332
342
def tbz_exporter(tree, dest, root):
333
343
tar_exporter(tree, dest, root, compression='bz2')
334
344
exporters['tbz2'] = tbz_exporter
337
def _find_file_size(fileobj):
338
offset = fileobj.tell()
341
size = fileobj.tell()
343
# gzip doesn't accept second argument to seek()
347
nread = len(fileobj.read())