17
17
"""Tree classes, representing directory at point in time.
21
import os.path, os, fnmatch, time
23
from osutils import pumpfile, filesize, quotefn, sha_file, \
24
joinpath, splitpath, appendpath, isdir, isfile, file_kind, fingerprint_file
26
from stat import S_ISREG, S_ISDIR, ST_MODE, ST_SIZE
28
from inventory import Inventory
29
from trace import mutter, note
30
from errors import bailout
23
from bzrlib.trace import mutter, note
24
from bzrlib.errors import BzrError
25
from bzrlib.inventory import Inventory
26
from bzrlib.osutils import pumpfile, appendpath, fingerprint_file
68
74
def _get_inventory(self):
69
75
return self._inventory
71
def get_file_by_path(self, path):
72
return self.get_file(self._inventory.path2id(path))
74
77
inventory = property(_get_inventory,
75
78
doc="Inventory of this Tree")
81
84
if ie.text_size != None:
82
85
if ie.text_size != fp['size']:
83
raise BzrError("mismatched size for file %r in %r" % (ie.file_id, self._store),
86
bailout("mismatched size for file %r in %r" % (ie.file_id, self._store),
84
87
["inventory expects %d bytes" % ie.text_size,
85
88
"file is actually %d bytes" % fp['size'],
86
89
"store is probably damaged/corrupt"])
88
91
if ie.text_sha1 != fp['sha1']:
89
raise BzrError("wrong SHA-1 for file %r in %r" % (ie.file_id, self._store),
92
bailout("wrong SHA-1 for file %r in %r" % (ie.file_id, self._store),
90
93
["inventory expects %s" % ie.text_sha1,
91
94
"file is actually %s" % fp['sha1'],
92
95
"store is probably damaged/corrupt"])
98
101
pumpfile(self.get_file(fileid), sys.stdout)
101
def export(self, dest, format='dir', root=None):
104
def export(self, dest, format='dir'):
102
105
"""Export this tree."""
104
107
exporter = exporters[format]
106
from bzrlib.errors import BzrCommandError
107
109
raise BzrCommandError("export format %r not supported" % format)
108
exporter(self, dest, root)
228
230
######################################################################
231
def dir_exporter(tree, dest, root):
233
def dir_exporter(tree, dest):
232
234
"""Export this tree to a new directory.
234
236
`dest` should not exist, and will be created holding the
252
253
elif kind == 'file':
253
254
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
bailout("don't know how to export {%s} of kind %r" % (ie.file_id, kind))
256
257
mutter(" export {%s} kind %s to %s" % (ie.file_id, kind, fullpath))
257
258
exporters['dir'] = dir_exporter
261
262
except ImportError:
264
def get_root_name(dest):
265
"""Get just the root name for a tarball.
267
>>> get_root_name('mytar.tar')
269
>>> get_root_name('mytar.tar.bz2')
271
>>> get_root_name('tar.tar.tar.tgz')
273
>>> get_root_name('bzr-0.0.5.tar.gz')
275
>>> get_root_name('a/long/path/mytar.tgz')
277
>>> get_root_name('../parent/../dir/other.tbz2')
280
endings = ['.tar', '.tar.gz', '.tgz', '.tar.bz2', '.tbz2']
281
dest = os.path.basename(dest)
283
if dest.endswith(end):
284
return dest[:-len(end)]
286
def tar_exporter(tree, dest, root, compression=None):
265
def tar_exporter(tree, dest, compression=None):
287
266
"""Export this tree to a new tar file.
289
268
`dest` will be created holding the contents of this tree; if it
290
269
already exists, it will be clobbered, like with "tar -c".
292
from time import time
294
272
compression = str(compression or '')
296
root = get_root_name(dest)
298
274
ball = tarfile.open(dest, 'w:' + compression)
299
275
except tarfile.CompressionError, e:
300
raise BzrError(str(e))
301
277
mutter('export version %r' % tree)
302
278
inv = tree.inventory
303
279
for dp, ie in inv.iter_entries():
304
280
mutter(" export {%s} kind %s to %s" % (ie.file_id, ie.kind, dest))
305
item = tarfile.TarInfo(os.path.join(root, dp))
281
item = tarfile.TarInfo(dp)
306
282
# TODO: would be cool to actually set it to the timestamp of the
307
283
# revision it was last changed
318
294
item.size = _find_file_size(fileobj)
321
raise BzrError("don't know how to export {%s} of kind %r" %
297
bailout("don't know how to export {%s} of kind %r" %
322
298
(ie.file_id, ie.kind))
324
300
ball.addfile(item, fileobj)
326
302
exporters['tar'] = tar_exporter
328
def tgz_exporter(tree, dest, root):
329
tar_exporter(tree, dest, root, compression='gz')
304
def tgz_exporter(tree, dest):
305
tar_exporter(tree, dest, compression='gz')
330
306
exporters['tgz'] = tgz_exporter
332
def tbz_exporter(tree, dest, root):
333
tar_exporter(tree, dest, root, compression='bz2')
308
def tbz_exporter(tree, dest):
309
tar_exporter(tree, dest, compression='bz2')
334
310
exporters['tbz2'] = tbz_exporter