~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tree.py

  • Committer: Robert Collins
  • Date: 2005-10-08 00:32:39 UTC
  • mfrom: (1185.13.4)
  • mto: This revision was merged to the branch mainline in revision 1422.
  • Revision ID: robertc@robertcollins.net-20051008003239-b4e2f1ad62bbe3f6
merge in reweave support

Show diffs side-by-side

added added

removed removed

Lines of Context:
24
24
from bzrlib.trace import mutter, note
25
25
from bzrlib.errors import BzrError, BzrCheckError
26
26
from bzrlib.inventory import Inventory
27
 
from bzrlib.osutils import pumpfile, appendpath, fingerprint_file
 
27
from bzrlib.osutils import appendpath, fingerprint_file
28
28
 
29
29
 
30
30
exporters = {}
76
76
                         doc="Inventory of this Tree")
77
77
 
78
78
    def _check_retrieved(self, ie, f):
 
79
        if not __debug__:
 
80
            return  
79
81
        fp = fingerprint_file(f)
80
82
        f.seek(0)
81
83
        
126
128
        self._revision_id = revision_id
127
129
 
128
130
    def get_weave(self, file_id):
129
 
        return self._weave_store.get_weave(file_id)
 
131
        # FIXME: RevisionTree should be given a branch
 
132
        # not a store, or the store should know the branch.
 
133
        import bzrlib.transactions as transactions
 
134
        return self._weave_store.get_weave(file_id,
 
135
            transactions.PassThroughTransaction())
 
136
 
 
137
 
 
138
    def get_file_lines(self, file_id):
 
139
        ie = self._inventory[file_id]
 
140
        weave = self.get_weave(file_id)
 
141
        return weave.get(ie.revision)
130
142
        
131
143
 
132
144
    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
 
145
        return ''.join(self.get_file_lines(file_id))
 
146
 
143
147
 
144
148
    def get_file(self, file_id):
145
149
        return StringIO(self.get_file_text(file_id))
152
156
        if ie.kind == "file":
153
157
            return ie.text_sha1
154
158
 
 
159
    def is_executable(self, file_id):
 
160
        return self._inventory[file_id].executable
 
161
 
155
162
    def has_filename(self, filename):
156
163
        return bool(self.inventory.path2id(filename))
157
164
 
158
165
    def list_files(self):
159
166
        # The only files returned by this are those from the version
160
167
        for path, entry in self.inventory.iter_entries():
161
 
            yield path, 'V', entry.kind, entry.file_id
 
168
            yield path, 'V', entry.kind, entry.file_id, entry
 
169
 
 
170
    def get_symlink_target(self, file_id):
 
171
        ie = self._inventory[file_id]
 
172
        return ie.symlink_target;
162
173
 
163
174
 
164
175
class EmptyTree(Tree):
165
176
    def __init__(self):
166
177
        self._inventory = Inventory()
167
178
 
 
179
    def get_symlink_target(self, file_id):
 
180
        return None
 
181
 
168
182
    def has_filename(self, filename):
169
183
        return False
170
184
 
171
185
    def list_files(self):
172
 
        if False:  # just to make it a generator
173
 
            yield None
 
186
        return iter([])
174
187
    
175
188
    def __contains__(self, file_id):
176
189
        return file_id in self._inventory
180
193
        return None
181
194
 
182
195
 
183
 
 
184
 
 
185
196
######################################################################
186
197
# diff
187
198
 
268
279
    mutter('export version %r' % tree)
269
280
    inv = tree.inventory
270
281
    for dp, ie in inv.iter_entries():
271
 
        kind = ie.kind
272
 
        fullpath = appendpath(dest, dp)
273
 
        if kind == 'directory':
274
 
            os.mkdir(fullpath)
275
 
        elif kind == 'file':
276
 
            pumpfile(tree.get_file(ie.file_id), file(fullpath, 'wb'))
277
 
        else:
278
 
            raise BzrError("don't know how to export {%s} of kind %r" % (ie.file_id, kind))
279
 
        mutter("  export {%s} kind %s to %s" % (ie.file_id, kind, fullpath))
 
282
        ie.put_on_disk(dest, dp, tree)
 
283
 
280
284
exporters['dir'] = dir_exporter
281
285
 
282
286
try:
325
329
        inv = tree.inventory
326
330
        for dp, ie in inv.iter_entries():
327
331
            mutter("  export {%s} kind %s to %s" % (ie.file_id, ie.kind, dest))
328
 
            item = tarfile.TarInfo(os.path.join(root, dp))
329
 
            # TODO: would be cool to actually set it to the timestamp of the
330
 
            # revision it was last changed
331
 
            item.mtime = now
332
 
            if ie.kind == 'directory':
333
 
                item.type = tarfile.DIRTYPE
334
 
                fileobj = None
335
 
                item.name += '/'
336
 
                item.size = 0
337
 
                item.mode = 0755
338
 
            elif ie.kind == 'file':
339
 
                item.type = tarfile.REGTYPE
340
 
                fileobj = tree.get_file(ie.file_id)
341
 
                item.size = _find_file_size(fileobj)
342
 
                item.mode = 0644
343
 
            else:
344
 
                raise BzrError("don't know how to export {%s} of kind %r" %
345
 
                        (ie.file_id, ie.kind))
346
 
 
 
332
            item, fileobj = ie.get_tar_item(root, dp, now, tree)
347
333
            ball.addfile(item, fileobj)
348
334
        ball.close()
 
335
 
349
336
    exporters['tar'] = tar_exporter
350
337
 
351
338
    def tgz_exporter(tree, dest, root):
355
342
    def tbz_exporter(tree, dest, root):
356
343
        tar_exporter(tree, dest, root, compression='bz2')
357
344
    exporters['tbz2'] = tbz_exporter
358
 
 
359
 
 
360
 
def _find_file_size(fileobj):
361
 
    offset = fileobj.tell()
362
 
    try:
363
 
        fileobj.seek(0, 2)
364
 
        size = fileobj.tell()
365
 
    except TypeError:
366
 
        # gzip doesn't accept second argument to seek()
367
 
        fileobj.seek(0)
368
 
        size = 0
369
 
        while True:
370
 
            nread = len(fileobj.read())
371
 
            if nread == 0:
372
 
                break
373
 
            size += nread
374
 
    fileobj.seek(offset)
375
 
    return size