Merge lp:~vila/bzr/tarball-generator into lp:~xaav/bzr/tarball-generator
- tarball-generator
- Merge into tarball-generator
Proposed by
xaav
Status: | Merged |
---|---|
Approved by: | xaav |
Approved revision: | no longer in the source branch. |
Merged at revision: | 5975 |
Proposed branch: | lp:~vila/bzr/tarball-generator |
Merge into: | lp:~xaav/bzr/tarball-generator |
Diff against target: |
409 lines (+127/-99) 3 files modified
bzrlib/export/__init__.py (+41/-26) bzrlib/export/dir_exporter.py (+4/-3) bzrlib/export/tar_exporter.py (+82/-70) |
To merge this branch: | bzr merge lp:~vila/bzr/tarball-generator |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
xaav | Approve | ||
Review via email: mp+63557@code.launchpad.net |
Commit message
Description of the change
To post a comment you must log in.
Revision history for this message
xaav (xaav) : | # |
review:
Approve
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'bzrlib/export/__init__.py' |
2 | --- bzrlib/export/__init__.py 2011-06-06 04:24:34 +0000 |
3 | +++ bzrlib/export/__init__.py 2011-06-06 14:48:49 +0000 |
4 | @@ -66,30 +66,36 @@ |
5 | register_exporter(scheme, extensions, _loader) |
6 | |
7 | def get_export_generator(tree, dest=None, format=None, root=None, subdir=None, |
8 | - filtered=False, per_file_timestamps=False, fileobj=None): |
9 | - """Returns a generator that exports the given tree to the specific destination. |
10 | + filtered=False, per_file_timestamps=False, |
11 | + fileobj=None): |
12 | + """Returns a generator that exports the given tree. |
13 | |
14 | - The generator is expected to yield None while exporting the tree |
15 | + The generator is expected to yield None while exporting the tree while the |
16 | + actual export is written to ``fileobj``. |
17 | |
18 | :param tree: A Tree (such as RevisionTree) to export |
19 | - :param dest: The destination where the files,etc should be put |
20 | + |
21 | + :param dest: The destination where the files, etc should be put |
22 | + |
23 | :param format: The format (dir, zip, etc), if None, it will check the |
24 | - extension on dest, looking for a match |
25 | - :param root: The root location inside the format. |
26 | - It is common practise to have zipfiles and tarballs |
27 | - extract into a subdirectory, rather than into the |
28 | - current working directory. |
29 | - If root is None, the default root will be |
30 | - selected as the destination without its |
31 | - extension. |
32 | + extension on dest, looking for a match |
33 | + |
34 | + :param root: The root location inside the format. It is common practise to |
35 | + have zipfiles and tarballs extract into a subdirectory, rather than |
36 | + into the current working directory. If root is None, the default root |
37 | + will be selected as the destination without its extension. |
38 | + |
39 | :param subdir: A starting directory within the tree. None means to export |
40 | the entire tree, and anything else should specify the relative path to |
41 | a directory to start exporting from. |
42 | - :param filtered: If True, content filtering is applied to the |
43 | - files exported. |
44 | - :param per_file_timestamps: Whether to use the timestamp stored in the |
45 | - tree rather than now(). This will do a revision lookup |
46 | - for every file so will be significantly slower. |
47 | + |
48 | + :param filtered: If True, content filtering is applied to the exported |
49 | + files. |
50 | + |
51 | + :param per_file_timestamps: Whether to use the timestamp stored in the tree |
52 | + rather than now(). This will do a revision lookup for every file so |
53 | + will be significantly slower. |
54 | + |
55 | :param fileobj: Optional file object to use |
56 | """ |
57 | global _exporters, _exporter_extensions |
58 | @@ -118,7 +124,8 @@ |
59 | try: |
60 | tree.lock_read() |
61 | |
62 | - for _ in _exporters[format](tree, dest, root, subdir, filtered=filtered, |
63 | + for _ in _exporters[format](tree, dest, root, subdir, |
64 | + filtered=filtered, |
65 | force_mtime=force_mtime, fileobj=fileobj): |
66 | |
67 | yield |
68 | @@ -206,12 +213,20 @@ |
69 | yield final_path, entry |
70 | |
71 | |
72 | -register_lazy_exporter(None, [], 'bzrlib.export.dir_exporter', 'dir_exporter_generator') |
73 | -register_lazy_exporter('dir', [], 'bzrlib.export.dir_exporter', 'dir_exporter_generator') |
74 | -register_lazy_exporter('tar', ['.tar'], 'bzrlib.export.tar_exporter', 'plain_tar_exporter_generator') |
75 | -register_lazy_exporter('tgz', ['.tar.gz', '.tgz'], 'bzrlib.export.tar_exporter', 'tgz_exporter_generator') |
76 | -register_lazy_exporter('tbz2', ['.tar.bz2', '.tbz2'], 'bzrlib.export.tar_exporter', 'tbz_exporter_generator') |
77 | -register_lazy_exporter('tlzma', ['.tar.lzma'], 'bzrlib.export.tar_exporter', 'tar_lzma_exporter_generator') |
78 | -register_lazy_exporter('txz', ['.tar.xz'], 'bzrlib.export.tar_exporter', 'tar_xz_exporte_generatorr') |
79 | -register_lazy_exporter('zip', ['.zip'], 'bzrlib.export.zip_exporter', 'zip_exporter_generator') |
80 | +register_lazy_exporter(None, [], 'bzrlib.export.dir_exporter', |
81 | + 'dir_exporter_generator') |
82 | +register_lazy_exporter('dir', [], 'bzrlib.export.dir_exporter', |
83 | + 'dir_exporter_generator') |
84 | +register_lazy_exporter('tar', ['.tar'], 'bzrlib.export.tar_exporter', |
85 | + 'plain_tar_exporter_generator') |
86 | +register_lazy_exporter('tgz', ['.tar.gz', '.tgz'], 'bzrlib.export.tar_exporter', |
87 | + 'tgz_exporter_generator') |
88 | +register_lazy_exporter('tbz2', ['.tar.bz2', '.tbz2'], |
89 | + 'bzrlib.export.tar_exporter', 'tbz_exporter_generator') |
90 | +register_lazy_exporter('tlzma', ['.tar.lzma'], 'bzrlib.export.tar_exporter', |
91 | + 'tar_lzma_exporter_generator') |
92 | +register_lazy_exporter('txz', ['.tar.xz'], 'bzrlib.export.tar_exporter', |
93 | + 'tar_xz_exporte_generatorr') |
94 | +register_lazy_exporter('zip', ['.zip'], 'bzrlib.export.zip_exporter', |
95 | + 'zip_exporter_generator') |
96 | |
97 | |
98 | === modified file 'bzrlib/export/dir_exporter.py' |
99 | --- bzrlib/export/dir_exporter.py 2011-06-03 17:37:56 +0000 |
100 | +++ bzrlib/export/dir_exporter.py 2011-06-06 14:48:49 +0000 |
101 | @@ -27,7 +27,7 @@ |
102 | ) |
103 | |
104 | |
105 | -def dir_exporter_generator(tree, dest, root, subdir=None, filtered=False, |
106 | +def dir_exporter_generator(tree, dest, root, subdir=None, filtered=False, |
107 | force_mtime=None, fileobj=None): |
108 | """Return a generator that exports this tree to a new directory. |
109 | |
110 | @@ -45,7 +45,8 @@ |
111 | if e.errno == errno.EEXIST: |
112 | # check if directory empty |
113 | if os.listdir(dest) != []: |
114 | - raise errors.BzrError("Can't export tree to non-empty directory.") |
115 | + raise errors.BzrError( |
116 | + "Can't export tree to non-empty directory.") |
117 | else: |
118 | raise |
119 | # Iterate everything, building up the files we will want to export, and |
120 | @@ -105,4 +106,4 @@ |
121 | |
122 | for _ in dir_exporter_generator(tree, dest, root, subdir, filtered, |
123 | force_mtime, fileobj): |
124 | - pass |
125 | \ No newline at end of file |
126 | + pass |
127 | |
128 | === modified file 'bzrlib/export/tar_exporter.py' |
129 | --- bzrlib/export/tar_exporter.py 2011-06-03 17:33:02 +0000 |
130 | +++ bzrlib/export/tar_exporter.py 2011-06-06 14:48:49 +0000 |
131 | @@ -31,19 +31,22 @@ |
132 | filtered_output_bytes, |
133 | ) |
134 | |
135 | -def prepare_tarball_item(tree, root, final_path, entry, filtered=False, |
136 | +def prepare_tarball_item(tree, root, final_path, entry, filtered=False, |
137 | force_mtime=None): |
138 | """Prepare a tarball item for exporting |
139 | |
140 | :param tree: Tree to export |
141 | + |
142 | :param final_path: Final path to place item |
143 | + |
144 | :param entry: Entry to export |
145 | + |
146 | :param filtered: Whether to apply filters |
147 | + |
148 | :param force_mtime: Option mtime to force, instead of using tree timestamps. |
149 | |
150 | Returns a (tarinfo, fileobj) tuple |
151 | """ |
152 | - |
153 | filename = osutils.pathjoin(root, final_path).encode('utf8') |
154 | item = tarfile.TarInfo(filename) |
155 | if force_mtime is not None: |
156 | @@ -85,40 +88,45 @@ |
157 | |
158 | return (item, fileobj) |
159 | |
160 | -def export_tarball_generator(tree, ball, root, subdir=None, filtered=False, |
161 | +def export_tarball_generator(tree, ball, root, subdir=None, filtered=False, |
162 | force_mtime=None): |
163 | """Export tree contents to a tarball. This is a generator. |
164 | |
165 | :param tree: Tree to export |
166 | + |
167 | :param ball: Tarball to export to |
168 | + |
169 | :param filtered: Whether to apply filters |
170 | + |
171 | :param subdir: Sub directory to export |
172 | - :param force_mtime: Option mtime to force, instead of using |
173 | - tree timestamps. |
174 | + |
175 | + :param force_mtime: Option mtime to force, instead of using tree |
176 | + timestamps. |
177 | """ |
178 | for final_path, entry in _export_iter_entries(tree, subdir): |
179 | |
180 | - (item, fileobj) = prepare_tarball_item(tree, root, final_path, |
181 | + (item, fileobj) = prepare_tarball_item(tree, root, final_path, |
182 | entry, filtered, force_mtime) |
183 | ball.addfile(item, fileobj) |
184 | - |
185 | - yield |
186 | - |
187 | -def export_tarball(tree, ball, root, subdir=None, filtered=False, force_mtime=None): |
188 | - |
189 | - for _ in export_tarball_generator(tree, ball, root, subdir, filtered, force_mtime): |
190 | - |
191 | + |
192 | + yield |
193 | + |
194 | + |
195 | +def export_tarball(tree, ball, root, subdir=None, filtered=False, |
196 | + force_mtime=None): |
197 | + |
198 | + for _ in export_tarball_generator(tree, ball, root, subdir, filtered, |
199 | + force_mtime): |
200 | pass |
201 | |
202 | -def tgz_exporter_generator(tree, dest, root, subdir, filtered=False, force_mtime=None, |
203 | - fileobj=None): |
204 | +def tgz_exporter_generator(tree, dest, root, subdir, filtered=False, |
205 | + force_mtime=None, fileobj=None): |
206 | """Export this tree to a new tar file. |
207 | |
208 | `dest` will be created holding the contents of this tree; if it |
209 | already exists, it will be clobbered, like with "tar -c". |
210 | """ |
211 | import gzip |
212 | - |
213 | if force_mtime is not None: |
214 | root_mtime = force_mtime |
215 | elif (getattr(tree, "repository", None) and |
216 | @@ -132,7 +140,6 @@ |
217 | root_mtime = None |
218 | |
219 | is_stdout = False |
220 | - |
221 | if fileobj is not None: |
222 | stream = fileobj |
223 | elif dest == '-': |
224 | @@ -146,32 +153,33 @@ |
225 | # dest. (bug 102234) |
226 | basename = os.path.basename(dest) |
227 | try: |
228 | - zipstream = gzip.GzipFile(basename, 'w', fileobj=stream, |
229 | + zipstream = gzip.GzipFile(basename, 'w', fileobj=stream, |
230 | mtime=root_mtime) |
231 | except TypeError: |
232 | # Python < 2.7 doesn't support the mtime argument |
233 | zipstream = gzip.GzipFile(basename, 'w', fileobj=stream) |
234 | ball = tarfile.open(None, 'w|', fileobj=zipstream) |
235 | |
236 | - for _ in export_tarball_generator(tree, ball, root, subdir, filtered, force_mtime): |
237 | - |
238 | + for _ in export_tarball_generator(tree, ball, root, subdir, filtered, |
239 | + force_mtime): |
240 | + |
241 | yield |
242 | |
243 | zipstream.close() |
244 | - |
245 | if not is_stdout: |
246 | stream.close() |
247 | - |
248 | -def tgz_exporter(tree, dest, root, subdir, filtered=False, force_mtime=None, fileobj=None): |
249 | - |
250 | - for _ in tgz_exporter_generator(tree, dest, root, subdir, filtered, force_mtime, |
251 | - fileobj): |
252 | - |
253 | + |
254 | + |
255 | +def tgz_exporter(tree, dest, root, subdir, filtered=False, force_mtime=None, |
256 | + fileobj=None): |
257 | + |
258 | + for _ in tgz_exporter_generator(tree, dest, root, subdir, filtered, |
259 | + force_mtime, fileobj): |
260 | pass |
261 | |
262 | |
263 | -def tbz_exporter_generator(tree, dest, root, subdir, filtered=False, force_mtime=None, |
264 | - fileobj=None): |
265 | +def tbz_exporter_generator(tree, dest, root, subdir, filtered=False, |
266 | + force_mtime=None, fileobj=None): |
267 | """Export this tree to a new tar file. |
268 | |
269 | `dest` will be created holding the contents of this tree; if it |
270 | @@ -189,76 +197,80 @@ |
271 | # (fixed in Python 2.6.5 and 2.7b1) |
272 | ball = tarfile.open(dest.encode(osutils._fs_enc), 'w:bz2') |
273 | |
274 | - for _ in export_tarball_generator(tree, ball, root, subdir, filtered, force_mtime): |
275 | - |
276 | + for _ in export_tarball_generator(tree, ball, root, subdir, filtered, |
277 | + force_mtime): |
278 | yield |
279 | |
280 | ball.close() |
281 | - |
282 | + |
283 | + |
284 | def tbz_exporter(tree, dest, root, subdir, filtered=False, force_mtime=None, |
285 | fileobj=None): |
286 | - |
287 | - for _ in tbz_exporter_generator(tree, dest, root, subdir, filtered, force_mtime, |
288 | - fileobj): |
289 | + |
290 | + for _ in tbz_exporter_generator(tree, dest, root, subdir, filtered, |
291 | + force_mtime, fileobj): |
292 | pass |
293 | |
294 | |
295 | -def plain_tar_exporter_generator(tree, dest, root, subdir, compression=None, filtered=False, |
296 | - force_mtime=None, fileobj=None): |
297 | +def plain_tar_exporter_generator(tree, dest, root, subdir, compression=None, |
298 | + filtered=False, force_mtime=None, |
299 | + fileobj=None): |
300 | """Export this tree to a new tar file. |
301 | |
302 | `dest` will be created holding the contents of this tree; if it |
303 | already exists, it will be clobbered, like with "tar -c". |
304 | """ |
305 | if fileobj is not None: |
306 | - stream = fileobj |
307 | + stream = fileobj |
308 | elif dest == '-': |
309 | stream = sys.stdout |
310 | else: |
311 | stream = open(dest, 'wb') |
312 | ball = tarfile.open(None, 'w|', stream) |
313 | |
314 | - for _ in export_tarball_generator(tree, ball, root, subdir, filtered, force_mtime): |
315 | + for _ in export_tarball_generator(tree, ball, root, subdir, filtered, |
316 | + force_mtime): |
317 | |
318 | yield |
319 | |
320 | ball.close() |
321 | - |
322 | -def plain_tar_exporter(tree, dest, root, subdir, compression=None, filtered=False, |
323 | - force_mtime=None, fileobj=None): |
324 | - |
325 | - for _ in plain_tar_exporter_generator(tree, dest, root, subdir, compression, |
326 | - filtered, force_mtime, fileobj): |
327 | - pass |
328 | - |
329 | - |
330 | -def tar_xz_exporter_generator(tree, dest, root, subdir, filtered=False, force_mtime=None, |
331 | - fileobj=None): |
332 | - |
333 | - return tar_lzma_exporter_generator(tree, dest, root, subdir, filtered, force_mtime, |
334 | - fileobj, "xz") |
335 | - |
336 | + |
337 | +def plain_tar_exporter(tree, dest, root, subdir, compression=None, |
338 | + filtered=False, force_mtime=None, fileobj=None): |
339 | + |
340 | + for _ in plain_tar_exporter_generator( |
341 | + tree, dest, root, subdir, compression, filtered, force_mtime, fileobj): |
342 | + pass |
343 | + |
344 | + |
345 | +def tar_xz_exporter_generator(tree, dest, root, subdir, filtered=False, |
346 | + force_mtime=None, fileobj=None): |
347 | + |
348 | + return tar_lzma_exporter_generator(tree, dest, root, subdir, filtered, |
349 | + force_mtime, fileobj, "xz") |
350 | + |
351 | + |
352 | def tar_xz_exporter(tree, dest, root, subdir, filtered=False, force_mtime=None, |
353 | fileobj=None): |
354 | - for _ in tar_xz_exporter_generator(tree, dest, root, subdir, filtered, force_mtime, |
355 | - fileobj): |
356 | + for _ in tar_xz_exporter_generator(tree, dest, root, subdir, filtered, |
357 | + force_mtime, fileobj): |
358 | pass |
359 | |
360 | |
361 | -def tar_lzma_exporter_generator(tree, dest, root, subdir, filtered=False, |
362 | - force_mtime=None, fileobj=None, compression_format="alone"): |
363 | +def tar_lzma_exporter_generator(tree, dest, root, subdir, filtered=False, |
364 | + force_mtime=None, fileobj=None, |
365 | + compression_format="alone"): |
366 | """Export this tree to a new .tar.lzma file. |
367 | |
368 | `dest` will be created holding the contents of this tree; if it |
369 | already exists, it will be clobbered, like with "tar -c". |
370 | """ |
371 | - |
372 | if dest == '-': |
373 | raise errors.BzrError("Writing to stdout not supported for .tar.lzma") |
374 | |
375 | if fileobj is not None: |
376 | - raise errors.BzrError("Writing to fileobject not supported for .tar.lzma") |
377 | - |
378 | + raise errors.BzrError( |
379 | + "Writing to fileobject not supported for .tar.lzma") |
380 | try: |
381 | import lzma |
382 | except ImportError, e: |
383 | @@ -268,17 +280,17 @@ |
384 | options={"format": compression_format}) |
385 | ball = tarfile.open(None, 'w:', fileobj=stream) |
386 | |
387 | - for _ in export_tarball_generator(tree, ball, root, subdir, filtered=filtered, |
388 | - force_mtime=force_mtime): |
389 | - |
390 | + for _ in export_tarball_generator( |
391 | + tree, ball, root, subdir, filtered=filtered, force_mtime=force_mtime): |
392 | yield |
393 | |
394 | ball.close() |
395 | |
396 | -def tar_lzma_exporter(tree, dest, root, subdir, filtered=False, force_mtime=None, |
397 | - fileobj=None, compression_format="alone"): |
398 | - |
399 | - for _ in tar_lzma_exporter_generator(tree, dest, root, subdir, filtered, force_mtime, |
400 | - fileobj, compression_format): |
401 | - |
402 | + |
403 | +def tar_lzma_exporter(tree, dest, root, subdir, filtered=False, |
404 | + force_mtime=None, fileobj=None, |
405 | + compression_format="alone"): |
406 | + for _ in tar_lzma_exporter_generator(tree, dest, root, subdir, filtered, |
407 | + force_mtime, fileobj, |
408 | + compression_format): |
409 | pass |