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
return self._weave_store.get_weave(file_id)
134
def get_file_lines(self, file_id):
135
ie = self._inventory[file_id]
136
weave = self.get_weave(file_id)
137
return weave.get(ie.revision)
140
def get_file_text(self, file_id):
141
return ''.join(self.get_file_lines(file_id))
126
144
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)
145
return StringIO(self.get_file_text(file_id))
133
147
def get_file_size(self, file_id):
134
148
return self._inventory[file_id].text_size
138
152
if ie.kind == "file":
139
153
return ie.text_sha1
155
def is_executable(self, file_id):
156
return self._inventory[file_id].executable
141
158
def has_filename(self, filename):
142
159
return bool(self.inventory.path2id(filename))
144
161
def list_files(self):
145
162
# The only files returned by this are those from the version
146
163
for path, entry in self.inventory.iter_entries():
147
yield path, 'V', entry.kind, entry.file_id
164
yield path, 'V', entry.kind, entry.file_id, entry
166
def get_symlink_target(self, file_id):
167
ie = self._inventory[file_id]
168
return ie.symlink_target;
150
171
class EmptyTree(Tree):
151
172
def __init__(self):
152
173
self._inventory = Inventory()
175
def get_symlink_target(self, file_id):
154
178
def has_filename(self, filename):
157
181
def list_files(self):
158
if False: # just to make it a generator
161
184
def __contains__(self, file_id):
162
185
return file_id in self._inventory
254
275
mutter('export version %r' % tree)
255
276
inv = tree.inventory
256
277
for dp, ie in inv.iter_entries():
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))
278
ie.put_on_disk(dest, dp, tree)
266
280
exporters['dir'] = dir_exporter
311
325
inv = tree.inventory
312
326
for dp, ie in inv.iter_entries():
313
327
mutter(" export {%s} kind %s to %s" % (ie.file_id, ie.kind, dest))
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))
328
item, fileobj = ie.get_tar_item(root, dp, now, tree)
333
329
ball.addfile(item, fileobj)
335
332
exporters['tar'] = tar_exporter
337
334
def tgz_exporter(tree, dest, root):
341
338
def tbz_exporter(tree, dest, root):
342
339
tar_exporter(tree, dest, root, compression='bz2')
343
340
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())