~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/export/tar_exporter.py

Merged branch

Show diffs side-by-side

added added

removed removed

Lines of Context:
31
31
    filtered_output_bytes,
32
32
    )
33
33
 
34
 
def prepare_tarball_item(tree, root, final_path, entry, filtered=False, 
 
34
def prepare_tarball_item(tree, root, final_path, entry, filtered=False,
35
35
                         force_mtime=None):
36
36
    """Prepare a tarball item for exporting
37
37
        
38
38
    :param tree: Tree to export
 
39
 
39
40
    :param final_path: Final path to place item
 
41
 
40
42
    :param entry: Entry to export
 
43
 
41
44
    :param filtered: Whether to apply filters
 
45
 
42
46
    :param force_mtime: Option mtime to force, instead of using tree timestamps.
43
47
    
44
48
    Returns a (tarinfo, fileobj) tuple
45
49
    """
46
 
    
47
50
    filename = osutils.pathjoin(root, final_path).encode('utf8')
48
51
    item = tarfile.TarInfo(filename)
49
52
    if force_mtime is not None:
85
88
    
86
89
    return (item, fileobj)
87
90
 
88
 
def export_tarball_generator(tree, ball, root, subdir=None, filtered=False, 
 
91
def export_tarball_generator(tree, ball, root, subdir=None, filtered=False,
89
92
                   force_mtime=None):
90
93
    """Export tree contents to a tarball. This is a generator.
91
94
 
92
95
    :param tree: Tree to export
 
96
 
93
97
    :param ball: Tarball to export to
 
98
 
94
99
    :param filtered: Whether to apply filters
 
100
 
95
101
    :param subdir: Sub directory to export
96
 
    :param force_mtime: Option mtime to force, instead of using
97
 
        tree timestamps.
 
102
 
 
103
    :param force_mtime: Option mtime to force, instead of using tree
 
104
        timestamps.
98
105
    """
99
106
    for final_path, entry in _export_iter_entries(tree, subdir):
100
107
 
101
 
        (item, fileobj) = prepare_tarball_item(tree, root, final_path, 
 
108
        (item, fileobj) = prepare_tarball_item(tree, root, final_path,
102
109
                                               entry, filtered, force_mtime)
103
110
        ball.addfile(item, fileobj)
104
 
        
105
 
        yield    
106
 
        
107
 
def export_tarball(tree, ball, root, subdir=None, filtered=False, force_mtime=None):
108
 
    
109
 
    for _ in export_tarball_generator(tree, ball, root, subdir, filtered, force_mtime):
110
 
        
 
111
 
 
112
        yield
 
113
 
 
114
 
 
115
def export_tarball(tree, ball, root, subdir=None, filtered=False,
 
116
                   force_mtime=None):
 
117
 
 
118
    for _ in export_tarball_generator(tree, ball, root, subdir, filtered,
 
119
                                      force_mtime):
111
120
        pass
112
121
 
113
 
def tgz_exporter_generator(tree, dest, root, subdir, filtered=False, force_mtime=None, 
114
 
                 fileobj=None):
 
122
def tgz_exporter_generator(tree, dest, root, subdir, filtered=False,
 
123
                           force_mtime=None, fileobj=None):
115
124
    """Export this tree to a new tar file.
116
125
 
117
126
    `dest` will be created holding the contents of this tree; if it
118
127
    already exists, it will be clobbered, like with "tar -c".
119
128
    """
120
129
    import gzip
121
 
    
122
130
    if force_mtime is not None:
123
131
        root_mtime = force_mtime
124
132
    elif (getattr(tree, "repository", None) and
132
140
        root_mtime = None
133
141
 
134
142
    is_stdout = False
135
 
    
136
143
    if fileobj is not None:
137
144
        stream = fileobj
138
145
    elif dest == '-':
146
153
        # dest. (bug 102234)
147
154
        basename = os.path.basename(dest)
148
155
    try:
149
 
        zipstream = gzip.GzipFile(basename, 'w', fileobj=stream, 
 
156
        zipstream = gzip.GzipFile(basename, 'w', fileobj=stream,
150
157
                                  mtime=root_mtime)
151
158
    except TypeError:
152
159
        # Python < 2.7 doesn't support the mtime argument
153
160
        zipstream = gzip.GzipFile(basename, 'w', fileobj=stream)
154
161
    ball = tarfile.open(None, 'w|', fileobj=zipstream)
155
162
 
156
 
    for _ in export_tarball_generator(tree, ball, root, subdir, filtered, force_mtime):
157
 
        
 
163
    for _ in export_tarball_generator(tree, ball, root, subdir, filtered,
 
164
                                      force_mtime):
 
165
 
158
166
        yield
159
167
 
160
168
    zipstream.close()
161
 
    
162
169
    if not is_stdout:
163
170
        stream.close()
164
 
        
165
 
def tgz_exporter(tree, dest, root, subdir, filtered=False, force_mtime=None, fileobj=None):
166
 
    
167
 
    for _ in tgz_exporter_generator(tree, dest, root, subdir, filtered, force_mtime, 
168
 
                                    fileobj):
169
 
        
 
171
 
 
172
 
 
173
def tgz_exporter(tree, dest, root, subdir, filtered=False, force_mtime=None,
 
174
                 fileobj=None):
 
175
 
 
176
    for _ in tgz_exporter_generator(tree, dest, root, subdir, filtered,
 
177
                                    force_mtime, fileobj):
170
178
        pass
171
179
 
172
180
 
173
 
def tbz_exporter_generator(tree, dest, root, subdir, filtered=False, force_mtime=None,
174
 
                 fileobj=None):
 
181
def tbz_exporter_generator(tree, dest, root, subdir, filtered=False,
 
182
                           force_mtime=None, fileobj=None):
175
183
    """Export this tree to a new tar file.
176
184
 
177
185
    `dest` will be created holding the contents of this tree; if it
189
197
        # (fixed in Python 2.6.5 and 2.7b1)
190
198
        ball = tarfile.open(dest.encode(osutils._fs_enc), 'w:bz2')
191
199
 
192
 
    for _ in export_tarball_generator(tree, ball, root, subdir, filtered, force_mtime):
193
 
        
 
200
    for _ in export_tarball_generator(tree, ball, root, subdir, filtered,
 
201
                                      force_mtime):
194
202
        yield
195
203
 
196
204
    ball.close()
197
 
    
 
205
 
 
206
 
198
207
def tbz_exporter(tree, dest, root, subdir, filtered=False, force_mtime=None,
199
208
                 fileobj=None):
200
 
    
201
 
    for _ in tbz_exporter_generator(tree, dest, root, subdir, filtered, force_mtime, 
202
 
                                    fileobj):
 
209
 
 
210
    for _ in tbz_exporter_generator(tree, dest, root, subdir, filtered,
 
211
                                    force_mtime, fileobj):
203
212
        pass
204
213
 
205
214
 
206
 
def plain_tar_exporter_generator(tree, dest, root, subdir, compression=None, filtered=False,
207
 
                                force_mtime=None, fileobj=None):
 
215
def plain_tar_exporter_generator(tree, dest, root, subdir, compression=None,
 
216
                                 filtered=False, force_mtime=None,
 
217
                                 fileobj=None):
208
218
    """Export this tree to a new tar file.
209
219
 
210
220
    `dest` will be created holding the contents of this tree; if it
211
221
    already exists, it will be clobbered, like with "tar -c".
212
222
    """
213
223
    if fileobj is not None:
214
 
        stream = fileobj  
 
224
        stream = fileobj
215
225
    elif dest == '-':
216
226
        stream = sys.stdout
217
227
    else:
218
228
        stream = open(dest, 'wb')
219
229
    ball = tarfile.open(None, 'w|', stream)
220
230
 
221
 
    for _ in export_tarball_generator(tree, ball, root, subdir, filtered, force_mtime):
 
231
    for _ in export_tarball_generator(tree, ball, root, subdir, filtered,
 
232
                                      force_mtime):
222
233
 
223
234
        yield
224
235
 
225
236
    ball.close()
226
 
    
227
 
def plain_tar_exporter(tree, dest, root, subdir, compression=None, filtered=False, 
228
 
                       force_mtime=None, fileobj=None):
229
 
    
230
 
    for _ in plain_tar_exporter_generator(tree, dest, root, subdir, compression, 
231
 
                                          filtered, force_mtime, fileobj): 
232
 
        pass 
233
 
 
234
 
 
235
 
def tar_xz_exporter_generator(tree, dest, root, subdir, filtered=False, force_mtime=None,
236
 
                     fileobj=None):
237
 
    
238
 
    return tar_lzma_exporter_generator(tree, dest, root, subdir, filtered, force_mtime,
239
 
                              fileobj, "xz")
240
 
    
 
237
 
 
238
def plain_tar_exporter(tree, dest, root, subdir, compression=None,
 
239
                       filtered=False, force_mtime=None, fileobj=None):
 
240
 
 
241
    for _ in plain_tar_exporter_generator(
 
242
        tree, dest, root, subdir, compression, filtered, force_mtime, fileobj):
 
243
        pass
 
244
 
 
245
 
 
246
def tar_xz_exporter_generator(tree, dest, root, subdir, filtered=False,
 
247
                              force_mtime=None, fileobj=None):
 
248
 
 
249
    return tar_lzma_exporter_generator(tree, dest, root, subdir, filtered,
 
250
                                       force_mtime, fileobj, "xz")
 
251
 
 
252
 
241
253
def tar_xz_exporter(tree, dest, root, subdir, filtered=False, force_mtime=None,
242
254
                     fileobj=None):
243
 
    for _ in tar_xz_exporter_generator(tree, dest, root, subdir, filtered, force_mtime,
244
 
                                       fileobj):
 
255
    for _ in tar_xz_exporter_generator(tree, dest, root, subdir, filtered,
 
256
                                       force_mtime, fileobj):
245
257
        pass
246
258
 
247
259
 
248
 
def tar_lzma_exporter_generator(tree, dest, root, subdir, filtered=False, 
249
 
                      force_mtime=None, fileobj=None, compression_format="alone"):
 
260
def tar_lzma_exporter_generator(tree, dest, root, subdir, filtered=False,
 
261
                      force_mtime=None, fileobj=None,
 
262
                                compression_format="alone"):
250
263
    """Export this tree to a new .tar.lzma file.
251
264
 
252
265
    `dest` will be created holding the contents of this tree; if it
253
266
    already exists, it will be clobbered, like with "tar -c".
254
267
    """
255
 
    
256
268
    if dest == '-':
257
269
        raise errors.BzrError("Writing to stdout not supported for .tar.lzma")
258
270
 
259
271
    if fileobj is not None:
260
 
        raise errors.BzrError("Writing to fileobject not supported for .tar.lzma")
261
 
        
 
272
        raise errors.BzrError(
 
273
            "Writing to fileobject not supported for .tar.lzma")
262
274
    try:
263
275
        import lzma
264
276
    except ImportError, e:
268
280
            options={"format": compression_format})
269
281
    ball = tarfile.open(None, 'w:', fileobj=stream)
270
282
 
271
 
    for _ in export_tarball_generator(tree, ball, root, subdir, filtered=filtered, 
272
 
                            force_mtime=force_mtime):
273
 
        
 
283
    for _ in export_tarball_generator(
 
284
        tree, ball, root, subdir, filtered=filtered, force_mtime=force_mtime):
274
285
        yield
275
286
 
276
287
    ball.close()
277
288
 
278
 
def tar_lzma_exporter(tree, dest, root, subdir, filtered=False, force_mtime=None,
279
 
                  fileobj=None, compression_format="alone"):
280
 
    
281
 
    for _ in tar_lzma_exporter_generator(tree, dest, root, subdir, filtered, force_mtime,
282
 
                                         fileobj, compression_format):
283
 
        
 
289
 
 
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,
 
295
                                         compression_format):
284
296
        pass