Merge lp:~jelmer/bzr-builddeb/multiple-upstream-tarballs-pt2 into lp:bzr-builddeb
- multiple-upstream-tarballs-pt2
- Merge into trunk
Proposed by
Jelmer Vernooij
Status: | Merged |
---|---|
Approved by: | James Westby |
Approved revision: | 577 |
Merged at revision: | 572 |
Proposed branch: | lp:~jelmer/bzr-builddeb/multiple-upstream-tarballs-pt2 |
Merge into: | lp:bzr-builddeb |
Diff against target: |
933 lines (+200/-157) 7 files modified
cmds.py (+5/-6) dh_make.py (+1/-4) import_dsc.py (+103/-76) source_distiller.py (+3/-14) tests/blackbox/test_merge_upstream.py (+7/-3) tests/test_import_dsc.py (+58/-54) util.py (+23/-0) |
To merge this branch: | bzr merge lp:~jelmer/bzr-builddeb/multiple-upstream-tarballs-pt2 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Bzr-builddeb-hackers | Pending | ||
Review via email: mp+64626@code.launchpad.net |
Commit message
Description of the change
Step 2 of support for multiple upstream tarballs.
Pass lists of orig tarballs along in more places rather than a single upstream tarball and md5 sum.
To post a comment you must log in.
- 577. By Jelmer Vernooij
-
Factor out extracting of orig tarballs.
Revision history for this message
James Westby (james-w) wrote : | # |
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'cmds.py' |
2 | --- cmds.py 2011-06-14 14:04:53 +0000 |
3 | +++ cmds.py 2011-06-15 02:38:47 +0000 |
4 | @@ -69,7 +69,6 @@ |
5 | BuildFailedError, |
6 | DchError, |
7 | MissingChangelogError, |
8 | - MultipleUpstreamTarballsNotSupported, |
9 | NoPreviousUpload, |
10 | PackageVersionNotPresent, |
11 | StrictBuildFailed, |
12 | @@ -117,6 +116,7 @@ |
13 | get_source_format, |
14 | guess_build_type, |
15 | lookup_distribution, |
16 | + md5sum_filename, |
17 | open_file, |
18 | open_file_via_transport, |
19 | tarball_name, |
20 | @@ -560,9 +560,7 @@ |
21 | db = DistributionBranch(tree.branch, None, tree=tree) |
22 | dbs = DistributionBranchSet() |
23 | dbs.add_branch(db) |
24 | - if len(tarball_filenames) > 1: |
25 | - raise MultipleUpstreamTarballsNotSupported() |
26 | - conflicts = db.merge_upstream(tarball_filenames[0], package, version, |
27 | + conflicts = db.merge_upstream(tarball_filenames, package, version, |
28 | current_version, upstream_branch=upstream_branch, |
29 | upstream_revision=upstream_revision, |
30 | merge_type=merge_type, force=force) |
31 | @@ -977,7 +975,8 @@ |
32 | else: |
33 | raise BzrCommandError('bzr import-upstream --revision takes exactly' |
34 | ' one revision specifier.') |
35 | - tag_name, _ = db.import_upstream_tarball(location, version, parents, |
36 | + tarballs = [(location, md5sum_filename(location))] |
37 | + tag_name, _ = db.import_upstream_tarball(tarballs, version, parents, |
38 | upstream_branch=upstream, upstream_revision=upstream_revid) |
39 | self.outf.write('Imported %s as tag:%s.\n' % (location, tag_name)) |
40 | |
41 | @@ -1207,7 +1206,7 @@ |
42 | |
43 | def run(self, package_name, version, tarball, bzr_only=None, v3=None): |
44 | tree = dh_make.import_upstream(tarball, package_name, |
45 | - version.encode("utf-8"), use_v3=v3) |
46 | + version.encode("utf-8"), use_v3=v3) |
47 | if not bzr_only: |
48 | tree.lock_write() |
49 | try: |
50 | |
51 | === modified file 'dh_make.py' |
52 | --- dh_make.py 2011-06-14 14:04:53 +0000 |
53 | +++ dh_make.py 2011-06-15 02:38:47 +0000 |
54 | @@ -87,10 +87,7 @@ |
55 | upstream_tree=tree) |
56 | dbs = import_dsc.DistributionBranchSet() |
57 | dbs.add_branch(db) |
58 | - if len(tarball_filenames) > 1: |
59 | - raise errors.MultipleUpstreamTarballsNotSupported() |
60 | - (tarball_filename, md5sum) = tarball_filenames[0] |
61 | - db.import_upstream_tarball(tarball_filename, version, parents, md5sum=md5sum) |
62 | + db.import_upstream_tarball(tarball_filenames, version, parents) |
63 | return tree |
64 | |
65 | |
66 | |
67 | === modified file 'import_dsc.py' |
68 | --- import_dsc.py 2011-06-09 21:43:07 +0000 |
69 | +++ import_dsc.py 2011-06-15 02:38:47 +0000 |
70 | @@ -27,7 +27,6 @@ |
71 | |
72 | |
73 | import os |
74 | -import re |
75 | import shutil |
76 | import stat |
77 | import subprocess |
78 | @@ -63,14 +62,14 @@ |
79 | from bzrlib.plugins.builddeb.bzrtools_import import import_dir |
80 | from bzrlib.plugins.builddeb.errors import ( |
81 | MultipleUpstreamTarballsNotSupported, |
82 | - TarFailed, |
83 | UpstreamAlreadyImported, |
84 | UpstreamBranchAlreadyMerged, |
85 | ) |
86 | from bzrlib.plugins.builddeb.util import ( |
87 | + FORMAT_1_0, |
88 | FORMAT_3_0_QUILT, |
89 | FORMAT_3_0_NATIVE, |
90 | - export, |
91 | + extract_orig_tarballs, |
92 | get_commit_info_from_changelog, |
93 | md5sum_filename, |
94 | open_file_via_transport, |
95 | @@ -301,6 +300,30 @@ |
96 | pass |
97 | return False |
98 | |
99 | + def _has_upstream_version(self, branch, tag_name, tarballs=None): |
100 | + if branch.tags.has_tag(tag_name): |
101 | + revid = branch.tags.lookup_tag(tag_name) |
102 | + branch.lock_read() |
103 | + try: |
104 | + graph = branch.repository.get_graph() |
105 | + if not graph.is_ancestor(revid, branch.last_revision()): |
106 | + return False |
107 | + finally: |
108 | + branch.unlock() |
109 | + if tarballs is None: |
110 | + return True |
111 | + if len(tarballs) != 1: |
112 | + raise MultipleUpstreamTarballsNotSupported() |
113 | + (filename, md5) = tarballs[0] |
114 | + rev = branch.repository.get_revision(revid) |
115 | + try: |
116 | + return rev.properties['deb-md5'] == md5 |
117 | + except KeyError: |
118 | + warning("tag %s present in branch, but there is no " |
119 | + "associated 'deb-md5' property" % tag_name) |
120 | + pass |
121 | + return False |
122 | + |
123 | def has_version(self, version, md5=None): |
124 | """Whether this branch contains the package version specified. |
125 | |
126 | @@ -326,7 +349,7 @@ |
127 | return True |
128 | return False |
129 | |
130 | - def has_upstream_version(self, version, md5=None): |
131 | + def has_upstream_version(self, version, tarballs=None): |
132 | """Whether this branch contains the upstream version specified. |
133 | |
134 | The version must be judged present by having the appropriate tag |
135 | @@ -336,13 +359,13 @@ |
136 | |
137 | :param version: a upstream version number to look for in the upstream |
138 | branch. |
139 | - :param md5: a string with the md5sum that if not None must be |
140 | - associated with the revision. |
141 | + :param tarballs: list of upstream tarballs that should be present, |
142 | + tuples of filename and md5sum |
143 | :return: True if the upstream branch contains the specified upstream |
144 | version of the package. False otherwise. |
145 | """ |
146 | for tag_name in self.pristine_tar_source.possible_tag_names(version): |
147 | - if self._has_version(self.upstream_branch, tag_name, md5=md5): |
148 | + if self._has_upstream_version(self.upstream_branch, tag_name, tarballs=tarballs): |
149 | return True |
150 | return False |
151 | |
152 | @@ -590,7 +613,7 @@ |
153 | finally: |
154 | self.branch.unlock() |
155 | |
156 | - def branch_to_pull_upstream_from(self, version, md5): |
157 | + def branch_to_pull_upstream_from(self, version, upstream_tarballs): |
158 | """Checks whether this upstream is a pull from a lesser branch. |
159 | |
160 | Looks in all the other upstream branches for the given |
161 | @@ -603,20 +626,15 @@ |
162 | |
163 | :param version: the upstream version to use when searching in the |
164 | lesser branches. |
165 | - :param md5: a String containing the md5 associateed with the |
166 | - upstream version. |
167 | :return: a DistributionBranch object to pull the upstream from |
168 | if that is what should be done, otherwise None. |
169 | """ |
170 | assert isinstance(version, str) |
171 | - assert md5 is not None, \ |
172 | - ("It's not a good idea to use branch_to_pull_upstream_from with " |
173 | - "md5 == None, as you may pull the wrong revision.") |
174 | up_branch = self.upstream_branch |
175 | up_branch.lock_read() |
176 | try: |
177 | for branch in reversed(self.get_lesser_branches()): |
178 | - if branch.has_upstream_version(version, md5=md5): |
179 | + if branch.has_upstream_version(version, tarballs=upstream_tarballs): |
180 | # Check that they haven't diverged |
181 | other_up_branch = branch.upstream_branch |
182 | other_up_branch.lock_read() |
183 | @@ -629,7 +647,7 @@ |
184 | finally: |
185 | other_up_branch.unlock() |
186 | for branch in self.get_greater_branches(): |
187 | - if branch.has_upstream_version(version, md5=md5): |
188 | + if branch.has_upstream_version(version, tarballs=upstream_tarballs): |
189 | # Check that they haven't diverged |
190 | other_up_branch = branch.upstream_branch |
191 | other_up_branch.lock_read() |
192 | @@ -837,8 +855,8 @@ |
193 | self.branch.fetch(self.upstream_branch, last_revision=revid) |
194 | self.upstream_branch.tags.merge_to(self.branch.tags) |
195 | |
196 | - def import_upstream(self, upstream_part, version, md5, upstream_parents, |
197 | - upstream_tarball=None, upstream_branch=None, |
198 | + def import_upstream(self, upstream_part, version, upstream_parents, |
199 | + upstream_tarballs=None, upstream_branch=None, |
200 | upstream_revision=None, timestamp=None, author=None, |
201 | file_ids_from=None): |
202 | """Import an upstream part on to the upstream branch. |
203 | @@ -849,7 +867,6 @@ |
204 | :param upstream_part: the path of a directory containing the |
205 | unpacked upstream part of the source package. |
206 | :param version: upstream version that is being imported |
207 | - :param md5: the md5 of the upstream part. |
208 | :param upstream_parents: the parents to give the upstream revision |
209 | :param timestamp: a tuple of (timestamp, timezone) to use for |
210 | the commit, or None to use the current time. |
211 | @@ -901,8 +918,12 @@ |
212 | finally: |
213 | self_tree.unlock() |
214 | self.upstream_tree.set_parent_ids(upstream_parents) |
215 | - revprops = {"deb-md5": md5} |
216 | - if upstream_tarball is not None: |
217 | + revprops = {} |
218 | + if upstream_tarballs is not None: |
219 | + if len(upstream_tarballs) != 1: |
220 | + raise MultipleUpstreamTarballsNotSupported() |
221 | + (upstream_tarball, md5) = upstream_tarballs[0] |
222 | + revprops["deb-md5"] = md5 |
223 | delta_revprops = self.pristine_tar_source.create_delta_revprops( |
224 | self.upstream_tree, upstream_tarball) |
225 | revprops.update(delta_revprops) |
226 | @@ -918,8 +939,8 @@ |
227 | tag_name, _ = self.tag_upstream_version(version, revid=revid) |
228 | return tag_name, revid |
229 | |
230 | - def import_upstream_tarball(self, tarball_filename, version, parents, |
231 | - md5sum=None, upstream_branch=None, upstream_revision=None): |
232 | + def import_upstream_tarball(self, tarballs, version, parents, |
233 | + upstream_branch=None, upstream_revision=None): |
234 | """Import an upstream part to the upstream branch. |
235 | |
236 | :param tarball_filename: The tarball to import. |
237 | @@ -933,12 +954,10 @@ |
238 | :param md5sum: hex digest of the md5sum of the tarball, if known. |
239 | :return: (tag_name, revision_id) of the imported tarball. |
240 | """ |
241 | - if not md5sum: |
242 | - md5sum = md5sum_filename(tarball_filename) |
243 | - tarball_dir = self._extract_tarball_to_tempdir(tarball_filename) |
244 | + tarball_dir = self._extract_tarballs_to_tempdir(tarballs) |
245 | try: |
246 | - return self.import_upstream(tarball_dir, version, md5sum, parents, |
247 | - upstream_tarball=tarball_filename, |
248 | + return self.import_upstream(tarball_dir, version, parents, |
249 | + tarballs, |
250 | upstream_branch=upstream_branch, |
251 | upstream_revision=upstream_revision) |
252 | finally: |
253 | @@ -1132,16 +1151,28 @@ |
254 | cl.parse_changelog(open(cl_filename).read(), strict=False) |
255 | return cl |
256 | |
257 | - def _do_import_package(self, version, versions, debian_part, md5, |
258 | - upstream_part, upstream_md5, upstream_tarball=None, |
259 | - timestamp=None, author=None, file_ids_from=None, |
260 | - pull_debian=True): |
261 | + def _import_normal_package(self, version, versions, debian_part, md5, |
262 | + upstream_part, upstream_tarballs, timestamp=None, author=None, |
263 | + file_ids_from=None, pull_debian=True): |
264 | + """Import a source package. |
265 | + |
266 | + :param version: Full Debian version |
267 | + :param versions: Safe versions from changelog |
268 | + :param debian_part: Path to extracted directory with Debian changes |
269 | + :param unextracted_debian_md5: MD5 sum of unextracted Debian diff/tarball |
270 | + :param upstream_part: Extracted upstream directory |
271 | + :param upstream_tarballs: List of tuples with (upstream tarfile, md5sum) |
272 | + :param timestamp: Version timestamp according to changelog |
273 | + :param author: Author according to changelog |
274 | + :param file_ids_from: Sequence of trees to take file ids from |
275 | + :param pull_debian: Whether to pull from the Debian branch |
276 | + """ |
277 | pull_branch = None |
278 | if pull_debian: |
279 | pull_branch = self.branch_to_pull_version_from(version, md5) |
280 | if pull_branch is not None: |
281 | if (self.branch_to_pull_upstream_from(version.upstream_version, |
282 | - upstream_md5) |
283 | + upstream_tarballs) |
284 | is None): |
285 | pull_branch = None |
286 | if pull_branch is not None: |
287 | @@ -1153,7 +1184,7 @@ |
288 | if not self.has_upstream_version(version.upstream_version): |
289 | up_pull_branch = \ |
290 | self.branch_to_pull_upstream_from(version.upstream_version, |
291 | - upstream_md5) |
292 | + upstream_tarballs) |
293 | if up_pull_branch is not None: |
294 | self.pull_upstream_from_branch(up_pull_branch, |
295 | version.upstream_version) |
296 | @@ -1165,8 +1196,8 @@ |
297 | version.upstream_version) |
298 | _, new_revid = self.import_upstream(upstream_part, |
299 | version.upstream_version, |
300 | - upstream_md5, upstream_parents, |
301 | - upstream_tarball=upstream_tarball, |
302 | + upstream_parents, |
303 | + upstream_tarballs=upstream_tarballs, |
304 | timestamp=timestamp, author=author, |
305 | file_ids_from=file_ids_from) |
306 | self._fetch_upstream_to_branch(new_revid) |
307 | @@ -1250,7 +1281,7 @@ |
308 | base_path = osutils.dirname(dsc_filename) |
309 | dsc = deb822.Dsc(open(dsc_filename).read()) |
310 | version = Version(dsc['Version']) |
311 | - format = dsc.get('Format', '1.0').strip() |
312 | + format = dsc.get('Format', FORMAT_1_0).strip() |
313 | extractor_cls = SOURCE_EXTRACTORS.get(format) |
314 | if extractor_cls is None: |
315 | raise AssertionError("Don't know how to import source format %s yet" |
316 | @@ -1274,13 +1305,13 @@ |
317 | #TODO: check that the versions list is correctly ordered, |
318 | # as some methods assume that, and it's not clear what |
319 | # should happen if it isn't. |
320 | + |
321 | if extractor.extracted_upstream is not None: |
322 | - self._do_import_package(version, versions, |
323 | + self._import_normal_package(version, versions, |
324 | extractor.extracted_debianised, |
325 | extractor.unextracted_debian_md5, |
326 | extractor.extracted_upstream, |
327 | - extractor.unextracted_upstream_md5, |
328 | - upstream_tarball=extractor.unextracted_upstream, |
329 | + extractor.upstream_tarballs, |
330 | timestamp=timestamp, author=author, |
331 | file_ids_from=file_ids_from, |
332 | pull_debian=pull_debian) |
333 | @@ -1347,19 +1378,11 @@ |
334 | if root_id: |
335 | self.upstream_tree.set_root_id(root_id) |
336 | |
337 | - def _extract_tarball_to_tempdir(self, tarball_filename): |
338 | + def _extract_tarballs_to_tempdir(self, tarballs): |
339 | tempdir = tempfile.mkdtemp() |
340 | - if tarball_filename.endswith(".tar.bz2"): |
341 | - tar_args = 'xjf' |
342 | - else: |
343 | - tar_args = 'xzf' |
344 | try: |
345 | - proc = subprocess.Popen(["tar", tar_args, tarball_filename, "-C", |
346 | - tempdir, "--strip-components", "1"], |
347 | - preexec_fn=subprocess_setup) |
348 | - proc.communicate() |
349 | - if proc.returncode != 0: |
350 | - raise TarFailed("extract", tarball_filename) |
351 | + extract_orig_tarballs([fn for (fn, md5) in tarballs], tempdir, |
352 | + strip_components=1) |
353 | return tempdir |
354 | except: |
355 | shutil.rmtree(tempdir) |
356 | @@ -1382,7 +1405,7 @@ |
357 | previous_version, |
358 | self.pristine_tar_source.tag_name(previous_version))) |
359 | |
360 | - def merge_upstream(self, tarball_filename, package, version, previous_version, |
361 | + def merge_upstream(self, tarball_filenames, package, version, previous_version, |
362 | upstream_branch=None, upstream_revision=None, merge_type=None, |
363 | force=False): |
364 | assert self.upstream_branch is None, \ |
365 | @@ -1412,17 +1435,17 @@ |
366 | if not force and graph.is_ancestor(upstream_revision, |
367 | self.branch.last_revision()): |
368 | raise UpstreamBranchAlreadyMerged |
369 | - tarball_filename = os.path.abspath(tarball_filename) |
370 | - md5sum = md5sum_filename(tarball_filename) |
371 | - tarball_dir = self._extract_tarball_to_tempdir(tarball_filename) |
372 | + upstream_tarballs = [ |
373 | + (os.path.abspath(fn), md5sum_filename(fn)) for fn in |
374 | + tarball_filenames] |
375 | + tarball_dir = self._extract_tarballs_to_tempdir(upstream_tarballs) |
376 | try: |
377 | # FIXME: should use upstream_parents()? |
378 | parents = [] |
379 | if self.upstream_branch.last_revision() != NULL_REVISION: |
380 | parents = [self.upstream_branch.last_revision()] |
381 | _, new_revid = self.import_upstream(tarball_dir, |
382 | - version, |
383 | - md5sum, parents, upstream_tarball=tarball_filename, |
384 | + version, parents, upstream_tarballs=upstream_tarballs, |
385 | upstream_branch=upstream_branch, |
386 | upstream_revision=upstream_revision) |
387 | self._fetch_upstream_to_branch(new_revid) |
388 | @@ -1466,9 +1489,22 @@ |
389 | self.dsc = dsc |
390 | self.extracted_upstream = None |
391 | self.extracted_debianised = None |
392 | - self.unextracted_upstream = None |
393 | self.unextracted_debian_md5 = None |
394 | - self.unextracted_upstream_md5 = None |
395 | + self.upstream_tarballs = [] |
396 | + self.tempdir = None |
397 | + |
398 | + def extract(self): |
399 | + """Extract the package to a new temporary directory.""" |
400 | + raise NotImplementedError(self.extract) |
401 | + |
402 | + def cleanup(self): |
403 | + """Cleanup any extracted files.""" |
404 | + if self.tempdir is not None and os.path.isdir(self.tempdir): |
405 | + shutil.rmtree(self.tempdir) |
406 | + |
407 | + |
408 | +class OneZeroSourceExtractor(SourceExtractor): |
409 | + """Source extract for the "1.0" source format.""" |
410 | |
411 | def extract(self): |
412 | """Extract the package to a new temporary directory.""" |
413 | @@ -1495,20 +1531,15 @@ |
414 | self.unextracted_debian_md5 = part['md5sum'] |
415 | else: |
416 | if part['name'].endswith(".orig.tar.gz"): |
417 | - assert self.unextracted_upstream is None, "Two .orig.tar.gz?" |
418 | - self.unextracted_upstream = os.path.abspath( |
419 | + self.upstream_tarballs.append((os.path.abspath( |
420 | os.path.join(osutils.dirname(self.dsc_path), |
421 | - part['name'])) |
422 | - self.unextracted_upstream_md5 = part['md5sum'] |
423 | + part['name'])), part['md5sum'])) |
424 | elif part['name'].endswith(".diff.gz"): |
425 | self.unextracted_debian_md5 = part['md5sum'] |
426 | |
427 | - def cleanup(self): |
428 | - if os.path.exists(self.tempdir): |
429 | - shutil.rmtree(self.tempdir) |
430 | - |
431 | |
432 | class ThreeDotZeroNativeSourceExtractor(SourceExtractor): |
433 | + """Source extractor for the "3.0 (native)" source format.""" |
434 | |
435 | def extract(self): |
436 | self.tempdir = tempfile.mkdtemp() |
437 | @@ -1531,6 +1562,7 @@ |
438 | |
439 | |
440 | class ThreeDotZeroQuiltSourceExtractor(SourceExtractor): |
441 | + """Source extractor for the "3.0 (quilt)" source format.""" |
442 | |
443 | def extract(self): |
444 | self.tempdir = tempfile.mkdtemp() |
445 | @@ -1560,25 +1592,20 @@ |
446 | subprocess.call(["find", self.extracted_debianised, "-perm", |
447 | "0000", "-exec", "chmod", "644", "{}", ";"]) |
448 | for part in self.dsc['files']: |
449 | - if (re.search("\.orig-[^.]+\.tar\.(gz|bz2|lzma)$", part['name'])): |
450 | - raise MultipleUpstreamTarballsNotSupported() |
451 | - if (part['name'].endswith(".orig.tar.gz") |
452 | - or part['name'].endswith(".orig.tar.bz2")): |
453 | - assert self.unextracted_upstream is None, "Two .orig.tar.(gz|bz2)?" |
454 | - self.unextracted_upstream = os.path.abspath( |
455 | + if part['name'].startswith("%s_%s.orig" % (name, str(version.upstream_version))): |
456 | + self.upstream_tarballs.append((os.path.abspath( |
457 | os.path.join(osutils.dirname(self.dsc_path), |
458 | - part['name'])) |
459 | - self.unextracted_upstream_md5 = part['md5sum'] |
460 | + part['name'])), part['md5sum'])) |
461 | elif (part['name'].endswith(".debian.tar.gz") |
462 | or part['name'].endswith(".debian.tar.bz2")): |
463 | self.unextracted_debian_md5 = part['md5sum'] |
464 | - assert self.unextracted_upstream is not None, \ |
465 | + assert self.upstream_tarballs is not None, \ |
466 | "Can't handle non gz|bz2 tarballs yet" |
467 | assert self.unextracted_debian_md5 is not None, \ |
468 | "Can't handle non gz|bz2 tarballs yet" |
469 | |
470 | |
471 | SOURCE_EXTRACTORS = {} |
472 | -SOURCE_EXTRACTORS["1.0"] = SourceExtractor |
473 | +SOURCE_EXTRACTORS[FORMAT_1_0] = OneZeroSourceExtractor |
474 | SOURCE_EXTRACTORS[FORMAT_3_0_NATIVE] = ThreeDotZeroNativeSourceExtractor |
475 | SOURCE_EXTRACTORS[FORMAT_3_0_QUILT] = ThreeDotZeroQuiltSourceExtractor |
476 | |
477 | === modified file 'source_distiller.py' |
478 | --- source_distiller.py 2011-06-14 14:04:53 +0000 |
479 | +++ source_distiller.py 2011-06-15 02:38:47 +0000 |
480 | @@ -20,20 +20,15 @@ |
481 | import glob |
482 | import os |
483 | import shutil |
484 | -import subprocess |
485 | import tempfile |
486 | |
487 | from bzrlib import errors as bzr_errors |
488 | |
489 | -from bzrlib.plugins.builddeb.errors import ( |
490 | - MultipleUpstreamTarballsNotSupported, |
491 | - TarFailed, |
492 | - ) |
493 | from bzrlib.plugins.builddeb.util import ( |
494 | export, |
495 | + extract_orig_tarballs, |
496 | get_parent_dir, |
497 | recursive_copy, |
498 | - subprocess_setup, |
499 | ) |
500 | |
501 | |
502 | @@ -123,16 +118,10 @@ |
503 | os.makedirs(parent_dir) |
504 | if not self.use_existing: |
505 | tarballs = self.upstream_provider.provide(parent_dir) |
506 | - if len(tarballs) > 1: |
507 | - raise MultipleUpstreamTarballsNotSupported() |
508 | - tarball = tarballs[0] |
509 | # Extract it to the right place |
510 | tempdir = tempfile.mkdtemp(prefix='builddeb-merge-') |
511 | try: |
512 | - ret = subprocess.call(['tar', '-C', tempdir, '-xf', tarball], |
513 | - preexec_fn=subprocess_setup) |
514 | - if ret != 0: |
515 | - raise TarFailed("uncompress", tarball) |
516 | + extract_orig_tarballs(tarballs, tempdir) |
517 | files = glob.glob(tempdir+'/*') |
518 | # If everything is in a single dir then move everything up one |
519 | # level. |
520 | @@ -151,7 +140,7 @@ |
521 | tempdir = os.path.join(basetempdir,"export") |
522 | if self.larstiq: |
523 | os.makedirs(tempdir) |
524 | - export_dir = os.path.join(tempdir,'debian') |
525 | + export_dir = os.path.join(tempdir, 'debian') |
526 | else: |
527 | export_dir = tempdir |
528 | if self.is_working_tree: |
529 | |
530 | === modified file 'tests/blackbox/test_merge_upstream.py' |
531 | --- tests/blackbox/test_merge_upstream.py 2011-06-13 23:01:14 +0000 |
532 | +++ tests/blackbox/test_merge_upstream.py 2011-06-15 02:38:47 +0000 |
533 | @@ -30,6 +30,9 @@ |
534 | DistributionBranch, |
535 | DistributionBranchSet, |
536 | ) |
537 | +from bzrlib.plugins.builddeb.util import ( |
538 | + md5sum_filename, |
539 | + ) |
540 | |
541 | |
542 | class Fixture(object): |
543 | @@ -91,10 +94,11 @@ |
544 | upstream_tree=tree) |
545 | dbs = DistributionBranchSet() |
546 | dbs.add_branch(db) |
547 | - db.import_upstream_tarball(self.tar.tarball, str(self.tar.version), |
548 | - [tree.branch.last_revision()]) |
549 | + db.import_upstream_tarball( |
550 | + [(self.tar.tarball, md5sum_filename(self.tar.tarball))], str(self.tar.version), |
551 | + [tree.branch.last_revision()]) |
552 | package_builder = SourcePackageBuilder("foo", |
553 | - str(self.tar.version)+"-1") |
554 | + str(self.tar.version)+"-1") |
555 | package_builder.add_default_control() |
556 | package_builder.write_debian_files(branchpath) |
557 | tree.smart_add([tree.basedir]) |
558 | |
559 | === modified file 'tests/test_import_dsc.py' |
560 | --- tests/test_import_dsc.py 2011-06-10 11:47:25 +0000 |
561 | +++ tests/test_import_dsc.py 2011-06-15 02:38:47 +0000 |
562 | @@ -35,13 +35,10 @@ |
563 | tests, |
564 | ) |
565 | |
566 | -from bzrlib.plugins.builddeb.errors import ( |
567 | - MultipleUpstreamTarballsNotSupported, |
568 | - ) |
569 | from bzrlib.plugins.builddeb.import_dsc import ( |
570 | DistributionBranch, |
571 | DistributionBranchSet, |
572 | - SourceExtractor, |
573 | + OneZeroSourceExtractor, |
574 | SOURCE_EXTRACTORS, |
575 | ThreeDotZeroNativeSourceExtractor, |
576 | ThreeDotZeroQuiltSourceExtractor, |
577 | @@ -50,6 +47,9 @@ |
578 | BuilddebTestCase, |
579 | SourcePackageBuilder, |
580 | ) |
581 | +from bzrlib.plugins.builddeb.util import ( |
582 | + md5sum_filename, |
583 | + ) |
584 | |
585 | |
586 | class _PristineTarFeature(tests.Feature): |
587 | @@ -175,20 +175,27 @@ |
588 | db = self.db1 |
589 | version = "0.1" |
590 | self.assertFalse(db.has_upstream_version(version)) |
591 | - self.assertFalse(db.has_upstream_version(version, self.fake_md5_1)) |
592 | + self.assertFalse(db.has_upstream_version(version, |
593 | + [("foo.tar.gz", self.fake_md5_1)])) |
594 | self.do_commit_with_md5(self.up_tree1, "one", self.fake_md5_1) |
595 | db.tag_upstream_version(version) |
596 | self.assertTrue(db.has_upstream_version(version)) |
597 | - self.assertTrue(db.has_upstream_version(version, self.fake_md5_1)) |
598 | - self.assertFalse(db.has_upstream_version(version, self.fake_md5_2)) |
599 | + self.assertTrue(db.has_upstream_version( |
600 | + version, [("foo.tar.gz", self.fake_md5_1)])) |
601 | + self.assertFalse(db.has_upstream_version(version, |
602 | + [("foo.tar.gz", self.fake_md5_2)])) |
603 | version = "0.1" |
604 | self.assertTrue(db.has_upstream_version(version)) |
605 | - self.assertTrue(db.has_upstream_version(version, self.fake_md5_1)) |
606 | - self.assertFalse(db.has_upstream_version(version, self.fake_md5_2)) |
607 | + self.assertTrue(db.has_upstream_version(version, |
608 | + [("foo.tar.gz", self.fake_md5_1)])) |
609 | + self.assertFalse(db.has_upstream_version(version, |
610 | + [("foo.tar.gz", self.fake_md5_2)])) |
611 | version = "0.2" |
612 | self.assertFalse(db.has_upstream_version(version)) |
613 | - self.assertFalse(db.has_upstream_version(version, self.fake_md5_1)) |
614 | - self.assertFalse(db.has_upstream_version(version, self.fake_md5_2)) |
615 | + self.assertFalse(db.has_upstream_version(version, |
616 | + [("foo.tar.gz", self.fake_md5_1)])) |
617 | + self.assertFalse(db.has_upstream_version(version, |
618 | + [("foo.tar.gz", self.fake_md5_2)])) |
619 | |
620 | def test_revid_of_version(self): |
621 | db = self.db1 |
622 | @@ -633,46 +640,46 @@ |
623 | version2 = Version("0.2-1") |
624 | # With no versions tagged everything is None |
625 | branch = self.db2.branch_to_pull_upstream_from( |
626 | - version1.upstream_version, self.fake_md5_1) |
627 | + version1.upstream_version, [("foo.tar.gz", self.fake_md5_1)]) |
628 | self.assertEqual(branch, None) |
629 | branch = self.db2.branch_to_pull_upstream_from( |
630 | - version1.upstream_version, self.fake_md5_2) |
631 | + version1.upstream_version, [("foo.tar.gz", self.fake_md5_2)]) |
632 | self.assertEqual(branch, None) |
633 | branch = self.db1.branch_to_pull_upstream_from( |
634 | - version1.upstream_version, self.fake_md5_1) |
635 | + version1.upstream_version, [("foo.tar.gz", self.fake_md5_1)]) |
636 | self.assertEqual(branch, None) |
637 | self.do_commit_with_md5(self.up_tree1, "one", self.fake_md5_1) |
638 | self.db1.tag_upstream_version(version1.upstream_version) |
639 | # Version and md5 available, so we get the correct branch. |
640 | branch = self.db2.branch_to_pull_upstream_from( |
641 | - version1.upstream_version, self.fake_md5_1) |
642 | + version1.upstream_version, [("foo.tar.gz", self.fake_md5_1)]) |
643 | self.assertEqual(branch, self.db1) |
644 | # Otherwise (different version or md5) then we get None |
645 | branch = self.db2.branch_to_pull_upstream_from( |
646 | - version1.upstream_version, self.fake_md5_2) |
647 | - self.assertEqual(branch, None) |
648 | - branch = self.db2.branch_to_pull_upstream_from(version2.upstream_version, |
649 | - self.fake_md5_1) |
650 | - self.assertEqual(branch, None) |
651 | - branch = self.db2.branch_to_pull_upstream_from(version2.upstream_version, |
652 | - self.fake_md5_2) |
653 | + version1.upstream_version, [("foo.tar.gz", self.fake_md5_2)]) |
654 | + self.assertEqual(branch, None) |
655 | + branch = self.db2.branch_to_pull_upstream_from(version2.upstream_version, |
656 | + [("foo.tar.gz", self.fake_md5_1)]) |
657 | + self.assertEqual(branch, None) |
658 | + branch = self.db2.branch_to_pull_upstream_from(version2.upstream_version, |
659 | + [("foo.tar.gz", self.fake_md5_2)]) |
660 | self.assertEqual(branch, None) |
661 | # And we don't get a branch for the one that already has |
662 | # the version |
663 | branch = self.db1.branch_to_pull_upstream_from( |
664 | - version1.upstream_version, self.fake_md5_1) |
665 | + version1.upstream_version, [("foo.tar.gz", self.fake_md5_1)]) |
666 | self.assertEqual(branch, None) |
667 | self.up_tree2.pull(self.up_tree1.branch) |
668 | self.db2.tag_upstream_version(version1.upstream_version) |
669 | # And we get the greatest branch when two lesser branches |
670 | # have what we are looking for. |
671 | branch = self.db3.branch_to_pull_upstream_from( |
672 | - version1.upstream_version, self.fake_md5_1) |
673 | + version1.upstream_version, [("foo.tar.gz", self.fake_md5_1)]) |
674 | self.assertEqual(branch, self.db2) |
675 | # If the branches have diverged then we don't get a branch. |
676 | self.up_tree3.commit("three") |
677 | branch = self.db3.branch_to_pull_upstream_from( |
678 | - version1.upstream_version, self.fake_md5_1) |
679 | + version1.upstream_version, [("foo.tar.gz", self.fake_md5_1)]) |
680 | self.assertEqual(branch, None) |
681 | |
682 | def test_pull_from_lesser_branch_no_upstream(self): |
683 | @@ -764,8 +771,7 @@ |
684 | contents = [(basedir + '/' + element[0],) + element[1:] for |
685 | element in contents] |
686 | self.build_tree_contents(contents) |
687 | - self.db1.import_upstream(basedir, version.upstream_version, |
688 | - self.fake_md5_1, []) |
689 | + self.db1.import_upstream(basedir, version.upstream_version, []) |
690 | return version |
691 | |
692 | def test_import_upstream(self): |
693 | @@ -779,7 +785,7 @@ |
694 | rev = branch.repository.get_revision(rh[0]) |
695 | self.assertEqual(rev.message, |
696 | "Import upstream version %s" % str(version.upstream_version)) |
697 | - self.assertEqual(rev.properties['deb-md5'], self.fake_md5_1) |
698 | + self.assertEqual(rev.properties.get('deb-md5'), None) |
699 | |
700 | def test_import_upstream_preserves_dot_bzrignore(self): |
701 | self.import_a_tree([('',), ('.bzrignore', '')]) |
702 | @@ -799,15 +805,13 @@ |
703 | write_to_file(os.path.join(basedir, "README"), "Hi\n") |
704 | write_to_file(os.path.join(basedir, "BUGS"), "") |
705 | write_to_file(os.path.join(basedir, "COPYING"), "") |
706 | - self.db1.import_upstream(basedir, version1.upstream_version, |
707 | - self.fake_md5_1, []) |
708 | + self.db1.import_upstream(basedir, version1.upstream_version, []) |
709 | basedir = name + "-" + str(version2.upstream_version) |
710 | os.mkdir(basedir) |
711 | write_to_file(os.path.join(basedir, "README"), "Now even better\n") |
712 | write_to_file(os.path.join(basedir, "BUGS"), "") |
713 | write_to_file(os.path.join(basedir, "NEWS"), "") |
714 | - self.db1.import_upstream(basedir, version2.upstream_version, |
715 | - self.fake_md5_2, |
716 | + self.db1.import_upstream(basedir, version2.upstream_version, |
717 | [self.up_tree1.branch.last_revision()]) |
718 | tree = self.up_tree1 |
719 | branch = tree.branch |
720 | @@ -817,7 +821,7 @@ |
721 | rev = branch.repository.get_revision(rh[1]) |
722 | self.assertEqual(rev.message, |
723 | "Import upstream version %s" % str(version2.upstream_version)) |
724 | - self.assertEqual(rev.properties['deb-md5'], self.fake_md5_2) |
725 | + self.assertIs(rev.properties.get('deb-md5'), None) |
726 | rev_tree1 = branch.repository.revision_tree(rh[0]) |
727 | rev_tree2 = branch.repository.revision_tree(rh[1]) |
728 | changes = rev_tree2.changes_from(rev_tree1) |
729 | @@ -838,8 +842,8 @@ |
730 | tf.add(basedir) |
731 | finally: |
732 | tf.close() |
733 | - self.db1.import_upstream(basedir, version.upstream_version, |
734 | - self.fake_md5_1, [], upstream_tarball=os.path.abspath(tar_path)) |
735 | + self.db1.import_upstream(basedir, version.upstream_version, [], |
736 | + upstream_tarballs=[(os.path.abspath(tar_path), self.fake_md5_1)]) |
737 | tree = self.up_tree1 |
738 | branch = tree.branch |
739 | rh = branch.revision_history() |
740 | @@ -866,8 +870,8 @@ |
741 | tf.add(basedir) |
742 | finally: |
743 | tf.close() |
744 | - self.db1.import_upstream(basedir, version.upstream_version, |
745 | - self.fake_md5_1, [], upstream_tarball=os.path.abspath(tar_path)) |
746 | + self.db1.import_upstream(basedir, version.upstream_version, |
747 | + [], upstream_tarballs=[(os.path.abspath(tar_path), self.fake_md5_1)]) |
748 | tree = self.up_tree1 |
749 | branch = tree.branch |
750 | rh = branch.revision_history() |
751 | @@ -1496,7 +1500,7 @@ |
752 | tf.add("a") |
753 | finally: |
754 | tf.close() |
755 | - conflicts = db.merge_upstream(tarball_filename, "foo", "0.2", "0.1") |
756 | + conflicts = db.merge_upstream([tarball_filename], "foo", "0.2", "0.1") |
757 | self.assertEqual(0, conflicts) |
758 | |
759 | def test_merge_upstream_initial_with_branch(self): |
760 | @@ -1533,7 +1537,7 @@ |
761 | tf.add("a") |
762 | finally: |
763 | tf.close() |
764 | - conflicts = db.merge_upstream(tarball_filename, "foo", "0.2", "0.1", |
765 | + conflicts = db.merge_upstream([tarball_filename], "foo", "0.2", "0.1", |
766 | upstream_branch=upstream_tree.branch, |
767 | upstream_revision=upstream_rev) |
768 | self.assertEqual(0, conflicts) |
769 | @@ -1573,7 +1577,7 @@ |
770 | tf.add("a") |
771 | finally: |
772 | tf.close() |
773 | - conflicts = db.merge_upstream(tarball_filename, "foo", "0.2", "0.1", |
774 | + conflicts = db.merge_upstream([tarball_filename], "foo", "0.2", "0.1", |
775 | upstream_branch=upstream_tree.branch, |
776 | upstream_revision=upstream_rev) |
777 | # ./debian conflicts. |
778 | @@ -1614,7 +1618,7 @@ |
779 | dbs.add_branch(db) |
780 | tree.lock_write() |
781 | self.addCleanup(tree.unlock) |
782 | - db.merge_upstream(builder.tar_name(), "package", str(version2), |
783 | + db.merge_upstream([builder.tar_name()], "package", str(version2), |
784 | version1.upstream_version, |
785 | upstream_branch=upstream_tree.branch, |
786 | upstream_revision=upstream_rev) |
787 | @@ -1653,7 +1657,7 @@ |
788 | tf.add("a") |
789 | finally: |
790 | tf.close() |
791 | - conflicts = db.merge_upstream(tarball_filename, "package", "0.2-1", |
792 | + conflicts = db.merge_upstream([tarball_filename], "package", "0.2-1", |
793 | "0.1") |
794 | # Check that we tagged wiht the dash version |
795 | self.assertTrue(tree.branch.tags.has_tag('upstream-0.2-1')) |
796 | @@ -1692,7 +1696,7 @@ |
797 | # We don't add the new file upstream, as the new file id would |
798 | # be picked up from there. |
799 | upstream_rev2 = upstream_tree.commit("two") |
800 | - db.merge_upstream(builder.tar_name(), "package", |
801 | + db.merge_upstream([builder.tar_name()], "package", |
802 | version2.upstream_version, |
803 | version1.upstream_version, |
804 | upstream_branch=upstream_tree.branch, |
805 | @@ -1729,7 +1733,7 @@ |
806 | # We don't add the new file upstream, as the new file id would |
807 | # be picked up from there. |
808 | upstream_rev2 = upstream_tree.commit("two") |
809 | - db.merge_upstream(builder.tar_name(), "package", |
810 | + db.merge_upstream([builder.tar_name()], "package", |
811 | version2.upstream_version, |
812 | version1.upstream_version, |
813 | upstream_branch=upstream_tree.branch, |
814 | @@ -1762,7 +1766,7 @@ |
815 | builder.add_upstream_file("a", "New a") |
816 | builder.add_upstream_file("b", "Renamed a") |
817 | builder.build() |
818 | - db.merge_upstream(builder.tar_name(), "packaging", |
819 | + db.merge_upstream([builder.tar_name()], "packaging", |
820 | version2.upstream_version, version1.upstream_version) |
821 | self.assertEqual("a-id", packaging_tree.path2id("b")) |
822 | self.assertEqual("other-a-id", packaging_tree.path2id("a")) |
823 | @@ -1778,7 +1782,7 @@ |
824 | self.db1.import_package(builder.dsc_name()) |
825 | |
826 | |
827 | -class SourceExtractorTests(tests.TestCaseInTempDir): |
828 | +class OneZeroSourceExtractorTests(tests.TestCaseInTempDir): |
829 | |
830 | def test_extract_format1(self): |
831 | version = Version("0.1-1") |
832 | @@ -1789,8 +1793,8 @@ |
833 | builder.add_default_control() |
834 | builder.build() |
835 | dsc = deb822.Dsc(open(builder.dsc_name()).read()) |
836 | - self.assertEqual(SourceExtractor, SOURCE_EXTRACTORS[dsc['Format']]) |
837 | - extractor = SourceExtractor(builder.dsc_name(), dsc) |
838 | + self.assertEqual(OneZeroSourceExtractor, SOURCE_EXTRACTORS[dsc['Format']]) |
839 | + extractor = OneZeroSourceExtractor(builder.dsc_name(), dsc) |
840 | try: |
841 | extractor.extract() |
842 | unpacked_dir = extractor.extracted_debianised |
843 | @@ -1805,7 +1809,7 @@ |
844 | "README"))) |
845 | self.assertFalse(os.path.exists(os.path.join(orig_dir, |
846 | "debian", "control"))) |
847 | - self.assertTrue(os.path.exists(extractor.unextracted_upstream)) |
848 | + self.assertTrue(os.path.exists(extractor.upstream_tarballs[0][0])) |
849 | finally: |
850 | extractor.cleanup() |
851 | |
852 | @@ -1818,8 +1822,8 @@ |
853 | builder.add_default_control() |
854 | builder.build() |
855 | dsc = deb822.Dsc(open(builder.dsc_name()).read()) |
856 | - self.assertEqual(SourceExtractor, SOURCE_EXTRACTORS[dsc['Format']]) |
857 | - extractor = SourceExtractor(builder.dsc_name(), dsc) |
858 | + self.assertEqual(OneZeroSourceExtractor, SOURCE_EXTRACTORS[dsc['Format']]) |
859 | + extractor = OneZeroSourceExtractor(builder.dsc_name(), dsc) |
860 | try: |
861 | extractor.extract() |
862 | unpacked_dir = extractor.extracted_debianised |
863 | @@ -1886,7 +1890,7 @@ |
864 | "README"))) |
865 | self.assertFalse(os.path.exists(os.path.join(orig_dir, |
866 | "debian", "control"))) |
867 | - self.assertTrue(os.path.exists(extractor.unextracted_upstream)) |
868 | + self.assertTrue(os.path.exists(extractor.upstream_tarballs[0][0])) |
869 | finally: |
870 | extractor.cleanup() |
871 | |
872 | @@ -1916,7 +1920,7 @@ |
873 | "README"))) |
874 | self.assertFalse(os.path.exists(os.path.join(orig_dir, |
875 | "debian", "control"))) |
876 | - self.assertTrue(os.path.exists(extractor.unextracted_upstream)) |
877 | + self.assertTrue(os.path.exists(extractor.upstream_tarballs[0][0])) |
878 | finally: |
879 | extractor.cleanup() |
880 | |
881 | @@ -1936,4 +1940,4 @@ |
882 | SOURCE_EXTRACTORS[dsc['Format']]) |
883 | extractor = ThreeDotZeroQuiltSourceExtractor(builder.dsc_name(), dsc) |
884 | self.addCleanup(extractor.cleanup) |
885 | - self.assertRaises(MultipleUpstreamTarballsNotSupported, extractor.extract) |
886 | + self.assertEquals([], extractor.upstream_tarballs) |
887 | |
888 | === modified file 'util.py' |
889 | --- util.py 2011-06-09 12:13:13 +0000 |
890 | +++ util.py 2011-06-15 02:38:47 +0000 |
891 | @@ -24,6 +24,7 @@ |
892 | import md5 |
893 | import signal |
894 | import shutil |
895 | +import subprocess |
896 | import tempfile |
897 | import os |
898 | import re |
899 | @@ -65,7 +66,9 @@ |
900 | MissingChangelogError, |
901 | AddChangelogError, |
902 | InconsistentSourceFormatError, |
903 | + MultipleUpstreamTarballsNotSupported, |
904 | NoPreviousUpload, |
905 | + TarFailed, |
906 | UnableToFindPreviousUpload, |
907 | UnparseableChangelog, |
908 | ) |
909 | @@ -682,4 +685,24 @@ |
910 | return BUILD_TYPE_NORMAL |
911 | |
912 | |
913 | +def extract_orig_tarballs(tarballs, target, strip_components=None): |
914 | + """Extract orig tarballs to a directory. |
915 | |
916 | + :param tarballs: List of tarball filenames |
917 | + :param target: Target directory (must already exist) |
918 | + """ |
919 | + if len(tarballs) != 1: |
920 | + raise MultipleUpstreamTarballsNotSupported() |
921 | + tarball_filename = tarballs[0] |
922 | + tar_args = ["tar"] |
923 | + if tarball_filename.endswith(".tar.bz2"): |
924 | + tar_args.append('xjf') |
925 | + else: |
926 | + tar_args.append('xzf') |
927 | + tar_args.extend([tarball_filename, "-C", target]) |
928 | + if strip_components is not None: |
929 | + tar_args.extend(["--strip-components", "1"]) |
930 | + proc = subprocess.Popen(tar_args, preexec_fn=subprocess_setup) |
931 | + proc.communicate() |
932 | + if proc.returncode != 0: |
933 | + raise TarFailed("extract", tarball_filename) |
62 + db.import_ upstream_ tarball( tarball_ filenames, version, parents)
Should this perhaps be import_ upstream_ tarballs now?
Thanks,
James