32
31
filtered_output_bytes,
36
def export_tarball(tree, ball, root, subdir=None, filtered=False,
34
def prepare_tarball_item(tree, root, final_path, entry, filtered=False,
36
"""Prepare a tarball item for exporting
38
:param tree: Tree to export
40
:param final_path: Final path to place item
42
:param entry: Entry to export
44
:param filtered: Whether to apply filters
46
:param force_mtime: Option mtime to force, instead of using tree timestamps.
48
Returns a (tarinfo, fileobj) tuple
50
filename = osutils.pathjoin(root, final_path).encode('utf8')
51
item = tarfile.TarInfo(filename)
52
if force_mtime is not None:
53
item.mtime = force_mtime
55
item.mtime = tree.get_file_mtime(entry.file_id, final_path)
56
if entry.kind == "file":
57
item.type = tarfile.REGTYPE
58
if tree.is_executable(entry.file_id):
63
chunks = tree.get_file_lines(entry.file_id)
64
filters = tree._content_filter_stack(final_path)
65
context = ContentFilterContext(final_path, tree, entry)
66
contents = filtered_output_bytes(chunks, filters, context)
67
content = ''.join(contents)
68
item.size = len(content)
69
fileobj = StringIO.StringIO(content)
71
item.size = tree.get_file_size(entry.file_id)
72
fileobj = tree.get_file(entry.file_id)
73
elif entry.kind == "directory":
74
item.type = tarfile.DIRTYPE
79
elif entry.kind == "symlink":
80
item.type = tarfile.SYMTYPE
83
item.linkname = tree.get_symlink_target(entry.file_id)
86
raise errors.BzrError("don't know how to export {%s} of kind %r"
87
% (entry.file_id, entry.kind))
89
return (item, fileobj)
91
def export_tarball_generator(tree, ball, root, subdir=None, filtered=False,
38
"""Export tree contents to a tarball.
93
"""Export tree contents to a tarball. This is a generator.
40
95
:param tree: Tree to export
41
97
:param ball: Tarball to export to
42
99
:param filtered: Whether to apply filters
43
101
:param subdir: Sub directory to export
44
:param force_mtime: Option mtime to force, instead of using
103
:param force_mtime: Option mtime to force, instead of using 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
if force_mtime is not None:
51
item.mtime = force_mtime
53
item.mtime = tree.get_file_mtime(ie.file_id, dp)
55
item.type = tarfile.REGTYPE
56
if tree.is_executable(ie.file_id):
61
chunks = tree.get_file_lines(ie.file_id)
62
filters = tree._content_filter_stack(dp)
63
context = ContentFilterContext(dp, tree, ie)
64
contents = filtered_output_bytes(chunks, filters, context)
65
content = ''.join(contents)
66
item.size = len(content)
67
fileobj = StringIO.StringIO(content)
69
item.size = tree.get_file_size(ie.file_id)
70
fileobj = tree.get_file(ie.file_id)
71
elif ie.kind == "directory":
72
item.type = tarfile.DIRTYPE
77
elif ie.kind == "symlink":
78
item.type = tarfile.SYMTYPE
81
item.linkname = tree.get_symlink_target(ie.file_id)
84
raise errors.BzrError("don't know how to export {%s} of kind %r" %
85
(ie.file_id, ie.kind))
106
for final_path, entry in _export_iter_entries(tree, subdir):
108
(item, fileobj) = prepare_tarball_item(tree, root, final_path,
109
entry, filtered, force_mtime)
86
110
ball.addfile(item, fileobj)
89
def tgz_exporter(tree, dest, root, subdir, filtered=False, force_mtime=None):
115
def export_tarball(tree, ball, root, subdir=None, filtered=False,
118
for _ in export_tarball_generator(tree, ball, root, subdir, filtered,
122
def tgz_exporter_generator(tree, dest, root, subdir, filtered=False,
123
force_mtime=None, fileobj=None):
90
124
"""Export this tree to a new tar file.
92
126
`dest` will be created holding the contents of this tree; if it
117
153
# dest. (bug 102234)
118
154
basename = os.path.basename(dest)
120
zipstream = gzip.GzipFile(basename, 'w', fileobj=stream, mtime=root_mtime)
156
zipstream = gzip.GzipFile(basename, 'w', fileobj=stream,
121
158
except TypeError:
122
159
# Python < 2.7 doesn't support the mtime argument
123
160
zipstream = gzip.GzipFile(basename, 'w', fileobj=stream)
124
161
ball = tarfile.open(None, 'w|', fileobj=zipstream)
125
export_tarball(tree, ball, root, subdir, filtered=filtered,
126
force_mtime=force_mtime)
163
for _ in export_tarball_generator(tree, ball, root, subdir, filtered,
128
168
zipstream.close()
129
169
if not is_stdout:
133
def tbz_exporter(tree, dest, root, subdir, filtered=False, force_mtime=None):
173
def tgz_exporter(tree, dest, root, subdir, filtered=False, force_mtime=None,
176
for _ in tgz_exporter_generator(tree, dest, root, subdir, filtered,
177
force_mtime, fileobj):
181
def tbz_exporter_generator(tree, dest, root, subdir, filtered=False,
182
force_mtime=None, fileobj=None):
134
183
"""Export this tree to a new tar file.
136
185
`dest` will be created holding the contents of this tree; if it
137
186
already exists, it will be clobbered, like with "tar -c".
188
if fileobj is not None:
189
ball = tarfile.open(None, 'w|bz2', fileobj)
140
191
ball = tarfile.open(None, 'w|bz2', sys.stdout)
142
193
# tarfile.open goes on to do 'os.getcwd() + dest' for opening
145
196
# upstream python bug http://bugs.python.org/issue8396
146
197
# (fixed in Python 2.6.5 and 2.7b1)
147
198
ball = tarfile.open(dest.encode(osutils._fs_enc), 'w:bz2')
148
export_tarball(tree, ball, root, subdir, filtered=filtered,
149
force_mtime=force_mtime)
200
for _ in export_tarball_generator(tree, ball, root, subdir, filtered,
207
def tbz_exporter(tree, dest, root, subdir, filtered=False, force_mtime=None,
210
for _ in tbz_exporter_generator(tree, dest, root, subdir, filtered,
211
force_mtime, fileobj):
215
def plain_tar_exporter_generator(tree, dest, root, subdir, compression=None,
216
filtered=False, force_mtime=None,
218
"""Export this tree to a new tar file.
220
`dest` will be created holding the contents of this tree; if it
221
already exists, it will be clobbered, like with "tar -c".
223
if fileobj is not None:
228
stream = open(dest, 'wb')
229
ball = tarfile.open(None, 'w|', stream)
231
for _ in export_tarball_generator(tree, ball, root, subdir, filtered,
153
238
def plain_tar_exporter(tree, dest, root, subdir, compression=None,
154
filtered=False, force_mtime=None):
155
"""Export this tree to a new tar file.
157
`dest` will be created holding the contents of this tree; if it
158
already exists, it will be clobbered, like with "tar -c".
163
stream = open(dest, 'wb')
164
ball = tarfile.open(None, 'w|', stream)
165
export_tarball(tree, ball, root, subdir, filtered=filtered,
166
force_mtime=force_mtime)
170
def tar_xz_exporter(tree, dest, root, subdir, filtered=False,
172
return tar_lzma_exporter(tree, dest, root, subdir, filtered=filtered,
173
force_mtime=force_mtime, compression_format="xz")
176
def tar_lzma_exporter(tree, dest, root, subdir, filtered=False, force_mtime=None, compression_format="alone"):
239
filtered=False, force_mtime=None, fileobj=None):
241
for _ in plain_tar_exporter_generator(
242
tree, dest, root, subdir, compression, filtered, force_mtime, fileobj):
246
def tar_xz_exporter_generator(tree, dest, root, subdir, filtered=False,
247
force_mtime=None, fileobj=None):
249
return tar_lzma_exporter_generator(tree, dest, root, subdir, filtered,
250
force_mtime, fileobj, "xz")
253
def tar_xz_exporter(tree, dest, root, subdir, filtered=False, force_mtime=None,
255
for _ in tar_xz_exporter_generator(tree, dest, root, subdir, filtered,
256
force_mtime, fileobj):
260
def tar_lzma_exporter_generator(tree, dest, root, subdir, filtered=False,
261
force_mtime=None, fileobj=None,
262
compression_format="alone"):
177
263
"""Export this tree to a new .tar.lzma file.
179
265
`dest` will be created holding the contents of this tree; if it
190
279
stream = lzma.LZMAFile(dest.encode(osutils._fs_enc), 'w',
191
280
options={"format": compression_format})
192
281
ball = tarfile.open(None, 'w:', fileobj=stream)
193
export_tarball(tree, ball, root, subdir, filtered=filtered,
194
force_mtime=force_mtime)
283
for _ in export_tarball_generator(
284
tree, ball, root, subdir, filtered=filtered, force_mtime=force_mtime):
290
def tar_lzma_exporter(tree, dest, root, subdir, filtered=False,
291
force_mtime=None, fileobj=None,
292
compression_format="alone"):
293
for _ in tar_lzma_exporter_generator(tree, dest, root, subdir, filtered,
294
force_mtime, fileobj,