~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tree.py

  • Committer: Martin Pool
  • Date: 2005-07-06 10:07:31 UTC
  • Revision ID: mbp@sourcefrog.net-20050706100731-ce25f8bf569ad1ae
- start adding refactored/simplified hash cache
  not used yet

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
 
from cStringIO import StringIO
 
20
from osutils import pumpfile, appendpath, fingerprint_file
 
21
 
 
22
from bzrlib.trace import mutter, note
 
23
from bzrlib.errors import BzrError
22
24
 
23
25
import bzrlib
24
 
from bzrlib.trace import mutter, note
25
 
from bzrlib.errors import BzrError, BzrCheckError
26
 
from bzrlib.inventory import Inventory
27
 
from bzrlib.osutils import pumpfile, appendpath, fingerprint_file
28
 
 
29
26
 
30
27
exporters = {}
31
28
 
68
65
 
69
66
    def _get_inventory(self):
70
67
        return self._inventory
71
 
    
72
 
    def get_file_by_path(self, path):
73
 
        return self.get_file(self._inventory.path2id(path))
74
68
 
75
69
    inventory = property(_get_inventory,
76
70
                         doc="Inventory of this Tree")
93
87
                     "store is probably damaged/corrupt"])
94
88
 
95
89
 
96
 
    def print_file(self, file_id):
97
 
        """Print file with id `file_id` to stdout."""
 
90
    def print_file(self, fileid):
 
91
        """Print file with id `fileid` to stdout."""
98
92
        import sys
99
 
        sys.stdout.write(self.get_file_text(file_id))
100
 
        
101
 
        
102
 
    def export(self, dest, format='dir', root=None):
 
93
        pumpfile(self.get_file(fileid), sys.stdout)
 
94
        
 
95
        
 
96
    def export(self, dest, format='dir'):
103
97
        """Export this tree."""
104
98
        try:
105
99
            exporter = exporters[format]
106
100
        except KeyError:
107
 
            from bzrlib.errors import BzrCommandError
108
101
            raise BzrCommandError("export format %r not supported" % format)
109
 
        exporter(self, dest, root)
 
102
        exporter(self, dest)
110
103
 
111
104
 
112
105
 
120
113
           or at least passing a description to the constructor.
121
114
    """
122
115
    
123
 
    def __init__(self, weave_store, inv, revision_id):
124
 
        self._weave_store = weave_store
 
116
    def __init__(self, store, inv):
 
117
        self._store = store
125
118
        self._inventory = inv
126
 
        self._revision_id = revision_id
127
 
 
128
 
    def get_weave(self, file_id):
129
 
        return self._weave_store.get_weave(file_id)
130
 
        
131
 
 
132
 
    def get_file_text(self, file_id):
133
 
        ie = self._inventory[file_id]
134
 
        weave = self.get_weave(file_id)
135
 
        idx = weave.lookup(ie.text_version)
136
 
        content = weave.get_text(idx)
137
 
        if len(content) != ie.text_size:
138
 
            raise BzrCheckError('mismatched size on revision %s of file %s: '
139
 
                                '%d vs %d bytes'
140
 
                                % (self._revision_id, file_id, len(content),
141
 
                                   ie.text_size))
142
 
        return content
143
119
 
144
120
    def get_file(self, file_id):
145
 
        return StringIO(self.get_file_text(file_id))
 
121
        ie = self._inventory[file_id]
 
122
        f = self._store[ie.text_id]
 
123
        mutter("  get fileid{%s} from %r" % (file_id, self))
 
124
        self._check_retrieved(ie, f)
 
125
        return f
146
126
 
147
127
    def get_file_size(self, file_id):
148
128
        return self._inventory[file_id].text_size
149
129
 
150
130
    def get_file_sha1(self, file_id):
151
131
        ie = self._inventory[file_id]
152
 
        if ie.kind == "file":
153
 
            return ie.text_sha1
 
132
        return ie.text_sha1
154
133
 
155
134
    def has_filename(self, filename):
156
135
        return bool(self.inventory.path2id(filename))
163
142
 
164
143
class EmptyTree(Tree):
165
144
    def __init__(self):
 
145
        from bzrlib.inventory import Inventory
166
146
        self._inventory = Inventory()
167
147
 
168
148
    def has_filename(self, filename):
172
152
        if False:  # just to make it a generator
173
153
            yield None
174
154
    
175
 
    def __contains__(self, file_id):
176
 
        return file_id in self._inventory
177
 
 
178
 
    def get_file_sha1(self, file_id):
179
 
        assert self._inventory[file_id].kind == "root_directory"
180
 
        return None
181
 
 
182
 
 
183
155
 
184
156
 
185
157
######################################################################
251
223
######################################################################
252
224
# export
253
225
 
254
 
def dir_exporter(tree, dest, root):
 
226
def dir_exporter(tree, dest):
255
227
    """Export this tree to a new directory.
