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