17
17
"""Tree classes, representing directory at point in time.
21
from cStringIO import StringIO
20
from osutils import pumpfile, appendpath, fingerprint_file
22
from bzrlib.trace import mutter, note
23
from bzrlib.errors import BzrError
24
from bzrlib.trace import mutter, note
25
from bzrlib.errors import BzrError, BzrCheckError
26
from bzrlib.inventory import Inventory
27
from bzrlib.osutils import pumpfile, appendpath, fingerprint_file
69
66
def _get_inventory(self):
70
67
return self._inventory
72
def get_file_by_path(self, path):
73
return self.get_file(self._inventory.path2id(path))
75
69
inventory = property(_get_inventory,
76
70
doc="Inventory of this Tree")
93
87
"store is probably damaged/corrupt"])
96
def print_file(self, file_id):
97
"""Print file with id `file_id` to stdout."""
90
def print_file(self, fileid):
91
"""Print file with id `fileid` to stdout."""
99
sys.stdout.write(self.get_file_text(file_id))
102
def export(self, dest, format='dir', root=None):
93
pumpfile(self.get_file(fileid), sys.stdout)
96
def export(self, dest, format='dir'):
103
97
"""Export this tree."""
105
99
exporter = exporters[format]
107
from bzrlib.errors import BzrCommandError
108
101
raise BzrCommandError("export format %r not supported" % format)
109
exporter(self, dest, root)
120
113
or at least passing a description to the constructor.
123
def __init__(self, weave_store, inv, revision_id):
124
self._weave_store = weave_store
116
def __init__(self, store, inv):
125
118
self._inventory = inv
126
self._revision_id = revision_id
128
def get_weave(self, file_id):
129
return self._weave_store.get_weave(file_id)
132
def get_file_text(self, file_id):
133
ie = self._inventory[file_id]
134
weave = self.get_weave(file_id)
135
idx = weave.lookup(ie.text_version)
136
content = weave.get_text(idx)
137
if len(content) != ie.text_size:
138
raise BzrCheckError('mismatched size on revision %s of file %s: '
140
% (self._revision_id, file_id, len(content),
144
120
def get_file(self, file_id):
145
return StringIO(self.get_file_text(file_id))
121
ie = self._inventory[file_id]
122
f = self._store[ie.text_id]
123
mutter(" get fileid{%s} from %r" % (file_id, self))
124
self._check_retrieved(ie, f)
147
127
def get_file_size(self, file_id):
148
128
return self._inventory[file_id].text_size
150
130
def get_file_sha1(self, file_id):
151
131
ie = self._inventory[file_id]
152
if ie.kind == "file":
155
134
def has_filename(self, filename):
156
135
return bool(self.inventory.path2id(filename))
172
152
if False: # just to make it a generator
175
def __contains__(self, file_id):
176
return file_id in self._inventory
178
def get_file_sha1(self, file_id):
179
assert self._inventory[file_id].kind == "root_directory"
185
157
######################################################################
251
223
######################################################################
254
def dir_exporter(tree, dest, root):
226
def dir_exporter(tree, dest):
255
227
"""Export this tree to a new directory.
257
229
`dest` should not exist, and will be created holding the
284
256
except ImportError:
287
def get_root_name(dest):
288
"""Get just the root name for a tarball.
290
>>> get_root_name('mytar.tar')
292
>>> get_root_name('mytar.tar.bz2')
294
>>> get_root_name('tar.tar.tar.tgz')
296
>>> get_root_name('bzr-0.0.5.tar.gz')
298
>>> get_root_name('a/long/path/mytar.tgz')
300
>>> get_root_name('../parent/../dir/other.tbz2')
303
endings = ['.tar', '.tar.gz', '.tgz', '.tar.bz2', '.tbz2']
304
dest = os.path.basename(dest)
306
if dest.endswith(end):
307
return dest[:-len(end)]
309
def tar_exporter(tree, dest, root, compression=None):
259
def tar_exporter(tree, dest, compression=None):
310
260
"""Export this tree to a new tar file.
312
262
`dest` will be created holding the contents of this tree; if it
315
265
from time import time
317
267
compression = str(compression or '')
319
root = get_root_name(dest)
321
269
ball = tarfile.open(dest, 'w:' + compression)
322
270
except tarfile.CompressionError, e:
325
273
inv = tree.inventory
326
274
for dp, ie in inv.iter_entries():
327
275
mutter(" export {%s} kind %s to %s" % (ie.file_id, ie.kind, dest))
328
item = tarfile.TarInfo(os.path.join(root, dp))
276
item = tarfile.TarInfo(dp)
329
277
# TODO: would be cool to actually set it to the timestamp of the
330
278
# revision it was last changed
349
297
exporters['tar'] = tar_exporter
351
def tgz_exporter(tree, dest, root):
352
tar_exporter(tree, dest, root, compression='gz')
299
def tgz_exporter(tree, dest):
300
tar_exporter(tree, dest, compression='gz')
353
301
exporters['tgz'] = tgz_exporter
355
def tbz_exporter(tree, dest, root):
356
tar_exporter(tree, dest, root, compression='bz2')
303
def tbz_exporter(tree, dest):
304
tar_exporter(tree, dest, compression='bz2')
357
305
exporters['tbz2'] = tbz_exporter