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

Proposed by Jelmer Vernooij
Status: Merged
Approved by: James Westby
Approved revision: 625
Merged at revision: 628
Proposed branch: lp:~jelmer/bzr-builddeb/multiple-upstream-tarballs
Merge into: lp:bzr-builddeb
Prerequisite: lp:~jelmer/bzr-builddeb/upstream-parents-per-component
Diff against target: 258 lines (+62/-26)
6 files modified
cmds.py (+1/-1)
debian/changelog (+7/-0)
import_dsc.py (+6/-1)
upstream/__init__.py (+11/-9)
upstream/branch.py (+1/-1)
upstream/pristinetar.py (+36/-14)
To merge this branch: bzr merge lp:~jelmer/bzr-builddeb/multiple-upstream-tarballs
Reviewer Review Type Date Requested Status
Bzr-builddeb-hackers Pending
Review via email: mp+77893@code.launchpad.net

This proposal supersedes a proposal from 2011-09-27.

Description of the change

Importing and building of packages with multiple upstream tarballs now works.

There are still two caveats:

 * when exporting the base component before generating a pristine tar delta, we don't exclude non-base components. This probably causes the pristine tar delta to be bigger than it needs to be
 * Needs more tests

To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'cmds.py'
--- cmds.py 2011-10-03 10:49:43 +0000
+++ cmds.py 2011-10-03 10:49:43 +0000
@@ -748,7 +748,7 @@
748 if need_upstream_tarball:748 if need_upstream_tarball:
749 target_dir = tempfile.mkdtemp() # FIXME: Cleanup?749 target_dir = tempfile.mkdtemp() # FIXME: Cleanup?
750 locations = primary_upstream_source.fetch_tarballs(750 locations = primary_upstream_source.fetch_tarballs(
751 package, version, target_dir)751 package, version, target_dir, components=[None])
752 source_format = get_source_format(tree)752 source_format = get_source_format(tree)
753 v3 = (source_format in [753 v3 = (source_format in [
754 FORMAT_3_0_QUILT, FORMAT_3_0_NATIVE])754 FORMAT_3_0_QUILT, FORMAT_3_0_NATIVE])
755755
=== modified file 'debian/changelog'
--- debian/changelog 2011-10-01 20:41:14 +0000
+++ debian/changelog 2011-10-03 10:49:43 +0000
@@ -1,3 +1,10 @@
1bzr-builddeb (2.7.10) UNRELEASED; urgency=low
2
3 * Support importing and building packages with multiple upstream
4 tarballs. LP: #653757, LP: #664834
5
6 -- Jelmer Vernooij <jelmer@debian.org> Tue, 27 Sep 2011 02:40:03 +0200
7
1bzr-builddeb (2.7.9) unstable; urgency=low8bzr-builddeb (2.7.9) unstable; urgency=low
29
3 [ Jelmer Vernooij ]10 [ Jelmer Vernooij ]
411
=== modified file 'import_dsc.py'
--- import_dsc.py 2011-10-03 10:49:43 +0000
+++ import_dsc.py 2011-10-03 10:49:43 +0000
@@ -878,9 +878,14 @@
878 target_tree=target_tree)878 target_tree=target_tree)
879 finally:879 finally:
880 self_tree.unlock()880 self_tree.unlock()
881 if component is None:
882 exclude = [tb[1] for tb in upstream_tarballs if tb[1] is not None]
883 else:
884 exclude = []
881 (tag, revid) = self.pristine_upstream_source.import_component_tarball(885 (tag, revid) = self.pristine_upstream_source.import_component_tarball(
882 package, version, self.pristine_upstream_tree, parents,886 package, version, self.pristine_upstream_tree, parents,
883 component, md5, tarball, author=author, timestamp=timestamp)887 component, md5, tarball, author=author, timestamp=timestamp,
888 exclude=exclude)
884 self.pristine_upstream_branch.generate_revision_history(revid)889 self.pristine_upstream_branch.generate_revision_history(revid)
885 ret.append((component, tag, revid))890 ret.append((component, tag, revid))
886 self.branch.fetch(self.pristine_upstream_branch)891 self.branch.fetch(self.pristine_upstream_branch)
887892
=== modified file 'upstream/__init__.py'
--- upstream/__init__.py 2011-10-03 10:49:43 +0000
+++ upstream/__init__.py 2011-10-03 10:49:43 +0000
@@ -95,12 +95,14 @@
95 """95 """
96 raise NotImplementedError(self.has_version)96 raise NotImplementedError(self.has_version)
9797
98 def fetch_tarballs(self, package, version, target_dir):98 def fetch_tarballs(self, package, version, target_dir, components=None):
99 """Fetch the source tarball for a particular version.99 """Fetch the source tarball for a particular version.
100100
101 :param package: Name of the package101 :param package: Name of the package
102 :param version: Version string of the version to fetch102 :param version: Version string of the version to fetch
103 :param target_dir: Directory in which to store the tarball103 :param target_dir: Directory in which to store the tarball
104 :param components: List of component names to fetch; may be None,
105 in which case the backend will have to find out.
104 :return: Paths of the fetched tarballs106 :return: Paths of the fetched tarballs
105 """107 """
106 raise NotImplementedError(self.fetch_tarballs)108 raise NotImplementedError(self.fetch_tarballs)
@@ -114,7 +116,7 @@
114 """Upstream source that uses apt-source."""116 """Upstream source that uses apt-source."""
115117
116 def fetch_tarballs(self, package, upstream_version, target_dir,118 def fetch_tarballs(self, package, upstream_version, target_dir,
117 _apt_pkg=None):119 _apt_pkg=None, components=None):
118 if _apt_pkg is None:120 if _apt_pkg is None:
119 import apt_pkg121 import apt_pkg
120 else:122 else:
@@ -198,7 +200,7 @@
198 note("get-orig-source did not create file with prefix %s", prefix)200 note("get-orig-source did not create file with prefix %s", prefix)
199 return None201 return None
200202
201 def fetch_tarballs(self, package, version, target_dir):203 def fetch_tarballs(self, package, version, target_dir, components=None):
202 if self.top_level:204 if self.top_level:
203 rules_name = 'rules'205 rules_name = 'rules'
204 else:206 else:
@@ -280,7 +282,7 @@
280 os.unlink(tempfilename)282 os.unlink(tempfilename)
281 return self._xml_report_extract_upstream_version(stdout)283 return self._xml_report_extract_upstream_version(stdout)
282284
283 def fetch_tarballs(self, package, version, target_dir):285 def fetch_tarballs(self, package, version, target_dir, components=None):
284 note("Using uscan to look for the upstream tarball.")286 note("Using uscan to look for the upstream tarball.")
285 try:287 try:
286 tempfilename = self._export_watchfile()288 tempfilename = self._export_watchfile()
@@ -327,7 +329,7 @@
327 finally:329 finally:
328 shutil.rmtree(tmpdir)330 shutil.rmtree(tmpdir)
329331
330 def fetch_tarballs(self, package, version, target_dir):332 def fetch_tarballs(self, package, version, target_dir, components=None):
331 note("Using the current branch without the 'debian' directory "333 note("Using the current branch without the 'debian' directory "
332 "to create the tarball")334 "to create the tarball")
333 tarball_path = self._tarball_path(package, version, None, target_dir)335 tarball_path = self._tarball_path(package, version, None, target_dir)
@@ -347,10 +349,10 @@
347 def __repr__(self):349 def __repr__(self):
348 return "%s(%r)" % (self.__class__.__name__, self._sources)350 return "%s(%r)" % (self.__class__.__name__, self._sources)
349351
350 def fetch_tarballs(self, package, version, target_dir):352 def fetch_tarballs(self, package, version, target_dir, components=None):
351 for source in self._sources:353 for source in self._sources:
352 try:354 try:
353 paths = source.fetch_tarballs(package, version, target_dir)355 paths = source.fetch_tarballs(package, version, target_dir, components)
354 except PackageVersionNotPresent:356 except PackageVersionNotPresent:
355 pass357 pass
356 else:358 else:
@@ -497,7 +499,7 @@
497 self.path = path499 self.path = path
498 self.version = version500 self.version = version
499501
500 def fetch_tarballs(self, package, version, target_dir):502 def fetch_tarballs(self, package, version, target_dir, components=None):
501 if version != self.version:503 if version != self.version:
502 raise PackageVersionNotPresent(package, version, self)504 raise PackageVersionNotPresent(package, version, self)
503 dest_name = new_tarball_name(package, version, self.path)505 dest_name = new_tarball_name(package, version, self.path)
@@ -542,7 +544,7 @@
542 else:544 else:
543 self.project = project545 self.project = project
544546
545 def fetch_tarballs(self, package, version, target_dir):547 def fetch_tarballs(self, package, version, target_dir, components=None):
546 release = self.project.getRelease(version=version)548 release = self.project.getRelease(version=version)
547 if release is None:549 if release is None:
548 raise PackageVersionNotPresent(package, version, self)550 raise PackageVersionNotPresent(package, version, self)
549551
=== modified file 'upstream/branch.py'
--- upstream/branch.py 2011-10-03 10:49:43 +0000
+++ upstream/branch.py 2011-10-03 10:49:43 +0000
@@ -264,7 +264,7 @@
264 finally:264 finally:
265 self.upstream_branch.unlock()265 self.upstream_branch.unlock()
266266
267 def fetch_tarballs(self, package, version, target_dir):267 def fetch_tarballs(self, package, version, target_dir, components=None):
268 self.upstream_branch.lock_read()268 self.upstream_branch.lock_read()
269 try:269 try:
270 revid = self.version_as_revision(package, version)270 revid = self.version_as_revision(package, version)
271271
=== modified file 'upstream/pristinetar.py'
--- upstream/pristinetar.py 2011-10-03 10:49:43 +0000
+++ upstream/pristinetar.py 2011-10-03 10:49:43 +0000
@@ -171,14 +171,24 @@
171 :param component: Component name (None for base)171 :param component: Component name (None for base)
172 :param exclude: Exclude directories172 :param exclude: Exclude directories
173 """173 """
174 if exclude is not None or subdir is not None:
175 raise NotImplementedError
176 if exclude is None:174 if exclude is None:
177 exclude = []175 exclude = []
176 def include_change(c):
177 if not exclude:
178 return True
179 path = c[1][1]
180 if path is None:
181 return True
182 for e in exclude:
183 if path == e or path.startswith(e+"/"):
184 return False
185 else:
186 return True
178 revprops = {}187 revprops = {}
179 if md5 is not None:188 if md5 is not None:
180 revprops["deb-md5"] = md5189 revprops["deb-md5"] = md5
181 delta = self.make_pristine_tar_delta(tree, tarball, subdir=subdir)190 delta = self.make_pristine_tar_delta(tree, tarball, subdir=subdir,
191 exclude=exclude)
182 uuencoded = standard_b64encode(delta)192 uuencoded = standard_b64encode(delta)
183 if tarball.endswith(".tar.bz2"):193 if tarball.endswith(".tar.bz2"):
184 revprops["deb-pristine-delta-bz2"] = uuencoded194 revprops["deb-pristine-delta-bz2"] = uuencoded
@@ -206,8 +216,9 @@
206 revprops=revprops, timestamp=timestamp, timezone=timezone)216 revprops=revprops, timestamp=timestamp, timezone=timezone)
207 builder.will_record_deletes()217 builder.will_record_deletes()
208 try:218 try:
209 list(builder.record_iter_changes(tree, base_revid,219 changes = [c for c in tree.iter_changes(basis_tree) if
210 tree.iter_changes(basis_tree)))220 include_change(c)]
221 list(builder.record_iter_changes(tree, base_revid, changes))
211 builder.finish_inventory()222 builder.finish_inventory()
212 except:223 except:
213 builder.abort()224 builder.abort()
@@ -228,13 +239,13 @@
228 rev = self.branch.repository.get_revision(revid)239 rev = self.branch.repository.get_revision(revid)
229 except NoSuchRevision:240 except NoSuchRevision:
230 raise PackageVersionNotPresent(package, version, self)241 raise PackageVersionNotPresent(package, version, self)
231 note("Using pristine-tar to reconstruct the needed tarball.")
232 if self.has_pristine_tar_delta(rev):242 if self.has_pristine_tar_delta(rev):
233 format = self.pristine_tar_format(rev)243 format = self.pristine_tar_format(rev)
234 else:244 else:
235 format = 'gz'245 format = 'gz'
236 target_filename = self._tarball_path(package, version, component,246 target_filename = self._tarball_path(package, version, component,
237 target_dir, format=format)247 target_dir, format=format)
248 note("Using pristine-tar to reconstruct %s.", os.path.basename(target_filename))
238 try:249 try:
239 self.reconstruct_pristine_tar(revid, package, version, target_filename)250 self.reconstruct_pristine_tar(revid, package, version, target_filename)
240 except PristineTarError:251 except PristineTarError:
@@ -243,8 +254,15 @@
243 raise PackageVersionNotPresent(package, version, self)254 raise PackageVersionNotPresent(package, version, self)
244 return target_filename255 return target_filename
245256
246 def fetch_tarballs(self, package, version, target_dir):257 def fetch_tarballs(self, package, version, target_dir, components=None):
247 return [self.fetch_component_tarball(package, version, None, target_dir)]258 if components is None:
259 # Scan tags for components
260 try:
261 components = self._components_by_version()[version].keys()
262 except KeyError:
263 raise PackageVersionNotPresent(package, version, self)
264 return [self.fetch_component_tarball(package, version, component, target_dir)
265 for component in components]
248266
249 def _has_revision(self, revid, md5=None):267 def _has_revision(self, revid, md5=None):
250 self.branch.lock_read()268 self.branch.lock_read()
@@ -370,7 +388,7 @@
370 finally:388 finally:
371 shutil.rmtree(tmpdir)389 shutil.rmtree(tmpdir)
372390
373 def make_pristine_tar_delta(self, tree, tarball_path, subdir=None):391 def make_pristine_tar_delta(self, tree, tarball_path, subdir=None, exclude=None):
374 tmpdir = tempfile.mkdtemp(prefix="builddeb-pristine-")392 tmpdir = tempfile.mkdtemp(prefix="builddeb-pristine-")
375 try:393 try:
376 dest = os.path.join(tmpdir, "orig")394 dest = os.path.join(tmpdir, "orig")
@@ -385,17 +403,21 @@
385 finally:403 finally:
386 shutil.rmtree(tmpdir)404 shutil.rmtree(tmpdir)
387405
388 def iter_versions(self):406 def _components_by_version(self):
389 """Iterate over all upstream versions.
390
391 :return: Iterator over (tag_name, version, revid) tuples
392 """
393 ret = {}407 ret = {}
394 for tag_name, tag_revid in self.branch.tags.get_tag_dict().iteritems():408 for tag_name, tag_revid in self.branch.tags.get_tag_dict().iteritems():
395 if not is_upstream_tag(tag_name):409 if not is_upstream_tag(tag_name):
396 continue410 continue
397 (component, version) = upstream_tag_version(tag_name)411 (component, version) = upstream_tag_version(tag_name)
398 ret.setdefault(version, {})[component] = tag_revid412 ret.setdefault(version, {})[component] = tag_revid
413 return ret
414
415 def iter_versions(self):
416 """Iterate over all upstream versions.
417
418 :return: Iterator over (tag_name, version, revid) tuples
419 """
420 ret = self._components_by_version()
399 return ret.iteritems()421 return ret.iteritems()
400422
401423

Subscribers

People subscribed via source and target branches