~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tree.py

  • Committer: Martin Pool
  • Date: 2005-06-15 04:24:01 UTC
  • Revision ID: mbp@sourcefrog.net-20050615042401-02a29d106bece661
add-bzr-to-baz allows multiple arguments

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