~ubuntu-branches/debian/sid/bzr/sid

« back to all changes in this revision

Viewing changes to bzrlib/export/tar_exporter.py

  • Committer: Bazaar Package Importer
  • Author(s): Jelmer Vernooij, Jelmer Vernooij, Max Bowsher
  • Date: 2011-07-14 15:35:42 UTC
  • mfrom: (1.5.10 upstream)
  • Revision ID: james.westby@ubuntu.com-20110714153542-7m3m8jpt6c167g2a
Tags: 2.4.0~beta5-1
[ Jelmer Vernooij ]
* Fix typo in package description. Thanks Paul Stewart.
* Mark python-bzrlib as breaking with older versions of bzr that
  predate python-bzrlib. LP: #803362

[ Max Bowsher ]
* New upstream release.

Show diffs side-by-side

added added

removed removed

Lines of Context:
31
31
    filtered_output_bytes,
32
32
    )
33
33
 
 
34
 
34
35
def prepare_tarball_item(tree, root, final_path, entry, filtered=False,
35
36
                         force_mtime=None):
36
37
    """Prepare a tarball item for exporting
37
 
        
 
38
 
38
39
    :param tree: Tree to export
39
40
 
40
41
    :param final_path: Final path to place item
43
44
 
44
45
    :param filtered: Whether to apply filters
45
46
 
46
 
    :param force_mtime: Option mtime to force, instead of using tree timestamps.
47
 
    
 
47
    :param force_mtime: Option mtime to force, instead of using tree
 
48
        timestamps.
 
49
 
48
50
    Returns a (tarinfo, fileobj) tuple
49
51
    """
50
52
    filename = osutils.pathjoin(root, final_path).encode('utf8')
87
89
                              % (entry.file_id, entry.kind))
88
90
    return (item, fileobj)
89
91
 
 
92
 
90
93
def export_tarball_generator(tree, ball, root, subdir=None, filtered=False,
91
94
                   force_mtime=None):
92
 
    """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.
93
100
 
94
101
    :param tree: Tree to export
95
102
 
96
 
    :param ball: Tarball to export to
 
103
    :param ball: Tarball to export to; it will be closed when writing is
 
104
        complete.
97
105
 
98
106
    :param filtered: Whether to apply filters
99
107
 
102
110
    :param force_mtime: Option mtime to force, instead of using tree
103
111
        timestamps.
104
112
    """
105
 
    for final_path, entry in _export_iter_entries(tree, subdir):
106
 
 
107
 
        (item, fileobj) = prepare_tarball_item(tree, root, final_path,
108
 
                                               entry, filtered, force_mtime)
109
 
        ball.addfile(item, fileobj)
110
 
 
111
 
        yield
112
 
 
113
 
 
114
 
def export_tarball(tree, ball, root, subdir=None, filtered=False,
115
 
                   force_mtime=None):
116
 
 
117
 
    for _ in export_tarball_generator(tree, ball, root, subdir, filtered,
118
 
                                      force_mtime):
119
 
        pass
 
113
    try:
 
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)
 
118
            yield
 
119
    finally:
 
120
        ball.close()
 
121
 
120
122
 
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)
161
 
 
162
 
    for _ in export_tarball_generator(tree, ball, root, subdir, filtered,
163
 
                                      force_mtime):
164
 
 
 
163
    for _ in export_tarball_generator(
 
164
        tree, ball, root, subdir, filtered, force_mtime):
165
165
        yield
166
 
    # Closing ball may trigger writes to zipstream
167
 
    ball.close()
168
166
    # Closing zipstream may trigger writes to stream
169
167
    zipstream.close()
170
168
    if not is_stdout:
172
170
        stream.close()
173
171
 
174
172
 
175
 
 
176
 
def tgz_exporter(tree, dest, root, subdir, filtered=False, force_mtime=None,
177
 
                 fileobj=None):
178
 
 
179
 
    for _ in tgz_exporter_generator(tree, dest, root, subdir, filtered,
180
 
                                    force_mtime, fileobj):
181
 
        pass
182
 
 
183
 
 
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)
195
184
    else:
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')
202
 
 
203
 
    for _ in export_tarball_generator(tree, ball, root, subdir, filtered,
204
 
                                      force_mtime):
205
 
        yield
206
 
 
207
 
    ball.close()
208
 
 
209
 
 
210
 
def tbz_exporter(tree, dest, root, subdir, filtered=False, force_mtime=None,
211
 
                 fileobj=None):
212
 
 
213
 
    for _ in tbz_exporter_generator(tree, dest, root, subdir, filtered,
214
 
                                    force_mtime, fileobj):
215
 
        pass
 
191
    return export_tarball_generator(
 
192
        tree, ball, root, subdir, filtered, force_mtime)
216
193
 
217
194
 
218
195
def plain_tar_exporter_generator(tree, dest, root, subdir, compression=None,
230
207
    else:
231
208
        stream = open(dest, 'wb')
232
209
    ball = tarfile.open(None, 'w|', stream)
233
 
 
234
 
    for _ in export_tarball_generator(tree, ball, root, subdir, filtered,
235
 
                                      force_mtime):
236
 
 
237
 
        yield
238
 
 
239
 
    ball.close()
240
 
 
241
 
def plain_tar_exporter(tree, dest, root, subdir, compression=None,
242
 
                       filtered=False, force_mtime=None, fileobj=None):
243
 
 
244
 
    for _ in plain_tar_exporter_generator(
245
 
        tree, dest, root, subdir, compression, filtered, force_mtime, fileobj):
246
 
        pass
 
210
    return export_tarball_generator(
 
211
        tree, ball, root, subdir, filtered, force_mtime)
247
212
 
248
213
 
249
214
def tar_xz_exporter_generator(tree, dest, root, subdir, filtered=False,
250
215
                              force_mtime=None, fileobj=None):
251
 
 
252
216
    return tar_lzma_exporter_generator(tree, dest, root, subdir, filtered,
253
217
                                       force_mtime, fileobj, "xz")
254
218
 
255
219
 
256
 
def tar_xz_exporter(tree, dest, root, subdir, filtered=False, force_mtime=None,
257
 
                     fileobj=None):
258
 
    for _ in tar_xz_exporter_generator(tree, dest, root, subdir, filtered,
259
 
                                       force_mtime, fileobj):
260
 
        pass
261
 
 
262
 
 
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)
281
238
 
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)
285
 
 
286
 
    for _ in export_tarball_generator(
287
 
        tree, ball, root, subdir, filtered=filtered, force_mtime=force_mtime):
288
 
        yield
289
 
 
290
 
    ball.close()
291
 
 
292
 
 
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,
298
 
                                         compression_format):
299
 
        pass
 
242
    return export_tarball_generator(
 
243
        tree, ball, root, subdir, filtered=filtered, force_mtime=force_mtime)