~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/export/tar_exporter.py

Merge with walkdirs

Show diffs side-by-side

added added

removed removed

Lines of Context:
18
18
"""
19
19
 
20
20
import os
 
21
import sys
21
22
import tarfile
22
23
import time
23
 
import sys
24
24
 
25
 
from bzrlib import errors, export
 
25
from bzrlib import errors, export, osutils
 
26
from bzrlib.export import _export_iter_entries
26
27
from bzrlib.trace import mutter
27
28
 
28
29
 
29
 
def tar_exporter(tree, dest, root, compression=None):
 
30
def tar_exporter(tree, dest, root, subdir, compression=None):
30
31
    """Export this tree to a new tar file.
31
32
 
32
33
    `dest` will be created holding the contents of this tree; if it
33
34
    already exists, it will be clobbered, like with "tar -c".
34
35
    """
 
36
    mutter('export version %r', tree)
35
37
    now = time.time()
36
38
    compression = str(compression or '')
37
39
    if dest == '-':
42
44
        if root is None:
43
45
            root = export.get_root_name(dest)
44
46
        ball = tarfile.open(dest, 'w:' + compression)
45
 
    mutter('export version %r', tree)
46
 
    inv = tree.inventory
47
 
    entries = inv.iter_entries()
48
 
    entries.next() # skip root
49
 
    for dp, ie in entries:
50
 
        # .bzrignore has no meaning outside of a working tree
51
 
        # so do not export it
52
 
        if dp == ".bzrignore":
53
 
            continue
54
 
        item, fileobj = ie.get_tar_item(root, dp, now, tree)
 
47
    for dp, ie in _export_iter_entries(tree, subdir):
 
48
        filename = osutils.pathjoin(root, dp).encode('utf8')
 
49
        item = tarfile.TarInfo(filename)
 
50
        item.mtime = now
 
51
        if ie.kind == "file":
 
52
            item.type = tarfile.REGTYPE
 
53
            if tree.is_executable(ie.file_id):
 
54
                item.mode = 0755
 
55
            else:
 
56
                item.mode = 0644
 
57
            item.size = ie.text_size
 
58
            fileobj = tree.get_file(ie.file_id)
 
59
        elif ie.kind == "directory":
 
60
            item.type = tarfile.DIRTYPE
 
61
            item.name += '/'
 
62
            item.size = 0
 
63
            item.mode = 0755
 
64
            fileobj = None
 
65
        elif ie.kind == "symlink":
 
66
            item.type = tarfile.SYMTYPE
 
67
            item.size = 0
 
68
            item.mode = 0755
 
69
            item.linkname = ie.symlink_target
 
70
            fileobj = None
 
71
        else:
 
72
            raise BzrError("don't know how to export {%s} of kind %r" %
 
73
                           (ie.file_id, ie.kind))
55
74
        ball.addfile(item, fileobj)
56
75
    ball.close()
57
76
 
58
77
 
59
 
def tgz_exporter(tree, dest, root):
60
 
    tar_exporter(tree, dest, root, compression='gz')
61
 
 
62
 
 
63
 
def tbz_exporter(tree, dest, root):
64
 
    tar_exporter(tree, dest, root, compression='bz2')
65
 
 
 
78
def tgz_exporter(tree, dest, root, subdir):
 
79
    tar_exporter(tree, dest, root, subdir, compression='gz')
 
80
 
 
81
 
 
82
def tbz_exporter(tree, dest, root, subdir):
 
83
    tar_exporter(tree, dest, root, subdir, compression='bz2')