~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tree.py

  • Committer: Robert Collins
  • Date: 2005-10-03 05:54:35 UTC
  • mto: (1393.1.30)
  • mto: This revision was merged to the branch mainline in revision 1400.
  • Revision ID: robertc@robertcollins.net-20051003055434-c8ebd30d1de10247
move exporting functionality into inventory.py - uncovers bug in symlink 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 = {}
275
275
    mutter('export version %r' % tree)
276
276
    inv = tree.inventory
277
277
    for dp, ie in inv.iter_entries():
278
 
        kind = ie.kind
279
 
        fullpath = appendpath(dest, dp)
280
 
        if kind == 'directory':
281
 
            os.mkdir(fullpath)
282
 
        elif kind == 'file':
283
 
            pumpfile(tree.get_file(ie.file_id), file(fullpath, 'wb'))
284
 
            if tree.is_executable(ie.file_id):
285
 
                os.chmod(fullpath, 0755)
286
 
        elif kind == 'symlink':
287
 
            try:
288
 
                os.symlink(ie.symlink_target, fullpath)
289
 
            except OSError,e:
290
 
                raise BzrError("Failed to create symlink %r -> %r, error: %s" % (fullpath, ie.symlink_target, e))
291
 
        else:
292
 
            raise BzrError("don't know how to export {%s} of kind %r" % (ie.file_id, kind))
293
 
        mutter("  export {%s} kind %s to %s" % (ie.file_id, kind, fullpath))
 
278
        ie.put_on_disk(dest, dp, tree)
 
279
 
294
280
exporters['dir'] = dir_exporter
295
281
 
296
282
try:
339
325
        inv = tree.inventory
340
326
        for dp, ie in inv.iter_entries():
341
327
            mutter("  export {%s} kind %s to %s" % (ie.file_id, ie.kind, dest))
342
 
            item = tarfile.TarInfo(os.path.join(root, dp))
343
 
            # TODO: would be cool to actually set it to the timestamp of the
344
 
            # revision it was last changed
345
 
            item.mtime = now
346
 
            if ie.kind == 'directory':
347
 
                item.type = tarfile.DIRTYPE
348
 
                fileobj = None
349
 
                item.name += '/'
350
 
                item.size = 0
351
 
                item.mode = 0755
352
 
            elif ie.kind == 'file':
353
 
                item.type = tarfile.REGTYPE
354
 
                fileobj = tree.get_file(ie.file_id)
355
 
                item.size = _find_file_size(fileobj)
356
 
                if tree.is_executable(ie.file_id):
357
 
                    item.mode = 0755
358
 
                else:
359
 
                    item.mode = 0644
360
 
            else:
361
 
                raise BzrError("don't know how to export {%s} of kind %r" %
362
 
                        (ie.file_id, ie.kind))
363
 
 
 
328
            item, fileobj = ie.get_tar_item(root, dp, now, tree)
364
329
            ball.addfile(item, fileobj)
365
330
        ball.close()
 
331
 
366
332
    exporters['tar'] = tar_exporter
367
333
 
368
334
    def tgz_exporter(tree, dest, root):
372
338
    def tbz_exporter(tree, dest, root):
373
339
        tar_exporter(tree, dest, root, compression='bz2')
374
340
    exporters['tbz2'] = tbz_exporter
375
 
 
376
 
 
377
 
def _find_file_size(fileobj):
378
 
    offset = fileobj.tell()
379
 
    try:
380
 
        fileobj.seek(0, 2)
381
 
        size = fileobj.tell()
382
 
    except TypeError:
383
 
        # gzip doesn't accept second argument to seek()
384
 
        fileobj.seek(0)
385
 
        size = 0
386
 
        while True:
387
 
            nread = len(fileobj.read())
388
 
            if nread == 0:
389
 
                break
390
 
            size += nread
391
 
    fileobj.seek(offset)
392
 
    return size