256
228
 
257
229
    `dest` should not exist, and will be created holding the
284
256
except ImportError:
285
257
    pass
286
258
else:
287
 
    def get_root_name(dest):
288
 
        """Get just the root name for a tarball.
289
 
 
290
 
        >>> get_root_name('mytar.tar')
291
 
        'mytar'
292
 
        >>> get_root_name('mytar.tar.bz2')
293
 
        'mytar'
294
 
        >>> get_root_name('tar.tar.tar.tgz')
295
 
        'tar.tar.tar'
296
 
        >>> get_root_name('bzr-0.0.5.tar.gz')
297
 
        'bzr-0.0.5'
298
 
        >>> get_root_name('a/long/path/mytar.tgz')
299
 
        'mytar'
300
 
        >>> get_root_name('../parent/../dir/other.tbz2')
301
 
        'other'
302
 
        """
303
 
        endings = ['.tar', '.tar.gz', '.tgz', '.tar.bz2', '.tbz2']
304
 
        dest = os.path.basename(dest)
305
 
        for end in endings:
306
 
            if dest.endswith(end):
307
 
                return dest[:-len(end)]
308
 
 
309
 
    def tar_exporter(tree, dest, root, compression=None):
 
259
    def tar_exporter(tree, dest, compression=None):
310
260
        """Export this tree to a new tar file.
311
261
 
312
262
        `dest` will be created holding the contents of this tree; if it
315
265
        from time import time
316
266
        now = time()
317
267
        compression = str(compression or '')
318
 
        if root is None:
319
 
            root = get_root_name(dest)
320
268
        try:
321
269
            ball = tarfile.open(dest, 'w:' + compression)
322
270
        except tarfile.CompressionError, e:
325
273
        inv = tree.inventory
326
274
        for dp, ie in inv.iter_entries():
327
275
            mutter("  export {%s} kind %s to %s" % (ie.file_id, ie.kind, dest))
328
 
            item = tarfile.TarInfo(os.path.join(root, dp))
 
276
            item = tarfile.TarInfo(dp)
329
277
            # TODO: would be cool to actually set it to the timestamp of the
330
278
            # revision it was last changed
331
279
            item.mtime = now
348
296
        ball.close()
349
297
    exporters['tar'] = tar_exporter
350
298
 
351
 
    def tgz_exporter(tree, dest, root):
352
 
        tar_exporter(tree, dest, root, compression='gz')
 
299
    def tgz_exporter(tree, dest):
 
300
        tar_exporter(tree, dest, compression='gz')
353
301
    exporters['tgz'] = tgz_exporter
354
302
 
355
 
    def tbz_exporter(tree, dest, root):
356
 
        tar_exporter(tree, dest, root, compression='bz2')
 
303
    def tbz_exporter(tree, dest):
 
304
        tar_exporter(tree, dest, compression='bz2')
357
305
    exporters['tbz2'] = tbz_exporter
358
306
 
359
307