21
from cStringIO import StringIO
24
23
from bzrlib.trace import mutter, note
25
from bzrlib.errors import BzrError, BzrCheckError
24
from bzrlib.errors import BzrError
26
25
from bzrlib.inventory import Inventory
27
from bzrlib.osutils import appendpath, fingerprint_file
26
from bzrlib.osutils import pumpfile, appendpath, fingerprint_file
95
92
"store is probably damaged/corrupt"])
98
def print_file(self, file_id):
99
"""Print file with id `file_id` to stdout."""
95
def print_file(self, fileid):
96
"""Print file with id `fileid` to stdout."""
101
sys.stdout.write(self.get_file_text(file_id))
98
pumpfile(self.get_file(fileid), sys.stdout)
104
101
def export(self, dest, format='dir', root=None):
122
119
or at least passing a description to the constructor.
125
def __init__(self, weave_store, inv, revision_id):
126
self._weave_store = weave_store
122
def __init__(self, store, inv):
127
124
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))
148
126
def get_file(self, file_id):
149
return StringIO(self.get_file_text(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)
151
133
def get_file_size(self, file_id):
152
134
return self._inventory[file_id].text_size
156
138
if ie.kind == "file":
157
139
return ie.text_sha1
159
def is_executable(self, file_id):
160
return self._inventory[file_id].executable
162
141
def has_filename(self, filename):
163
142
return bool(self.inventory.path2id(filename))
165
144
def list_files(self):
166
145
# The only files returned by this are those from the version
167
146
for path, entry in self.inventory.iter_entries():
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;
147
yield path, 'V', entry.kind, entry.file_id
175
150
class EmptyTree(Tree):
176
151
def __init__(self):
177
152
self._inventory = Inventory()
179
def get_symlink_target(self, file_id):
182
154
def has_filename(self, filename):
185
157
def list_files(self):
158
if False: # just to make it a generator
188
161
def __contains__(self, file_id):
189
162
return file_id in self._inventory
279
254
mutter('export version %r' % tree)
280
255
inv = tree.inventory
281
256
for dp, ie in inv.iter_entries():
282
ie.put_on_disk(dest, dp, tree)
258
fullpath = appendpath(dest, dp)
259
if kind == 'directory':
262
pumpfile(tree.get_file(ie.file_id), file(fullpath, 'wb'))
264
raise BzrError("don't know how to export {%s} of kind %r" % (ie.file_id, kind))
265
mutter(" export {%s} kind %s to %s" % (ie.file_id, kind, fullpath))
284
266
exporters['dir'] = dir_exporter
329
311
inv = tree.inventory
330
312
for dp, ie in inv.iter_entries():
331
313
mutter(" export {%s} kind %s to %s" % (ie.file_id, ie.kind, dest))
332
item, fileobj = ie.get_tar_item(root, dp, now, tree)
314
item = tarfile.TarInfo(os.path.join(root, dp))
315
# TODO: would be cool to actually set it to the timestamp of the
316
# revision it was last changed
318
if ie.kind == 'directory':
319
item.type = tarfile.DIRTYPE
324
elif ie.kind == 'file':
325
item.type = tarfile.REGTYPE
326
fileobj = tree.get_file(ie.file_id)
327
item.size = _find_file_size(fileobj)
330
raise BzrError("don't know how to export {%s} of kind %r" %
331
(ie.file_id, ie.kind))
333
333
ball.addfile(item, fileobj)
336
335
exporters['tar'] = tar_exporter
338
337
def tgz_exporter(tree, dest, root):
342
341
def tbz_exporter(tree, dest, root):
343
342
tar_exporter(tree, dest, root, compression='bz2')
344
343
exporters['tbz2'] = tbz_exporter
346
def _find_file_size(fileobj):
347
offset = fileobj.tell()
350
size = fileobj.tell()
352
# gzip doesn't accept second argument to seek()
356
nread = len(fileobj.read())