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
1=== modified file 'cmds.py'
2--- cmds.py 2011-10-03 10:49:43 +0000
3+++ cmds.py 2011-10-03 10:49:43 +0000
4@@ -748,7 +748,7 @@
5 if need_upstream_tarball:
6 target_dir = tempfile.mkdtemp() # FIXME: Cleanup?
7 locations = primary_upstream_source.fetch_tarballs(
8- package, version, target_dir)
9+ package, version, target_dir, components=[None])
10 source_format = get_source_format(tree)
11 v3 = (source_format in [
12 FORMAT_3_0_QUILT, FORMAT_3_0_NATIVE])
13
14=== modified file 'debian/changelog'
15--- debian/changelog 2011-10-01 20:41:14 +0000
16+++ debian/changelog 2011-10-03 10:49:43 +0000
17@@ -1,3 +1,10 @@
18+bzr-builddeb (2.7.10) UNRELEASED; urgency=low
19+
20+ * Support importing and building packages with multiple upstream
21+ tarballs. LP: #653757, LP: #664834
22+
23+ -- Jelmer Vernooij <jelmer@debian.org> Tue, 27 Sep 2011 02:40:03 +0200
24+
25 bzr-builddeb (2.7.9) unstable; urgency=low
26
27 [ Jelmer Vernooij ]
28
29=== modified file 'import_dsc.py'
30--- import_dsc.py 2011-10-03 10:49:43 +0000
31+++ import_dsc.py 2011-10-03 10:49:43 +0000
32@@ -878,9 +878,14 @@
33 target_tree=target_tree)
34 finally:
35 self_tree.unlock()
36+ if component is None:
37+ exclude = [tb[1] for tb in upstream_tarballs if tb[1] is not None]
38+ else:
39+ exclude = []
40 (tag, revid) = self.pristine_upstream_source.import_component_tarball(
41 package, version, self.pristine_upstream_tree, parents,
42- component, md5, tarball, author=author, timestamp=timestamp)
43+ component, md5, tarball, author=author, timestamp=timestamp,
44+ exclude=exclude)
45 self.pristine_upstream_branch.generate_revision_history(revid)
46 ret.append((component, tag, revid))
47 self.branch.fetch(self.pristine_upstream_branch)
48
49=== modified file 'upstream/__init__.py'
50--- upstream/__init__.py 2011-10-03 10:49:43 +0000
51+++ upstream/__init__.py 2011-10-03 10:49:43 +0000
52@@ -95,12 +95,14 @@
53 """
54 raise NotImplementedError(self.has_version)
55
56- def fetch_tarballs(self, package, version, target_dir):
57+ def fetch_tarballs(self, package, version, target_dir, components=None):
58 """Fetch the source tarball for a particular version.
59
60 :param package: Name of the package
61 :param version: Version string of the version to fetch
62 :param target_dir: Directory in which to store the tarball
63+ :param components: List of component names to fetch; may be None,
64+ in which case the backend will have to find out.
65 :return: Paths of the fetched tarballs
66 """
67 raise NotImplementedError(self.fetch_tarballs)
68@@ -114,7 +116,7 @@
69 """Upstream source that uses apt-source."""
70
71 def fetch_tarballs(self, package, upstream_version, target_dir,
72- _apt_pkg=None):
73+ _apt_pkg=None, components=None):
74 if _apt_pkg is None:
75 import apt_pkg
76 else:
77@@ -198,7 +200,7 @@
78 note("get-orig-source did not create file with prefix %s", prefix)
79 return None
80
81- def fetch_tarballs(self, package, version, target_dir):
82+ def fetch_tarballs(self, package, version, target_dir, components=None):
83 if self.top_level:
84 rules_name = 'rules'
85 else:
86@@ -280,7 +282,7 @@
87 os.unlink(tempfilename)
88 return self._xml_report_extract_upstream_version(stdout)
89
90- def fetch_tarballs(self, package, version, target_dir):
91+ def fetch_tarballs(self, package, version, target_dir, components=None):
92 note("Using uscan to look for the upstream tarball.")
93 try:
94 tempfilename = self._export_watchfile()
95@@ -327,7 +329,7 @@
96 finally:
97 shutil.rmtree(tmpdir)
98
99- def fetch_tarballs(self, package, version, target_dir):
100+ def fetch_tarballs(self, package, version, target_dir, components=None):
101 note("Using the current branch without the 'debian' directory "
102 "to create the tarball")
103 tarball_path = self._tarball_path(package, version, None, target_dir)
104@@ -347,10 +349,10 @@
105 def __repr__(self):
106 return "%s(%r)" % (self.__class__.__name__, self._sources)
107
108- def fetch_tarballs(self, package, version, target_dir):
109+ def fetch_tarballs(self, package, version, target_dir, components=None):
110 for source in self._sources:
111 try:
112- paths = source.fetch_tarballs(package, version, target_dir)
113+ paths = source.fetch_tarballs(package, version, target_dir, components)
114 except PackageVersionNotPresent:
115 pass
116 else:
117@@ -497,7 +499,7 @@
118 self.path = path
119 self.version = version
120
121- def fetch_tarballs(self, package, version, target_dir):
122+ def fetch_tarballs(self, package, version, target_dir, components=None):
123 if version != self.version:
124 raise PackageVersionNotPresent(package, version, self)
125 dest_name = new_tarball_name(package, version, self.path)
126@@ -542,7 +544,7 @@
127 else:
128 self.project = project
129
130- def fetch_tarballs(self, package, version, target_dir):
131+ def fetch_tarballs(self, package, version, target_dir, components=None):
132 release = self.project.getRelease(version=version)
133 if release is None:
134 raise PackageVersionNotPresent(package, version, self)
135
136=== modified file 'upstream/branch.py'
137--- upstream/branch.py 2011-10-03 10:49:43 +0000
138+++ upstream/branch.py 2011-10-03 10:49:43 +0000
139@@ -264,7 +264,7 @@
140 finally:
141 self.upstream_branch.unlock()
142
143- def fetch_tarballs(self, package, version, target_dir):
144+ def fetch_tarballs(self, package, version, target_dir, components=None):
145 self.upstream_branch.lock_read()
146 try:
147 revid = self.version_as_revision(package, version)
148
149=== modified file 'upstream/pristinetar.py'
150--- upstream/pristinetar.py 2011-10-03 10:49:43 +0000
151+++ upstream/pristinetar.py 2011-10-03 10:49:43 +0000
152@@ -171,14 +171,24 @@
153 :param component: Component name (None for base)
154 :param exclude: Exclude directories
155 """
156- if exclude is not None or subdir is not None:
157- raise NotImplementedError
158 if exclude is None:
159 exclude = []
160+ def include_change(c):
161+ if not exclude:
162+ return True
163+ path = c[1][1]
164+ if path is None:
165+ return True
166+ for e in exclude:
167+ if path == e or path.startswith(e+"/"):
168+ return False
169+ else:
170+ return True
171 revprops = {}
172 if md5 is not None:
173 revprops["deb-md5"] = md5
174- delta = self.make_pristine_tar_delta(tree, tarball, subdir=subdir)
175+ delta = self.make_pristine_tar_delta(tree, tarball, subdir=subdir,
176+ exclude=exclude)
177 uuencoded = standard_b64encode(delta)
178 if tarball.endswith(".tar.bz2"):
179 revprops["deb-pristine-delta-bz2"] = uuencoded
180@@ -206,8 +216,9 @@
181 revprops=revprops, timestamp=timestamp, timezone=timezone)
182 builder.will_record_deletes()
183 try:
184- list(builder.record_iter_changes(tree, base_revid,
185- tree.iter_changes(basis_tree)))
186+ changes = [c for c in tree.iter_changes(basis_tree) if
187+ include_change(c)]
188+ list(builder.record_iter_changes(tree, base_revid, changes))
189 builder.finish_inventory()
190 except:
191 builder.abort()
192@@ -228,13 +239,13 @@
193 rev = self.branch.repository.get_revision(revid)
194 except NoSuchRevision:
195 raise PackageVersionNotPresent(package, version, self)
196- note("Using pristine-tar to reconstruct the needed tarball.")
197 if self.has_pristine_tar_delta(rev):
198 format = self.pristine_tar_format(rev)
199 else:
200 format = 'gz'
201 target_filename = self._tarball_path(package, version, component,
202 target_dir, format=format)
203+ note("Using pristine-tar to reconstruct %s.", os.path.basename(target_filename))
204 try:
205 self.reconstruct_pristine_tar(revid, package, version, target_filename)
206 except PristineTarError:
207@@ -243,8 +254,15 @@
208 raise PackageVersionNotPresent(package, version, self)
209 return target_filename
210
211- def fetch_tarballs(self, package, version, target_dir):
212- return [self.fetch_component_tarball(package, version, None, target_dir)]
213+ def fetch_tarballs(self, package, version, target_dir, components=None):
214+ if components is None:
215+ # Scan tags for components
216+ try:
217+ components = self._components_by_version()[version].keys()
218+ except KeyError:
219+ raise PackageVersionNotPresent(package, version, self)
220+ return [self.fetch_component_tarball(package, version, component, target_dir)
221+ for component in components]
222
223 def _has_revision(self, revid, md5=None):
224 self.branch.lock_read()
225@@ -370,7 +388,7 @@
226 finally:
227 shutil.rmtree(tmpdir)
228
229- def make_pristine_tar_delta(self, tree, tarball_path, subdir=None):
230+ def make_pristine_tar_delta(self, tree, tarball_path, subdir=None, exclude=None):
231 tmpdir = tempfile.mkdtemp(prefix="builddeb-pristine-")
232 try:
233 dest = os.path.join(tmpdir, "orig")
234@@ -385,17 +403,21 @@
235 finally:
236 shutil.rmtree(tmpdir)
237
238- def iter_versions(self):
239- """Iterate over all upstream versions.
240-
241- :return: Iterator over (tag_name, version, revid) tuples
242- """
243+ def _components_by_version(self):
244 ret = {}
245 for tag_name, tag_revid in self.branch.tags.get_tag_dict().iteritems():
246 if not is_upstream_tag(tag_name):
247 continue
248 (component, version) = upstream_tag_version(tag_name)
249 ret.setdefault(version, {})[component] = tag_revid
250+ return ret
251+
252+ def iter_versions(self):
253+ """Iterate over all upstream versions.
254+
255+ :return: Iterator over (tag_name, version, revid) tuples
256+ """
257+ ret = self._components_by_version()
258 return ret.iteritems()
259
260

Subscribers

People subscribed via source and target branches