Merge lp:~jelmer/bzr-builddeb/multiple-upstream-tarballs-pt2 into lp:bzr-builddeb

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
Reviewer Review Type Date Requested Status
Bzr-builddeb-hackers Pending
Review via email: mp+64626@code.launchpad.net

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 :

62 + db.import_upstream_tarball(tarball_filenames, version, parents)

Should this perhaps be import_upstream_tarballs now?

Thanks,

James

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)

Subscribers

People subscribed via source and target branches