/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to breezy/archive/tar.py

  • Committer: Jelmer Vernooij
  • Date: 2018-06-14 17:59:16 UTC
  • mto: This revision was merged to the branch mainline in revision 7065.
  • Revision ID: jelmer@jelmer.uk-20180614175916-a2e2xh5k533guq1x
Move breezy.plugins.git to breezy.git.

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
 
17
17
"""Export a tree to a tarball."""
18
18
 
 
19
from __future__ import absolute_import
 
20
 
19
21
from contextlib import closing
20
 
from io import BytesIO
21
22
import os
22
23
import sys
23
24
import tarfile
27
28
    osutils,
28
29
    )
29
30
from ..export import _export_iter_entries
 
31
from ..sixish import (
 
32
    BytesIO,
 
33
    )
30
34
 
31
35
 
32
36
def prepare_tarball_item(tree, root, final_path, tree_path, entry, force_mtime=None):
42
46
    Returns a (tarinfo, fileobj) tuple
43
47
    """
44
48
    file_id = getattr(entry, 'file_id', None)
45
 
    filename = osutils.pathjoin(root, final_path)
 
49
    filename = osutils.pathjoin(root, final_path).encode('utf8')
46
50
    item = tarfile.TarInfo(filename)
47
51
    if force_mtime is not None:
48
52
        item.mtime = force_mtime
49
53
    else:
50
 
        item.mtime = tree.get_file_mtime(tree_path)
 
54
        item.mtime = tree.get_file_mtime(tree_path, file_id)
51
55
    if entry.kind == "file":
52
56
        item.type = tarfile.REGTYPE
53
 
        if tree.is_executable(tree_path):
 
57
        if tree.is_executable(tree_path, file_id):
54
58
            item.mode = 0o755
55
59
        else:
56
60
            item.mode = 0o644
58
62
        # the tarfile contract, which wants the size of the file up front.  We
59
63
        # want to make sure it doesn't change, and we need to read it in one
60
64
        # go for content filtering.
61
 
        content = tree.get_file_text(tree_path)
 
65
        content = tree.get_file_text(tree_path, file_id)
62
66
        item.size = len(content)
63
67
        fileobj = BytesIO(content)
64
68
    elif entry.kind in ("directory", "tree-reference"):
71
75
        item.type = tarfile.SYMTYPE
72
76
        item.size = 0
73
77
        item.mode = 0o755
74
 
        item.linkname = tree.get_symlink_target(tree_path)
 
78
        item.linkname = tree.get_symlink_target(tree_path, file_id)
75
79
        fileobj = None
76
80
    else:
77
81
        raise errors.BzrError("don't know how to export {%s} of kind %r"
120
124
            rev = tree.repository.get_revision(tree.get_revision_id())
121
125
            root_mtime = rev.timestamp
122
126
        elif tree.is_versioned(u''):
123
 
            root_mtime = tree.get_file_mtime('')
 
127
            root_mtime = tree.get_file_mtime('', tree.get_root_id())
124
128
        else:
125
129
            root_mtime = None
126
130
 
133
137
        buf = BytesIO()
134
138
        zipstream = gzip.GzipFile(basename, 'w', fileobj=buf,
135
139
                                  mtime=root_mtime)
136
 
        for chunk in tarball_generator(tree, root, subdir, force_mtime):
 
140
        for chunk in tarball_generator(
 
141
            tree, root, subdir, force_mtime):
137
142
            zipstream.write(chunk)
138
143
            # Yield the data that was written so far, rinse, repeat.
139
144
            yield buf.getvalue()
155
160
 
156
161
 
157
162
def plain_tar_generator(tree, dest, root, subdir,
158
 
                        force_mtime=None):
 
163
    force_mtime=None):
159
164
    """Export this tree to a new tar file.
160
165
 
161
166
    `dest` will be created holding the contents of this tree; if it
182
187
        raise errors.DependencyNotPresent('lzma', e)
183
188
 
184
189
    compressor = lzma.LZMACompressor(
185
 
        format={
186
 
            'xz': lzma.FORMAT_XZ,
187
 
            'raw': lzma.FORMAT_RAW,
188
 
            'alone': lzma.FORMAT_ALONE,
189
 
            }[compression_format])
 
190
            options={"format": compression_format})
190
191
 
191
192
    for chunk in tarball_generator(
192
193
            tree, root, subdir, force_mtime=force_mtime):