~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tree.py

  • Committer: Martin Pool
  • Date: 2005-07-11 07:05:34 UTC
  • Revision ID: mbp@sourcefrog.net-20050711070534-5227696ab167ccde
- merge aaron's append_multiple.patch

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
"""Tree classes, representing directory at point in time.
18
18
"""
19
19
 
20
 
from sets import Set
21
 
import os.path, os, fnmatch, time
22
 
 
23
 
from osutils import pumpfile, filesize, quotefn, sha_file, \
24
 
     joinpath, splitpath, appendpath, isdir, isfile, file_kind, fingerprint_file
25
 
import errno
26
 
from stat import S_ISREG, S_ISDIR, ST_MODE, ST_SIZE
27
 
 
28
 
from inventory import Inventory
29
 
from trace import mutter, note
30
 
from errors import bailout
31
 
import branch
 
20
from osutils import pumpfile, appendpath, fingerprint_file
 
21
import os
 
22
 
 
23
from bzrlib.trace import mutter, note
 
24
from bzrlib.errors import BzrError
32
25
 
33
26
import bzrlib
34
27
 
83
76
        
84
77
        if ie.text_size != None:
85
78
            if ie.text_size != fp['size']:
86
 
                bailout("mismatched size for file %r in %r" % (ie.file_id, self._store),
 
79
                raise BzrError("mismatched size for file %r in %r" % (ie.file_id, self._store),
87
80
                        ["inventory expects %d bytes" % ie.text_size,
88
81
                         "file is actually %d bytes" % fp['size'],
89
82
                         "store is probably damaged/corrupt"])
90
83
 
91
84
        if ie.text_sha1 != fp['sha1']:
92
 
            bailout("wrong SHA-1 for file %r in %r" % (ie.file_id, self._store),
 
85
            raise BzrError("wrong SHA-1 for file %r in %r" % (ie.file_id, self._store),
93
86
                    ["inventory expects %s" % ie.text_sha1,
94
87
                     "file is actually %s" % fp['sha1'],
95
88
                     "store is probably damaged/corrupt"])
101
94
        pumpfile(self.get_file(fileid), sys.stdout)
102
95
        
103
96
        
104
 
    def export(self, dest, format='dir'):
 
97
    def export(self, dest, format='dir', root=None):
105
98
        """Export this tree."""
106
99
        try:
107
100
            exporter = exporters[format]
108
101
        except KeyError:
 
102
            from bzrlib.errors import BzrCommandError
109
103
            raise BzrCommandError("export format %r not supported" % format)
110
 
        exporter(self, dest)
 
104
        exporter(self, dest, root)
111
105
 
112
106
 
113
107
 
150
144
 
151
145
class EmptyTree(Tree):
152
146
    def __init__(self):
 
147
        from bzrlib.inventory import Inventory
153
148
        self._inventory = Inventory()
154
149
 
155
150
    def has_filename(self, filename):
230
225
######################################################################
231
226
# export
232
227
 
233
 
def dir_exporter(tree, dest):
 
228
def dir_exporter(tree, dest, root):
234
229
    """Export this tree to a new directory.
235
230
 
236
231
    `dest` should not exist, and will be created holding the
242
237
    :note: If the export fails, the destination directory will be
243
238
           left in a half-assed state.
244
239
    """
 
240
    import os
245
241
    os.mkdir(dest)
246
242
    mutter('export version %r' % tree)
247
243
    inv = tree.inventory
253
249
        elif kind == 'file':
254
250
            pumpfile(tree.get_file(ie.file_id), file(fullpath, 'wb'))
255
251
        else:
256
 
            bailout("don't know how to export {%s} of kind %r" % (ie.file_id, kind))
 
252
            raise BzrError("don't know how to export {%s} of kind %r" % (ie.file_id, kind))
257
253
        mutter("  export {%s} kind %s to %s" % (ie.file_id, kind, fullpath))
258
254
exporters['dir'] = dir_exporter
259
255
 
262
258
except ImportError:
263
259
    pass
264
260
else:
265
 
    def tar_exporter(tree, dest, compression=None):
 
261
    def get_root_name(dest):
 
262
        """Get just the root name for a tarball.
 
263
 
 
264
        >>> get_root_name('mytar.tar')
 
265
        'mytar'
 
266
        >>> get_root_name('mytar.tar.bz2')
 
267
        'mytar'
 
268
        >>> get_root_name('tar.tar.tar.tgz')
 
269
        'tar.tar.tar'
 
270
        >>> get_root_name('bzr-0.0.5.tar.gz')
 
271
        'bzr-0.0.5'
 
272
        >>> get_root_name('a/long/path/mytar.tgz')
 
273
        'mytar'
 
274
        >>> get_root_name('../parent/../dir/other.tbz2')
 
275
        'other'
 
276
        """
 
277
        endings = ['.tar', '.tar.gz', '.tgz', '.tar.bz2', '.tbz2']
 
278
        dest = os.path.basename(dest)
 
279
        for end in endings:
 
280
            if dest.endswith(end):
 
281
                return dest[:-len(end)]
 
282
 
 
283
    def tar_exporter(tree, dest, root, compression=None):
266
284
        """Export this tree to a new tar file.
267
285
 
268
286
        `dest` will be created holding the contents of this tree; if it
269
287
        already exists, it will be clobbered, like with "tar -c".
270
288
        """
271
 
        now = time.time()
 
289
        from time import time
 
290
        now = time()
272
291
        compression = str(compression or '')
 
292
        if root is None:
 
293
            root = get_root_name(dest)
273
294
        try:
274
295
            ball = tarfile.open(dest, 'w:' + compression)
275
296
        except tarfile.CompressionError, e:
276
 
            bailout(str(e))
 
297
            raise BzrError(str(e))
277
298
        mutter('export version %r' % tree)
278
299
        inv = tree.inventory
279
300
        for dp, ie in inv.iter_entries():
280
301
            mutter("  export {%s} kind %s to %s" % (ie.file_id, ie.kind, dest))
281
 
            item = tarfile.TarInfo(dp)
 
302
            item = tarfile.TarInfo(os.path.join(root, dp))
282
303
            # TODO: would be cool to actually set it to the timestamp of the
283
304
            # revision it was last changed
284
305
            item.mtime = now
294
315
                item.size = _find_file_size(fileobj)
295
316
                item.mode = 0644
296
317
            else:
297
 
                bailout("don't know how to export {%s} of kind %r" %
 
318
                raise BzrError("don't know how to export {%s} of kind %r" %
298
319
                        (ie.file_id, ie.kind))
299
320
 
300
321
            ball.addfile(item, fileobj)
301
322
        ball.close()
302
323
    exporters['tar'] = tar_exporter
303
324
 
304
 
    def tgz_exporter(tree, dest):
305
 
        tar_exporter(tree, dest, compression='gz')
 
325
    def tgz_exporter(tree, dest, root):
 
326
        tar_exporter(tree, dest, root, compression='gz')
306
327
    exporters['tgz'] = tgz_exporter
307
328
 
308
 
    def tbz_exporter(tree, dest):
309
 
        tar_exporter(tree, dest, compression='bz2')
 
329
    def tbz_exporter(tree, dest, root):
 
330
        tar_exporter(tree, dest, root, compression='bz2')
310
331
    exporters['tbz2'] = tbz_exporter
311
332
 
312
333