~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tree.py

  • Committer: Martin Pool
  • Date: 2005-07-05 08:20:41 UTC
  • Revision ID: mbp@sourcefrog.net-20050705082041-6538a9ec26f7a59d
- Actually merge unsynchronized regions.  Woot!

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
 
20
from osutils import pumpfile, appendpath, fingerprint_file
21
21
 
22
 
import bzrlib
23
22
from bzrlib.trace import mutter, note
24
23
from bzrlib.errors import BzrError
25
 
from bzrlib.inventory import Inventory
26
 
from bzrlib.osutils import pumpfile, appendpath, fingerprint_file
27
24
 
 
25
import bzrlib
28
26
 
29
27
exporters = {}
30
28
 
67
65
 
68
66
    def _get_inventory(self):
69
67
        return self._inventory
70
 
    
71
 
    def get_file_by_path(self, path):
72
 
        return self.get_file(self._inventory.path2id(path))
73
68
 
74
69
    inventory = property(_get_inventory,
75
70
                         doc="Inventory of this Tree")
98
93
        pumpfile(self.get_file(fileid), sys.stdout)
99
94
        
100
95
        
101
 
    def export(self, dest, format='dir', root=None):
 
96
    def export(self, dest, format='dir'):
102
97
        """Export this tree."""
103
98
        try:
104
99
            exporter = exporters[format]
105
100
        except KeyError:
106
 
            from bzrlib.errors import BzrCommandError
107
101
            raise BzrCommandError("export format %r not supported" % format)
108
 
        exporter(self, dest, root)
 
102
        exporter(self, dest)
109
103
 
110
104
 
111
105
 
135
129
 
136
130
    def get_file_sha1(self, file_id):
137
131
        ie = self._inventory[file_id]
138
 
        if ie.kind == "file":
139
 
            return ie.text_sha1
 
132
        return ie.text_sha1
140
133
 
141
134
    def has_filename(self, filename):
142
135
        return bool(self.inventory.path2id(filename))
149
142
 
150
143
class EmptyTree(Tree):
151
144
    def __init__(self):
 
145
        from bzrlib.inventory import Inventory
152
146
        self._inventory = Inventory()
153
147
 
154
148
    def has_filename(self, filename):
158
152
        if False:  # just to make it a generator
159
153
            yield None
160
154
    
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
155
 
170
156
 
171
157
######################################################################
237
223
######################################################################
238
224
# export
239
225
 
240
 
def dir_exporter(tree, dest, root):
 
226
def dir_exporter(tree, dest):
241
227
    """Export this tree to a new directory.
242
228
 
243
229
    `dest` should not exist, and will be created holding the
270
256
except ImportError:
271
257
    pass
272
258
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):
 
259
    def tar_exporter(tree, dest, compression=None):
296
260
        """Export this tree to a new tar file.
297
261
 
298
262
        `dest` will be created holding the contents of this tree; if it
301
265
        from time import time
302
266
        now = time()
303
267
        compression = str(compression or '')
304
 
        if root is None:
305
 
            root = get_root_name(dest)
306
268
        try:
307
269
            ball = tarfile.open(dest, 'w:' + compression)
308
270
        except tarfile.CompressionError, e:
311
273
        inv = tree.inventory
312
274
        for dp, ie in inv.iter_entries():
313
275
            mutter("  export {%s} kind %s to %s" % (ie.file_id, ie.kind, dest))
314
 
            item = tarfile.TarInfo(os.path.join(root, dp))
 
276
            item = tarfile.TarInfo(dp)
315
277
            # TODO: would be cool to actually set it to the timestamp of the
316
278
            # revision it was last changed
317
279
            item.mtime = now
334
296
        ball.close()
335
297
    exporters['tar'] = tar_exporter
336
298
 
337
 
    def tgz_exporter(tree, dest, root):
338
 
        tar_exporter(tree, dest, root, compression='gz')
 
299
    def tgz_exporter(tree, dest):
 
300
        tar_exporter(tree, dest, compression='gz')
339
301
    exporters['tgz'] = tgz_exporter
340
302
 
341
 
    def tbz_exporter(tree, dest, root):
342
 
        tar_exporter(tree, dest, root, compression='bz2')
 
303
    def tbz_exporter(tree, dest):
 
304
        tar_exporter(tree, dest, compression='bz2')
343
305
    exporters['tbz2'] = tbz_exporter
344
306
 
345
307