32
31
filtered_output_bytes,
35
def export_tarball_item(tree, ball, root, dp, ie, subdir=None, filtered=False,
34
def export_tarball_item(tree, root, final_path, entry, filtered=False, force_mtime=None):
37
35
"""Export a tarball item
39
37
:param tree: Tree to export
40
:param ball: Tarball to export to
41
:param dp: Return value of _export_iter_entities
42
:param ie: Return value of _export_iter_entities
38
:param final_path: Final path to place item
39
:param entry: Entry to export
43
40
:param filtered: Whether to apply filters
44
:param subdir: Sub directory to export
45
:param force_mtime: Option mtime to force, instead of using
41
:param force_mtime: Option mtime to force, instead of using tree timestamps.
50
filename = osutils.pathjoin(root, dp).encode('utf8')
44
filename = osutils.pathjoin(root, final_path).encode('utf8')
51
45
item = tarfile.TarInfo(filename)
52
46
if force_mtime is not None:
53
47
item.mtime = force_mtime
55
item.mtime = tree.get_file_mtime(ie.file_id, dp)
49
item.mtime = tree.get_file_mtime(entry.file_id, final_path)
50
if entry.kind == "file":
57
51
item.type = tarfile.REGTYPE
58
if tree.is_executable(ie.file_id):
52
if tree.is_executable(entry.file_id):
63
chunks = tree.get_file_lines(ie.file_id)
64
filters = tree._content_filter_stack(dp)
65
context = ContentFilterContext(dp, tree, ie)
57
chunks = tree.get_file_lines(entry.file_id)
58
filters = tree._content_filter_stack(final_path)
59
context = ContentFilterContext(final_path, tree, entry)
66
60
contents = filtered_output_bytes(chunks, filters, context)
67
61
content = ''.join(contents)
68
62
item.size = len(content)
69
63
fileobj = StringIO.StringIO(content)
71
item.size = tree.get_file_size(ie.file_id)
72
fileobj = tree.get_file(ie.file_id)
73
elif ie.kind == "directory":
65
item.size = tree.get_file_size(entry.file_id)
66
fileobj = tree.get_file(entry.file_id)
67
elif entry.kind == "directory":
74
68
item.type = tarfile.DIRTYPE
79
elif ie.kind == "symlink":
73
elif entry.kind == "symlink":
80
74
item.type = tarfile.SYMTYPE
83
item.linkname = tree.get_symlink_target(ie.file_id)
77
item.linkname = tree.get_symlink_target(entry.file_id)
86
raise errors.BzrError("don't know how to export {%s} of kind %r" %
87
(ie.file_id, ie.kind))
80
raise errors.BzrError("don't know how to export {%s} of kind %r" % (entry.file_id, entry.kind))
88
82
return (item, fileobj)
91
def export_tarball(tree, ball, root, subdir=None, filtered=False,
84
def export_tarball(tree, ball, root, subdir=None, filtered=False, force_mtime=None):
93
85
"""Export tree contents to a tarball. This is a generator.
95
87
:param tree: Tree to export
99
91
:param force_mtime: Option mtime to force, instead of using
102
for dp, ie in _export_iter_entries(tree, subdir):
94
for final_path, entry in _export_iter_entries(tree, subdir):
104
(item, fileobj) = export_tarball_item(tree, ball, root, dp, ie, subdir, filtered, force_mtime)
96
(item, fileobj) = export_tarball_item(tree, root, final_path, entry, filtered, force_mtime)
105
97
ball.addfile(item, fileobj)
110
101
def tgz_exporter(tree, dest, root, subdir, filtered=False, force_mtime=None,
111
102
per_file_timestamps=False, fileobj=None):