31
31
filtered_output_bytes,
34
35
def prepare_tarball_item(tree, root, final_path, entry, filtered=False,
36
37
"""Prepare a tarball item for exporting
38
39
:param tree: Tree to export
40
41
:param final_path: Final path to place item
44
45
:param filtered: Whether to apply filters
46
:param force_mtime: Option mtime to force, instead of using tree timestamps.
47
:param force_mtime: Option mtime to force, instead of using tree
48
50
Returns a (tarinfo, fileobj) tuple
50
52
filename = osutils.pathjoin(root, final_path).encode('utf8')
87
89
% (entry.file_id, entry.kind))
88
90
return (item, fileobj)
90
93
def export_tarball_generator(tree, ball, root, subdir=None, filtered=False,
92
"""Export tree contents to a tarball. This is a generator.
95
"""Export tree contents to a tarball.
97
:returns: A generator that will repeatedly produce None as each file is
98
emitted. The entire generator must be consumed to complete writing
94
101
:param tree: Tree to export
96
:param ball: Tarball to export to
103
:param ball: Tarball to export to; it will be closed when writing is
98
106
:param filtered: Whether to apply filters
102
110
:param force_mtime: Option mtime to force, instead of using tree
105
for final_path, entry in _export_iter_entries(tree, subdir):
107
(item, fileobj) = prepare_tarball_item(tree, root, final_path,
108
entry, filtered, force_mtime)
109
ball.addfile(item, fileobj)
114
def export_tarball(tree, ball, root, subdir=None, filtered=False,
117
for _ in export_tarball_generator(tree, ball, root, subdir, filtered,
114
for final_path, entry in _export_iter_entries(tree, subdir):
115
(item, fileobj) = prepare_tarball_item(
116
tree, root, final_path, entry, filtered, force_mtime)
117
ball.addfile(item, fileobj)
121
123
def tgz_exporter_generator(tree, dest, root, subdir, filtered=False,
122
124
force_mtime=None, fileobj=None):
158
160
# Python < 2.7 doesn't support the mtime argument
159
161
zipstream = gzip.GzipFile(basename, 'w', fileobj=stream)
160
162
ball = tarfile.open(None, 'w|', fileobj=zipstream)
162
for _ in export_tarball_generator(tree, ball, root, subdir, filtered,
163
for _ in export_tarball_generator(
164
tree, ball, root, subdir, filtered, force_mtime):
166
# Closing ball may trigger writes to zipstream
168
166
# Closing zipstream may trigger writes to stream
169
167
zipstream.close()
170
168
if not is_stdout:
176
def tgz_exporter(tree, dest, root, subdir, filtered=False, force_mtime=None,
179
for _ in tgz_exporter_generator(tree, dest, root, subdir, filtered,
180
force_mtime, fileobj):
184
173
def tbz_exporter_generator(tree, dest, root, subdir, filtered=False,
185
174
force_mtime=None, fileobj=None):
186
175
"""Export this tree to a new tar file.
193
182
elif dest == '-':
194
183
ball = tarfile.open(None, 'w|bz2', sys.stdout)
196
# tarfile.open goes on to do 'os.getcwd() + dest' for opening
197
# the tar file. With dest being unicode, this throws UnicodeDecodeError
185
# tarfile.open goes on to do 'os.getcwd() + dest' for opening the
186
# tar file. With dest being unicode, this throws UnicodeDecodeError
198
187
# unless we encode dest before passing it on. This works around
199
# upstream python bug http://bugs.python.org/issue8396
200
# (fixed in Python 2.6.5 and 2.7b1)
188
# upstream python bug http://bugs.python.org/issue8396 (fixed in
189
# Python 2.6.5 and 2.7b1)
201
190
ball = tarfile.open(dest.encode(osutils._fs_enc), 'w:bz2')
203
for _ in export_tarball_generator(tree, ball, root, subdir, filtered,
210
def tbz_exporter(tree, dest, root, subdir, filtered=False, force_mtime=None,
213
for _ in tbz_exporter_generator(tree, dest, root, subdir, filtered,
214
force_mtime, fileobj):
191
return export_tarball_generator(
192
tree, ball, root, subdir, filtered, force_mtime)
218
195
def plain_tar_exporter_generator(tree, dest, root, subdir, compression=None,
231
208
stream = open(dest, 'wb')
232
209
ball = tarfile.open(None, 'w|', stream)
234
for _ in export_tarball_generator(tree, ball, root, subdir, filtered,
241
def plain_tar_exporter(tree, dest, root, subdir, compression=None,
242
filtered=False, force_mtime=None, fileobj=None):
244
for _ in plain_tar_exporter_generator(
245
tree, dest, root, subdir, compression, filtered, force_mtime, fileobj):
210
return export_tarball_generator(
211
tree, ball, root, subdir, filtered, force_mtime)
249
214
def tar_xz_exporter_generator(tree, dest, root, subdir, filtered=False,
250
215
force_mtime=None, fileobj=None):
252
216
return tar_lzma_exporter_generator(tree, dest, root, subdir, filtered,
253
217
force_mtime, fileobj, "xz")
256
def tar_xz_exporter(tree, dest, root, subdir, filtered=False, force_mtime=None,
258
for _ in tar_xz_exporter_generator(tree, dest, root, subdir, filtered,
259
force_mtime, fileobj):
263
220
def tar_lzma_exporter_generator(tree, dest, root, subdir, filtered=False,
264
221
force_mtime=None, fileobj=None,
265
222
compression_format="alone"):
280
237
raise errors.DependencyNotPresent('lzma', e)
282
239
stream = lzma.LZMAFile(dest.encode(osutils._fs_enc), 'w',
283
options={"format": compression_format})
240
options={"format": compression_format})
284
241
ball = tarfile.open(None, 'w:', fileobj=stream)
286
for _ in export_tarball_generator(
287
tree, ball, root, subdir, filtered=filtered, force_mtime=force_mtime):
293
def tar_lzma_exporter(tree, dest, root, subdir, filtered=False,
294
force_mtime=None, fileobj=None,
295
compression_format="alone"):
296
for _ in tar_lzma_exporter_generator(tree, dest, root, subdir, filtered,
297
force_mtime, fileobj,
242
return export_tarball_generator(
243
tree, ball, root, subdir, filtered=filtered, force_mtime=force_mtime)