~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/export/tar_exporter.py

  • Committer: Martin Pool
  • Date: 2011-06-13 17:03:20 UTC
  • mto: This revision was merged to the branch mainline in revision 5996.
  • Revision ID: mbp@canonical.com-20110613170320-btdsj7fp63y3jb24
Further shrink export code

Show diffs side-by-side

added added

removed removed

Lines of Context:
92
92
 
93
93
def export_tarball_generator(tree, ball, root, subdir=None, filtered=False,
94
94
                   force_mtime=None):
95
 
    """Export tree contents to a tarball. This is a generator.
 
95
    """Export tree contents to a tarball.
 
96
 
 
97
    :returns: A generator that will repeatedly produce None as each file is
 
98
        emitted.  The entire generator must be consumed to complete writing
 
99
        the file.
96
100
 
97
101
    :param tree: Tree to export
98
102
 
99
 
    :param ball: Tarball to export to
 
103
    :param ball: Tarball to export to; it will be closed when writing is
 
104
        complete.
100
105
 
101
106
    :param filtered: Whether to apply filters
102
107
 
106
111
        timestamps.
107
112
    """
108
113
    for final_path, entry in _export_iter_entries(tree, subdir):
109
 
 
110
 
        (item, fileobj) = prepare_tarball_item(tree, root, final_path,
111
 
                                               entry, filtered, force_mtime)
 
114
        (item, fileobj) = prepare_tarball_item(
 
115
            tree, root, final_path, entry, filtered, force_mtime)
112
116
        ball.addfile(item, fileobj)
113
 
 
114
117
        yield
 
118
    ball.close()
115
119
 
116
120
 
117
121
def tgz_exporter_generator(tree, dest, root, subdir, filtered=False,
154
158
        # Python < 2.7 doesn't support the mtime argument
155
159
        zipstream = gzip.GzipFile(basename, 'w', fileobj=stream)
156
160
    ball = tarfile.open(None, 'w|', fileobj=zipstream)
157
 
 
158
 
    for _ in export_tarball_generator(tree, ball, root, subdir, filtered,
159
 
                                      force_mtime):
160
 
 
 
161
    for _ in export_tarball_generator(
 
162
        tree, ball, root, subdir, filtered, force_mtime):
161
163
        yield
162
 
    # Closing ball may trigger writes to zipstream
163
 
    ball.close()
164
164
    # Closing zipstream may trigger writes to stream
165
165
    zipstream.close()
166
166
    if not is_stdout:
180
180
    elif dest == '-':
181
181
        ball = tarfile.open(None, 'w|bz2', sys.stdout)
182
182
    else:
183
 
        # tarfile.open goes on to do 'os.getcwd() + dest' for opening
184
 
        # the tar file. With dest being unicode, this throws UnicodeDecodeError
 
183
        # tarfile.open goes on to do 'os.getcwd() + dest' for opening the
 
184
        # tar file. With dest being unicode, this throws UnicodeDecodeError
185
185
        # unless we encode dest before passing it on. This works around
186
 
        # upstream python bug http://bugs.python.org/issue8396
187
 
        # (fixed in Python 2.6.5 and 2.7b1)
 
186
        # upstream python bug http://bugs.python.org/issue8396 (fixed in
 
187
        # Python 2.6.5 and 2.7b1)
188
188
        ball = tarfile.open(dest.encode(osutils._fs_enc), 'w:bz2')
189
 
 
190
 
    for _ in export_tarball_generator(tree, ball, root, subdir, filtered,
191
 
                                      force_mtime):
192
 
        yield
193
 
 
194
 
    ball.close()
 
189
    return export_tarball_generator(
 
190
        tree, ball, root, subdir, filtered, force_mtime)
195
191
 
196
192
 
197
193
def plain_tar_exporter_generator(tree, dest, root, subdir, compression=None,
209
205
    else:
210
206
        stream = open(dest, 'wb')
211
207
    ball = tarfile.open(None, 'w|', stream)
212
 
 
213
 
    for _ in export_tarball_generator(tree, ball, root, subdir, filtered,
214
 
                                      force_mtime):
215
 
 
216
 
        yield
217
 
 
218
 
    ball.close()
 
208
    return export_tarball_generator(
 
209
        tree, ball, root, subdir, filtered, force_mtime)
219
210
 
220
211
 
221
212
def tar_xz_exporter_generator(tree, dest, root, subdir, filtered=False,
222
213
                              force_mtime=None, fileobj=None):
223
 
 
224
214
    return tar_lzma_exporter_generator(tree, dest, root, subdir, filtered,
225
215
                                       force_mtime, fileobj, "xz")
226
216
 
245
235
        raise errors.DependencyNotPresent('lzma', e)
246
236
 
247
237
    stream = lzma.LZMAFile(dest.encode(osutils._fs_enc), 'w',
248
 
            options={"format": compression_format})
 
238
        options={"format": compression_format})
249
239
    ball = tarfile.open(None, 'w:', fileobj=stream)
250
 
 
251
 
    for _ in export_tarball_generator(
252
 
        tree, ball, root, subdir, filtered=filtered, force_mtime=force_mtime):
253
 
        yield
254
 
 
255
 
    ball.close()
 
240
    return export_tarball_generator(
 
241
        tree, ball, root, subdir, filtered=filtered, force_mtime=force_mtime)