~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tree.py

  • Committer: Martin Pool
  • Date: 2005-10-04 02:54:54 UTC
  • mfrom: (1399.1.12)
  • mto: (1185.13.3)
  • mto: This revision was merged to the branch mainline in revision 1400.
  • Revision ID: mbp@sourcefrog.net-20051004025454-a8da093aebf1fb24
[merge] refactoring from robert to use different Entry classes
for files, directories, etc.

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 = {}
161
161
    def list_files(self):
162
162
        # The only files returned by this are those from the version
163
163
        for path, entry in self.inventory.iter_entries():
164
 
            yield path, 'V', entry.kind, entry.file_id
 
164
            yield path, 'V', entry.kind, entry.file_id, entry
165
165
 
166
166
    def get_symlink_target(self, file_id):
167
167
        ie = self._inventory[file_id]
168
168
        return ie.symlink_target;
169
169
 
 
170
 
170
171
class EmptyTree(Tree):
171
172
    def __init__(self):
172
173
        self._inventory = Inventory()
178
179
        return False
179
180
 
180
181
    def list_files(self):
181
 
        if False:  # just to make it a generator
182
 
            yield None
 
182
        return iter([])
183
183
    
184
184
    def __contains__(self, file_id):
185
185
        return file_id in self._inventory
189
189
        return None
190
190
 
191
191
 
192
 
 
193
 
 
194
192
######################################################################
195
193
# diff
196
194
 
277
275
    mutter('export version %r' % tree)
278
276
    inv = tree.inventory
279
277
    for dp, ie in inv.iter_entries():
280
 
        kind = ie.kind
281
 
        fullpath = appendpath(dest, dp)
282
 
        if kind == 'directory':
283
 
            os.mkdir(fullpath)
284
 
        elif kind == 'file':
285
 
            pumpfile(tree.get_file(ie.file_id), file(fullpath, 'wb'))
286
 
            if tree.is_executable(ie.file_id):
287
 
                os.chmod(fullpath, 0755)
288
 
        elif kind == 'symlink':
289
 
            try:
290
 
                os.symlink(ie.symlink_target, fullpath)
291
 
            except OSError,e:
292
 
                raise BzrError("Failed to create symlink %r -> %r, error: %s" % (fullpath, ie.symlink_target, e))
293
 
        else:
294
 
            raise BzrError("don't know how to export {%s} of kind %r" % (ie.file_id, kind))
295
 
        mutter("  export {%s} kind %s to %s" % (ie.file_id, kind, fullpath))
 
278
        ie.put_on_disk(dest, dp, tree)
 
279
 
296
280
exporters['dir'] = dir_exporter
297
281
 
298
282
try:
341
325
        inv = tree.inventory
342
326
        for dp, ie in inv.iter_entries():
343
327
            mutter("  export {%s} kind %s to %s" % (ie.file_id, ie.kind, dest))
344
 
            item = tarfile.TarInfo(os.path.join(root, dp))
345
 
            # TODO: would be cool to actually set it to the timestamp of the
346
 
            # revision it was last changed
347
 
            item.mtime = now
348
 
            if ie.kind == 'directory':
349
 
                item.type = tarfile.DIRTYPE
350
 
                fileobj = None
351
 
                item.name += '/'
352
 
                item.size = 0
353
 
                item.mode = 0755
354
 
            elif ie.kind == 'file':
355
 
                item.type = tarfile.REGTYPE
356
 
                fileobj = tree.get_file(ie.file_id)
357
 
                item.size = _find_file_size(fileobj)
358
 
                if tree.is_executable(ie.file_id):
359
 
                    item.mode = 0755
360
 
                else:
361
 
                    item.mode = 0644
362
 
            else:
363
 
                raise BzrError("don't know how to export {%s} of kind %r" %
364
 
                        (ie.file_id, ie.kind))
365
 
 
 
328
            item, fileobj = ie.get_tar_item(root, dp, now, tree)
366
329
            ball.addfile(item, fileobj)
367
330
        ball.close()
 
331
 
368
332
    exporters['tar'] = tar_exporter
369
333
 
370
334
    def tgz_exporter(tree, dest, root):
374
338
    def tbz_exporter(tree, dest, root):
375
339
        tar_exporter(tree, dest, root, compression='bz2')
376
340
    exporters['tbz2'] = tbz_exporter
377
 
 
378
 
 
379
 
def _find_file_size(fileobj):
380
 
    offset = fileobj.tell()
381
 
    try:
382
 
        fileobj.seek(0, 2)
383
 
        size = fileobj.tell()
384
 
    except TypeError:
385
 
        # gzip doesn't accept second argument to seek()
386
 
        fileobj.seek(0)
387
 
        size = 0
388
 
        while True:
389
 
            nread = len(fileobj.read())
390
 
            if nread == 0:
391
 
                break
392
 
            size += nread
393
 
    fileobj.seek(offset)
394
 
    return size