~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tree.py

  • Committer: Martin Pool
  • Date: 2005-06-22 07:57:56 UTC
  • Revision ID: mbp@sourcefrog.net-20050622075756-f4f98a7f2addddf5
- stubbed-out tests for python plugins

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
 
import os
21
 
 
22
 
import bzrlib
 
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 bzrlib.inventory import Inventory
23
29
from bzrlib.trace import mutter, note
24
30
from bzrlib.errors import BzrError
25
 
from bzrlib.inventory import Inventory
26
 
from bzrlib.osutils import pumpfile, appendpath, fingerprint_file
 
31
import branch
27
32
 
 
33
import bzrlib
28
34
 
29
35
exporters = {}
30
36
 
67
73
 
68
74
    def _get_inventory(self):
69
75
        return self._inventory
70
 
    
71
 
    def get_file_by_path(self, path):
72
 
        return self.get_file(self._inventory.path2id(path))
73
76
 
74
77
    inventory = property(_get_inventory,
75
78
                         doc="Inventory of this Tree")
98
101
        pumpfile(self.get_file(fileid), sys.stdout)
99
102
        
100
103
        
101
 
    def export(self, dest, format='dir', root=None):
 
104
    def export(self, dest, format='dir'):
102
105
        """Export this tree."""
103
106
        try:
104
107
            exporter = exporters[format]
105
108
        except KeyError:
106
 
            from bzrlib.errors import BzrCommandError
107
109
            raise BzrCommandError("export format %r not supported" % format)
108
 
        exporter(self, dest, root)
 
110
        exporter(self, dest)
109
111
 
110
112
 
111
113
 
135
137
 
136
138
    def get_file_sha1(self, file_id):
137
139
        ie = self._inventory[file_id]
138
 
        if ie.kind == "file":
139
 
            return ie.text_sha1
 
140
        return ie.text_sha1
140
141
 
141
142
    def has_filename(self, filename):
142
143
        return bool(self.inventory.path2id(filename))
158
159
        if False:  # just to make it a generator
159
160
            yield None
160
161
    
161
 
    def __contains__(self, file_id):
162
 
        return file_id in self._inventory
163
 
 
164
 
    def get_file_sha1(self, file_id):
165
 
        assert self._inventory[file_id].kind == "root_directory"
166
 
        return None
167
 
 
168
 
 
169
162
 
170
163
 
171
164
######################################################################
237
230
######################################################################
238
231
# export
239
232
 
240
 
def dir_exporter(tree, dest, root):
 
233
def dir_exporter(tree, dest):
241
234
    """Export this tree to a new directory.
242
235
 
243
236
    `dest` should not exist, and will be created holding the
249
242
    :note: If the export fails, the destination directory will be
250
243
           left in a half-assed state.
251
244
    """
252
 
    import os
253
245
    os.mkdir(dest)
254
246
    mutter('export version %r' % tree)
255
247
    inv = tree.inventory
270
262
except ImportError:
271
263
    pass
272
264
else:
273
 
    def get_root_name(dest):
274
 
        """Get just the root name for a tarball.
275
 
 
276
 
        >>> get_root_name('mytar.tar')
277
 
        'mytar'
278
 
        >>> get_root_name('mytar.tar.bz2')
279
 
        'mytar'
280
 
        >>> get_root_name('tar.tar.tar.tgz')
281
 
        'tar.tar.tar'
282
 
        >>> get_root_name('bzr-0.0.5.tar.gz')
283
 
        'bzr-0.0.5'
284
 
        >>> get_root_name('a/long/path/mytar.tgz')
285
 
        'mytar'
286
 
        >>> get_root_name('../parent/../dir/other.tbz2')
287
 
        'other'
288
 
        """
289
 
        endings = ['.tar', '.tar.gz', '.tgz', '.tar.bz2', '.tbz2']
290
 
        dest = os.path.basename(dest)
291
 
        for end in endings:
292
 
            if dest.endswith(end):
293
 
                return dest[:-len(end)]
294
 
 
295
 
    def tar_exporter(tree, dest, root, compression=None):
 
265
    def tar_exporter(tree, dest, compression=None):
296
266
        """Export this tree to a new tar file.
297
267
 
298
268
        `dest` will be created holding the contents of this tree; if it
299
269
        already exists, it will be clobbered, like with "tar -c".
300
270
        """
301
 
        from time import time
302
 
        now = time()
 
271
        now = time.time()
303
272
        compression = str(compression or '')
304
 
        if root is None:
305
 
            root = get_root_name(dest)
306
273
        try:
307
274
            ball = tarfile.open(dest, 'w:' + compression)
308
275
        except tarfile.CompressionError, e:
311
278
        inv = tree.inventory
312
279
        for dp, ie in inv.iter_entries():
313
280
            mutter("  export {%s} kind %s to %s" % (ie.file_id, ie.kind, dest))
314
 
            item = tarfile.TarInfo(os.path.join(root, dp))
 
281
            item = tarfile.TarInfo(dp)
315
282
            # TODO: would be cool to actually set it to the timestamp of the
316
283
            # revision it was last changed
317
284
            item.mtime = now
334
301
        ball.close()
335
302
    exporters['tar'] = tar_exporter
336
303
 
337
 
    def tgz_exporter(tree, dest, root):
338
 
        tar_exporter(tree, dest, root, compression='gz')
 
304
    def tgz_exporter(tree, dest):
 
305
        tar_exporter(tree, dest, compression='gz')
339
306
    exporters['tgz'] = tgz_exporter
340
307
 
341
 
    def tbz_exporter(tree, dest, root):
342
 
        tar_exporter(tree, dest, root, compression='bz2')
 
308
    def tbz_exporter(tree, dest):
 
309
        tar_exporter(tree, dest, compression='bz2')
343
310
    exporters['tbz2'] = tbz_exporter
344
311
 
345
312