Merge lp:~jelmer/bzr-builddeb/multiple-upstream-tarballs-pt5 into lp:bzr-builddeb
- multiple-upstream-tarballs-pt5
- Merge into trunk
Proposed by
Jelmer Vernooij
Status: | Merged |
---|---|
Approved by: | James Westby |
Approved revision: | 587 |
Merged at revision: | 581 |
Proposed branch: | lp:~jelmer/bzr-builddeb/multiple-upstream-tarballs-pt5 |
Merge into: | lp:bzr-builddeb |
Diff against target: |
922 lines (+198/-180) 11 files modified
cmds.py (+2/-2) dh_make.py (+1/-1) import_dsc.py (+48/-60) tests/test_import_dsc.py (+12/-12) tests/test_merge_package.py (+4/-4) tests/test_upstream.py (+35/-30) tests/test_util.py (+8/-6) upstream/__init__.py (+16/-15) upstream/branch.py (+2/-2) upstream/pristinetar.py (+64/-45) util.py (+6/-3) |
To merge this branch: | bzr merge lp:~jelmer/bzr-builddeb/multiple-upstream-tarballs-pt5 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
James Westby | Approve | ||
Review via email: mp+65955@code.launchpad.net |
Commit message
Description of the change
More work on support for multiple upstream tarballs.
Rename fetch_tarball -> fetch_tarballs as it can fetch multiple tarballs.
Some refactoring in import_dsc:
* Remove has_upstream_
* Pull some duplicate code into can_pull_
Pass component further down in some more places, including tarball_filename.
To post a comment you must log in.
Revision history for this message
James Westby (james-w) : | # |
review:
Approve
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-24 10:51:46 +0000 |
3 | +++ cmds.py 2011-06-27 10:36:00 +0000 |
4 | @@ -577,7 +577,7 @@ |
5 | if v3: |
6 | if location.endswith(".tar.bz2") or location.endswith(".tbz2"): |
7 | format = "bz2" |
8 | - dest_name = tarball_name(package, version, format=format) |
9 | + dest_name = tarball_name(package, version, None, format=format) |
10 | tarball_filename = os.path.join(orig_dir, dest_name) |
11 | try: |
12 | repack_tarball(location, dest_name, target_dir=orig_dir, |
13 | @@ -745,7 +745,7 @@ |
14 | (version, upstream_branch_source)) |
15 | if need_upstream_tarball: |
16 | target_dir = tempfile.mkdtemp() # FIXME: Cleanup? |
17 | - locations = primary_upstream_source.fetch_tarball( |
18 | + locations = primary_upstream_source.fetch_tarballs( |
19 | package, version, target_dir) |
20 | source_format = get_source_format(tree) |
21 | v3 = (source_format in [ |
22 | |
23 | === modified file 'dh_make.py' |
24 | --- dh_make.py 2011-06-23 10:29:54 +0000 |
25 | +++ dh_make.py 2011-06-27 10:36:00 +0000 |
26 | @@ -62,7 +62,7 @@ |
27 | if use_v3: |
28 | if tarball.endswith(".tar.bz2") or tarball.endswith(".tbz2"): |
29 | format = "bz2" |
30 | - dest_name = util.tarball_name(package_name, version, format=format) |
31 | + dest_name = util.tarball_name(package_name, version, None, format=format) |
32 | trace.note("Fetching tarball") |
33 | repack_tarball(tarball, dest_name, target_dir=orig_dir, |
34 | force_gz=not use_v3) |
35 | |
36 | === modified file 'import_dsc.py' |
37 | --- import_dsc.py 2011-06-23 21:34:52 +0000 |
38 | +++ import_dsc.py 2011-06-27 10:36:00 +0000 |
39 | @@ -60,6 +60,7 @@ |
40 | |
41 | from bzrlib.plugins.builddeb.bzrtools_import import import_dir |
42 | from bzrlib.plugins.builddeb.errors import ( |
43 | + PackageVersionNotPresent, |
44 | UpstreamAlreadyImported, |
45 | UpstreamBranchAlreadyMerged, |
46 | ) |
47 | @@ -321,23 +322,6 @@ |
48 | return True |
49 | return False |
50 | |
51 | - def has_upstream_version(self, package, version, tarballs=None): |
52 | - """Whether this branch contains the upstream version specified. |
53 | - |
54 | - The version must be judged present by having the appropriate tag |
55 | - in the upstream branch. If the md5 argument is not None then the |
56 | - string passed must the the md5sum that is associated with the |
57 | - revision pointed to by the tag. |
58 | - |
59 | - :param version: a upstream version number to look for in the upstream |
60 | - branch. |
61 | - :param tarballs: list of upstream tarballs that should be present, |
62 | - tuples of filename and md5sum |
63 | - :return: True if the upstream branch contains the specified upstream |
64 | - version of the package. False otherwise. |
65 | - """ |
66 | - return self.pristine_upstream_source.has_version(package, version, tarballs) |
67 | - |
68 | def contained_versions(self, versions): |
69 | """Splits a list of versions depending on presence in the branch. |
70 | |
71 | @@ -574,6 +558,35 @@ |
72 | finally: |
73 | self.branch.unlock() |
74 | |
75 | + def can_pull_upstream_from_branch(self, branch, package, version, |
76 | + upstream_tarballs=None): |
77 | + """Check if a version can be pulled from another branch into this one. |
78 | + |
79 | + :param branch: Branch with upstream version |
80 | + :param package: Package name |
81 | + :param version: Package version |
82 | + :param upstream_tarballs: Required upstream tarballs (optional) |
83 | + """ |
84 | + if not branch.pristine_upstream_source.has_version(package, version, |
85 | + tarballs=upstream_tarballs): |
86 | + return False |
87 | + |
88 | + up_branch = self.pristine_upstream_branch |
89 | + up_branch.lock_read() |
90 | + try: |
91 | + # Check that they haven't diverged |
92 | + other_up_branch = branch.pristine_upstream_branch |
93 | + other_up_branch.lock_read() |
94 | + try: |
95 | + graph = other_up_branch.repository.get_graph( |
96 | + up_branch.repository) |
97 | + return graph.is_ancestor(up_branch.last_revision(), |
98 | + branch.revid_of_upstream_version(package, version)) |
99 | + finally: |
100 | + other_up_branch.unlock() |
101 | + finally: |
102 | + up_branch.unlock() |
103 | + |
104 | def branch_to_pull_upstream_from(self, package, version, upstream_tarballs): |
105 | """Checks whether this upstream is a pull from a lesser branch. |
106 | |
107 | @@ -591,40 +604,15 @@ |
108 | if that is what should be done, otherwise None. |
109 | """ |
110 | assert isinstance(version, str) |
111 | - up_branch = self.pristine_upstream_branch |
112 | - up_branch.lock_read() |
113 | - try: |
114 | - for branch in reversed(self.get_lesser_branches()): |
115 | - if branch.has_upstream_version(package, version, |
116 | - tarballs=upstream_tarballs): |
117 | - # Check that they haven't diverged |
118 | - other_up_branch = branch.pristine_upstream_branch |
119 | - other_up_branch.lock_read() |
120 | - try: |
121 | - graph = other_up_branch.repository.get_graph( |
122 | - up_branch.repository) |
123 | - if graph.is_ancestor(up_branch.last_revision(), |
124 | - branch.revid_of_upstream_version(package, version)): |
125 | - return branch |
126 | - finally: |
127 | - other_up_branch.unlock() |
128 | - for branch in self.get_greater_branches(): |
129 | - if branch.has_upstream_version(package, version, |
130 | - tarballs=upstream_tarballs): |
131 | - # Check that they haven't diverged |
132 | - other_up_branch = branch.pristine_upstream_branch |
133 | - other_up_branch.lock_read() |
134 | - try: |
135 | - graph = other_up_branch.repository.get_graph( |
136 | - up_branch.repository) |
137 | - if graph.is_ancestor(up_branch.last_revision(), |
138 | - branch.revid_of_upstream_version(package, version)): |
139 | - return branch |
140 | - finally: |
141 | - other_up_branch.unlock() |
142 | - return None |
143 | - finally: |
144 | - up_branch.unlock() |
145 | + for branch in reversed(self.get_lesser_branches()): |
146 | + if self.can_pull_upstream_from_branch(branch, package, version, |
147 | + upstream_tarballs): |
148 | + return branch |
149 | + for branch in self.get_greater_branches(): |
150 | + if self.can_pull_upstream_from_branch(branch, package, version, |
151 | + upstream_tarballs): |
152 | + return branch |
153 | + return None |
154 | |
155 | def get_parents(self, versions): |
156 | """Return the list of parents for a specific version. |
157 | @@ -710,10 +698,9 @@ |
158 | pull_revision = pull_branch.revid_of_upstream_version(package, version) |
159 | mutter("Pulling upstream part of %s from revision %s" % \ |
160 | (version, pull_revision)) |
161 | - up_pull_branch = pull_branch.pristine_upstream_branch |
162 | assert self.pristine_upstream_tree is not None, \ |
163 | "Can't pull upstream with no tree" |
164 | - self.pristine_upstream_tree.pull(up_pull_branch, |
165 | + self.pristine_upstream_tree.pull(pull_branch.pristine_upstream_branch, |
166 | stop_revision=pull_revision) |
167 | self.pristine_upstream_source.tag_version(version, pull_revision) |
168 | self.branch.fetch(self.pristine_upstream_branch, last_revision=pull_revision) |
169 | @@ -746,8 +733,8 @@ |
170 | assert self.tree is not None, "Can't pull branch with no tree" |
171 | self.tree.pull(pull_branch.branch, stop_revision=pull_revision) |
172 | self.tag_version(version, revid=pull_revision) |
173 | - if not native and not self.has_upstream_version(package, version.upstream_version): |
174 | - if pull_branch.has_upstream_version(package, version.upstream_version): |
175 | + if not native and not self.pristine_upstream_source.has_version(package, version.upstream_version): |
176 | + if pull_branch.pristine_upstream_source.has_version(package, version.upstream_version): |
177 | self.pull_upstream_from_branch(pull_branch, |
178 | package, version.upstream_version) |
179 | else: |
180 | @@ -1066,7 +1053,7 @@ |
181 | # upstream as a non-native version (i.e. it wasn't a mistaken |
182 | # native -2 version), then we want to add an extra parent. |
183 | if (self.is_version_native(last_contained_version) |
184 | - and not self.has_upstream_version(package, |
185 | + and not self.pristine_upstream_source.has_version(package, |
186 | last_contained_version.upstream_version)): |
187 | revid = self.revid_of_version(last_contained_version) |
188 | parents.append(revid) |
189 | @@ -1131,7 +1118,8 @@ |
190 | # We need to import at least the diff, possibly upstream. |
191 | # Work out if we need the upstream part first. |
192 | imported_upstream = False |
193 | - if not self.pristine_upstream_source.has_version(package, version.upstream_version): |
194 | + if not self.pristine_upstream_source.has_version(package, |
195 | + version.upstream_version): |
196 | up_pull_branch = \ |
197 | self.branch_to_pull_upstream_from(package, version.upstream_version, |
198 | upstream_tarballs) |
199 | @@ -1342,16 +1330,16 @@ |
200 | def _export_previous_upstream_tree(self, package, previous_version, tempdir): |
201 | assert isinstance(previous_version, str), \ |
202 | "Should pass upstream version as str, not Version." |
203 | - if self.pristine_upstream_source.has_version(package, previous_version): |
204 | + try: |
205 | upstream_tip = self.pristine_upstream_source.version_as_revision( |
206 | package, previous_version) |
207 | - self.extract_upstream_tree(upstream_tip, tempdir) |
208 | - else: |
209 | + except PackageVersionNotPresent: |
210 | raise BzrCommandError("Unable to find the tag for the " |
211 | "previous upstream version, %s, in the branch: " |
212 | "%s" % ( |
213 | previous_version, |
214 | self.pristine_upstream_source.tag_name(previous_version))) |
215 | + self.extract_upstream_tree(upstream_tip, tempdir) |
216 | |
217 | def merge_upstream(self, tarball_filenames, package, version, previous_version, |
218 | upstream_branch=None, upstream_revision=None, merge_type=None, |
219 | |
220 | === modified file 'tests/test_import_dsc.py' |
221 | --- tests/test_import_dsc.py 2011-06-23 15:33:44 +0000 |
222 | +++ tests/test_import_dsc.py 2011-06-27 10:36:00 +0000 |
223 | @@ -168,30 +168,30 @@ |
224 | self.assertFalse(db.has_version(version, self.fake_md5_1)) |
225 | self.assertFalse(db.has_version(version, self.fake_md5_2)) |
226 | |
227 | - def test_has_upstream_version(self): |
228 | + def test_pristine_upstream_source_has_version(self): |
229 | db = self.db1 |
230 | version = "0.1" |
231 | - self.assertFalse(db.has_upstream_version("package", version)) |
232 | - self.assertFalse(db.has_upstream_version("package", version, |
233 | + self.assertFalse(db.pristine_upstream_source.has_version("package", version)) |
234 | + self.assertFalse(db.pristine_upstream_source.has_version("package", version, |
235 | [("foo.tar.gz", None, self.fake_md5_1)])) |
236 | self.do_commit_with_md5(self.up_tree1, "one", self.fake_md5_1) |
237 | db.tag_upstream_version(version) |
238 | - self.assertTrue(db.has_upstream_version("package", version)) |
239 | - self.assertTrue(db.has_upstream_version("package", |
240 | + self.assertTrue(db.pristine_upstream_source.has_version("package", version)) |
241 | + self.assertTrue(db.pristine_upstream_source.has_version("package", |
242 | version, [("foo.tar.gz", None, self.fake_md5_1)])) |
243 | - self.assertFalse(db.has_upstream_version("package", version, |
244 | + self.assertFalse(db.pristine_upstream_source.has_version("package", version, |
245 | [("foo.tar.gz", None, self.fake_md5_2)])) |
246 | version = "0.1" |
247 | - self.assertTrue(db.has_upstream_version("package", version)) |
248 | - self.assertTrue(db.has_upstream_version("package", version, |
249 | + self.assertTrue(db.pristine_upstream_source.has_version("package", version)) |
250 | + self.assertTrue(db.pristine_upstream_source.has_version("package", version, |
251 | [("foo.tar.gz", None, self.fake_md5_1)])) |
252 | - self.assertFalse(db.has_upstream_version("package", version, |
253 | + self.assertFalse(db.pristine_upstream_source.has_version("package", version, |
254 | [("foo.tar.gz", None, self.fake_md5_2)])) |
255 | version = "0.2" |
256 | - self.assertFalse(db.has_upstream_version("package", version)) |
257 | - self.assertFalse(db.has_upstream_version("package", version, |
258 | + self.assertFalse(db.pristine_upstream_source.has_version("package", version)) |
259 | + self.assertFalse(db.pristine_upstream_source.has_version("package", version, |
260 | [("foo.tar.gz", None, self.fake_md5_1)])) |
261 | - self.assertFalse(db.has_upstream_version("package", version, |
262 | + self.assertFalse(db.pristine_upstream_source.has_version("package", version, |
263 | [("foo.tar.gz", None, self.fake_md5_2)])) |
264 | |
265 | def test_revid_of_version(self): |
266 | |
267 | === modified file 'tests/test_merge_package.py' |
268 | --- tests/test_merge_package.py 2011-06-15 10:03:47 +0000 |
269 | +++ tests/test_merge_package.py 2011-06-27 10:36:00 +0000 |
270 | @@ -120,10 +120,10 @@ |
271 | v3 = "1.2" |
272 | v4 = "1.10" |
273 | db1 = DistributionBranch(ubup.branch, ubup.branch) |
274 | - self.assertEqual(db1.has_upstream_version("package", v3), True) |
275 | + self.assertEqual(db1.pristine_upstream_source.has_version("package", v3), True) |
276 | # This version is in the diverged debian upstream tree and will |
277 | # hence not be present in the target ubuntu packaging branch. |
278 | - self.assertEqual(db1.has_upstream_version("package", v4), False) |
279 | + self.assertEqual(db1.pristine_upstream_source.has_version("package", v4), False) |
280 | |
281 | # The ubuntu upstream branch tip. |
282 | ubuu_tip = ubuu.branch.revision_history()[-1] |
283 | @@ -143,11 +143,11 @@ |
284 | |
285 | # Check the versions present in the tree with the fixed ancestry. |
286 | db2 = DistributionBranch(ubup.branch, ubup.branch) |
287 | - self.assertEqual(db2.has_upstream_version("package", v3), True) |
288 | + self.assertEqual(db2.pristine_upstream_source.has_version("package", v3), True) |
289 | # The ancestry has been fixed and the missing debian upstream |
290 | # version should now be present in the target ubuntu packaging |
291 | # branch. |
292 | - self.assertEqual(db2.has_upstream_version("package", v4), True) |
293 | + self.assertEqual(db2.pristine_upstream_source.has_version("package", v4), True) |
294 | |
295 | # Now let's take a look at the fixed ubuntu packaging branch. |
296 | ubup_tip_post_fix = ubup.branch.revision_history()[-1] |
297 | |
298 | === modified file 'tests/test_upstream.py' |
299 | --- tests/test_upstream.py 2011-06-15 18:44:09 +0000 |
300 | +++ tests/test_upstream.py 2011-06-27 10:36:00 +0000 |
301 | @@ -164,7 +164,7 @@ |
302 | apt_pkg = MockAptPkg(sources) |
303 | src = AptSource() |
304 | src._run_apt_source = caller.call |
305 | - self.assertRaises(PackageVersionNotPresent, src.fetch_tarball, |
306 | + self.assertRaises(PackageVersionNotPresent, src.fetch_tarballs, |
307 | "apackage", "0.2", "target", _apt_pkg=apt_pkg) |
308 | self.assertEqual(1, apt_pkg.init_called_times) |
309 | self.assertEqual(1, apt_pkg.get_pkg_source_records_called_times) |
310 | @@ -180,7 +180,7 @@ |
311 | apt_pkg = MockAptPkg(sources) |
312 | src = AptSource() |
313 | src._run_apt_source = caller.call |
314 | - self.assertRaises(PackageVersionNotPresent, src.fetch_tarball, |
315 | + self.assertRaises(PackageVersionNotPresent, src.fetch_tarballs, |
316 | "apackage", "0.2", "target", _apt_pkg=apt_pkg) |
317 | self.assertEqual(1, apt_pkg.init_called_times) |
318 | self.assertEqual(1, apt_pkg.get_pkg_source_records_called_times) |
319 | @@ -198,7 +198,7 @@ |
320 | apt_pkg = MockAptPkg(sources) |
321 | src = AptSource() |
322 | src._run_apt_source = caller.call |
323 | - paths = src.fetch_tarball("apackage", "0.2", "target", |
324 | + paths = src.fetch_tarballs("apackage", "0.2", "target", |
325 | _apt_pkg=apt_pkg) |
326 | self.assertEquals(paths, [ |
327 | "target/apackage_0.2.orig.tar.bz2", |
328 | @@ -212,7 +212,7 @@ |
329 | apt_pkg = MockAptPkg(sources) |
330 | src = AptSource() |
331 | src._run_apt_source = caller.call |
332 | - paths = src.fetch_tarball("apackage", "0.2", "target", |
333 | + paths = src.fetch_tarballs("apackage", "0.2", "target", |
334 | _apt_pkg=apt_pkg) |
335 | self.assertEquals(paths, ["target/apackage_0.2.orig.tar.bz2"]) |
336 | |
337 | @@ -224,7 +224,7 @@ |
338 | apt_pkg = MockAptPkg(sources) |
339 | src = AptSource() |
340 | src._run_apt_source = caller.call |
341 | - paths = src.fetch_tarball("apackage", "0.2", "target", |
342 | + paths = src.fetch_tarballs("apackage", "0.2", "target", |
343 | _apt_pkg=apt_pkg) |
344 | self.assertEquals(paths, ["target/apackage_0.2.orig.tar.gz"]) |
345 | self.assertEqual(1, apt_pkg.init_called_times) |
346 | @@ -246,7 +246,7 @@ |
347 | apt_pkg = MockAptPkg(sources) |
348 | src = AptSource() |
349 | src._run_apt_source = caller.call |
350 | - self.assertRaises(PackageVersionNotPresent, src.fetch_tarball, |
351 | + self.assertRaises(PackageVersionNotPresent, src.fetch_tarballs, |
352 | "apackage", "0.2", "target", |
353 | _apt_pkg=apt_pkg) |
354 | self.assertEqual(1, apt_pkg.init_called_times) |
355 | @@ -268,7 +268,7 @@ |
356 | apt_pkg = MockAptPkg(sources) |
357 | src = AptSource() |
358 | src._run_apt_source = caller.call |
359 | - self.assertRaises(PackageVersionNotPresent, src.fetch_tarball, |
360 | + self.assertRaises(PackageVersionNotPresent, src.fetch_tarballs, |
361 | "apackage", "0.2", "target", _apt_pkg=apt_pkg) |
362 | self.assertEqual(1, apt_pkg.init_called_times) |
363 | self.assertEqual(1, apt_pkg.get_pkg_source_records_called_times) |
364 | @@ -288,11 +288,11 @@ |
365 | def get_latest_version(self, package, current_version): |
366 | return self._latest |
367 | |
368 | - def fetch_tarball(self, package, version, target_dir): |
369 | + def fetch_tarballs(self, package, version, target_dir): |
370 | self._specific_versions.append((package, version, target_dir)) |
371 | if not self._succeed: |
372 | raise PackageVersionNotPresent(package, version, self) |
373 | - return [self._tarball_path(package, version, target_dir)] |
374 | + return [self._tarball_path(package, version, None, target_dir)] |
375 | |
376 | def __repr__(self): |
377 | return "%s()" % self.__class__.__name__ |
378 | @@ -300,12 +300,12 @@ |
379 | |
380 | class StackedUpstreamSourceTests(TestCase): |
381 | |
382 | - def test_fetch_tarball_first_wins(self): |
383 | + def test_fetch_tarballs_first_wins(self): |
384 | a = RecordingSource(False) |
385 | b = RecordingSource(True) |
386 | c = RecordingSource(False) |
387 | stack = StackedUpstreamSource([a, b, c]) |
388 | - stack.fetch_tarball("mypkg", "1.0", "bla") |
389 | + stack.fetch_tarballs("mypkg", "1.0", "bla") |
390 | self.assertEquals([("mypkg", "1.0", "bla")], b._specific_versions) |
391 | self.assertEquals([("mypkg", "1.0", "bla")], a._specific_versions) |
392 | self.assertEquals([], c._specific_versions) |
393 | @@ -327,7 +327,7 @@ |
394 | b = RecordingSource(False) |
395 | stack = StackedUpstreamSource([a, b]) |
396 | self.assertRaises(PackageVersionNotPresent, |
397 | - stack.fetch_tarball, "pkg", "1.0", "bla") |
398 | + stack.fetch_tarballs, "pkg", "1.0", "bla") |
399 | self.assertEquals([("pkg", "1.0", "bla")], b._specific_versions) |
400 | self.assertEquals([("pkg", "1.0", "bla")], a._specific_versions) |
401 | |
402 | @@ -387,21 +387,21 @@ |
403 | super(UpstreamBranchSourceTests, self).setUp() |
404 | self.tree = self.make_branch_and_tree('.') |
405 | |
406 | - def test_fetch_tarball(self): |
407 | + def test_fetch_tarballs(self): |
408 | self.tree.commit("msg") |
409 | self.tree.branch.tags.set_tag("1.0", self.tree.branch.last_revision()) |
410 | source = UpstreamBranchSource(self.tree.branch, |
411 | {"1.0": self.tree.branch.last_revision()}) |
412 | os.mkdir("mydir") |
413 | self.assertEquals(["mydir/foo_1.0.orig.tar.gz"], |
414 | - source.fetch_tarball("foo", "1.0", "mydir")) |
415 | + source.fetch_tarballs("foo", "1.0", "mydir")) |
416 | self.assertPathExists("mydir/foo_1.0.orig.tar.gz") |
417 | |
418 | - def test_fetch_tarball_not_found(self): |
419 | + def test_fetch_tarballs_not_found(self): |
420 | source = UpstreamBranchSource(self.tree.branch) |
421 | self.tree.commit("msg") |
422 | self.assertRaises(PackageVersionNotPresent, |
423 | - source.fetch_tarball, "foo", "1.0", "mydir") |
424 | + source.fetch_tarballs, "foo", "1.0", "mydir") |
425 | |
426 | def test_get_latest_version(self): |
427 | self.tree.commit("msg") |
428 | @@ -452,7 +452,7 @@ |
429 | super(LazyUpstreamBranchSourceTests, self).setUp() |
430 | self.tree = self.make_branch_and_tree('.') |
431 | |
432 | - def test_fetch_tarball(self): |
433 | + def test_fetch_tarballs(self): |
434 | self.tree.commit("msg") |
435 | self.tree.branch.tags.set_tag("1.0", self.tree.branch.last_revision()) |
436 | source = LazyUpstreamBranchSource(self.tree.branch.base, |
437 | @@ -460,16 +460,16 @@ |
438 | self.assertIs(None, source._upstream_branch) |
439 | os.mkdir("mydir") |
440 | self.assertEquals(["mydir/foo_1.0.orig.tar.gz"], |
441 | - source.fetch_tarball("foo", "1.0", "mydir")) |
442 | + source.fetch_tarballs("foo", "1.0", "mydir")) |
443 | self.assertPathExists("mydir/foo_1.0.orig.tar.gz") |
444 | self.assertIsNot(None, source._upstream_branch) |
445 | |
446 | - def test_fetch_tarball_not_found(self): |
447 | + def test_fetch_tarballs_not_found(self): |
448 | source = LazyUpstreamBranchSource(self.tree.branch.base) |
449 | self.assertIs(None, source._upstream_branch) |
450 | self.tree.commit("msg") |
451 | self.assertRaises(PackageVersionNotPresent, |
452 | - source.fetch_tarball, "foo", "1.0", "mydir") |
453 | + source.fetch_tarballs, "foo", "1.0", "mydir") |
454 | self.assertIsNot(None, source._upstream_branch) |
455 | |
456 | def test_get_latest_version(self): |
457 | @@ -675,13 +675,18 @@ |
458 | "upstream-" + upstream_v_no) |
459 | |
460 | def test_tag_name_distro(self): |
461 | - self.assertEquals(self.source.tag_name("0.3", "ubuntu"), |
462 | + self.assertEquals(self.source.tag_name("0.3", distro="ubuntu"), |
463 | "upstream-ubuntu-0.3") |
464 | |
465 | def test_version(self): |
466 | self.assertEquals(['upstream-3.3', 'upstream-debian-3.3', |
467 | 'upstream-ubuntu-3.3', 'upstream/3.3'], |
468 | - self.source.possible_tag_names("3.3")) |
469 | + self.source.possible_tag_names("3.3", component=None)) |
470 | + |
471 | + def test_version_component(self): |
472 | + self.assertEquals(['upstream-3.3/extlib', 'upstream-debian-3.3/extlib', |
473 | + 'upstream-ubuntu-3.3/extlib'], |
474 | + self.source.possible_tag_names("3.3", component="extlib")) |
475 | |
476 | def test_pristine_tar_format_gz(self): |
477 | rev = Revision("myrevid") |
478 | @@ -734,30 +739,30 @@ |
479 | source = TarfileSource("foo-1.0.tar.gz") |
480 | self.assertEquals("1.0", source.get_latest_version("foo", "0.9")) |
481 | |
482 | - def test_fetch_tarball(self): |
483 | + def test_fetch_tarballs(self): |
484 | source = TarfileSource("foo-1.0.tar.gz", "1.0") |
485 | os.mkdir("bar") |
486 | self.assertEquals(["bar/foo_1.0.orig.tar.gz"], |
487 | - source.fetch_tarball("foo", "1.0", "bar")) |
488 | + source.fetch_tarballs("foo", "1.0", "bar")) |
489 | self.assertPathExists("bar/foo_1.0.orig.tar.gz") |
490 | |
491 | - def test_fetch_tarball_repack(self): |
492 | + def test_fetch_tarballs_repack(self): |
493 | zf = zipfile.ZipFile("bla-2.0.zip", "w") |
494 | zf.writestr('avoid', 'empty zip to make the repacker happy\n') |
495 | zf.close() |
496 | source = TarfileSource("bla-2.0.zip", "2.0") |
497 | os.mkdir("bar") |
498 | self.assertEquals(["bar/foo_2.0.orig.tar.gz"], |
499 | - source.fetch_tarball("foo", "2.0", "bar")) |
500 | + source.fetch_tarballs("foo", "2.0", "bar")) |
501 | self.assertPathExists("bar/foo_2.0.orig.tar.gz") |
502 | |
503 | - def test_fetch_tarball_not_present(self): |
504 | + def test_fetch_tarballs_not_present(self): |
505 | source = TarfileSource("foo-1.0.tar.gz", "1.0") |
506 | os.mkdir("bar") |
507 | self.assertRaises(PackageVersionNotPresent, |
508 | - source.fetch_tarball, "foo", "0.9", "bar") |
509 | + source.fetch_tarballs, "foo", "0.9", "bar") |
510 | |
511 | - def test_fetch_tarball_bz2(self): |
512 | + def test_fetch_tarballs_bz2(self): |
513 | tar = tarfile.open("foo-1.0.tar.bz2", "w:bz2") |
514 | tar.close() |
515 | # verify this is a bzip2 file |
516 | @@ -765,7 +770,7 @@ |
517 | source = TarfileSource("foo-1.0.tar.bz2", "1.0") |
518 | os.mkdir("bar") |
519 | self.assertEquals(["bar/foo_1.0.orig.tar.gz"], |
520 | - source.fetch_tarball("foo", "1.0", "bar")) |
521 | + source.fetch_tarballs("foo", "1.0", "bar")) |
522 | self.assertPathExists("bar/foo_1.0.orig.tar.gz") |
523 | gzip.open("bar/foo_1.0.orig.tar.gz").close() |
524 | |
525 | |
526 | === modified file 'tests/test_util.py' |
527 | --- tests/test_util.py 2011-06-16 11:11:36 +0000 |
528 | +++ tests/test_util.py 2011-06-27 10:36:00 +0000 |
529 | @@ -271,14 +271,16 @@ |
530 | class TarballNameTests(TestCase): |
531 | |
532 | def test_tarball_name(self): |
533 | - self.assertEqual(tarball_name("package", "0.1"), |
534 | - "package_0.1.orig.tar.gz") |
535 | - self.assertEqual(tarball_name("package", Version("0.1")), |
536 | - "package_0.1.orig.tar.gz") |
537 | - self.assertEqual(tarball_name("package", Version("0.1"), |
538 | + self.assertEqual(tarball_name("package", "0.1", None), |
539 | + "package_0.1.orig.tar.gz") |
540 | + self.assertEqual(tarball_name("package", Version("0.1"), None), |
541 | + "package_0.1.orig.tar.gz") |
542 | + self.assertEqual(tarball_name("package", Version("0.1"), None, |
543 | format='bz2'), "package_0.1.orig.tar.bz2") |
544 | - self.assertEqual(tarball_name("package", Version("0.1"), |
545 | + self.assertEqual(tarball_name("package", Version("0.1"), None, |
546 | format='lzma'), "package_0.1.orig.tar.lzma") |
547 | + self.assertEqual(tarball_name("package", Version("0.1"), "la", |
548 | + format='lzma'), "package_0.1.orig-la.tar.lzma") |
549 | |
550 | |
551 | class SuiteToDistributionTests(TestCase): |
552 | |
553 | === modified file 'upstream/__init__.py' |
554 | --- upstream/__init__.py 2011-06-17 01:37:55 +0000 |
555 | +++ upstream/__init__.py 2011-06-27 10:36:00 +0000 |
556 | @@ -81,7 +81,7 @@ |
557 | """ |
558 | raise NotImplementedError(self.has_version) |
559 | |
560 | - def fetch_tarball(self, package, version, target_dir): |
561 | + def fetch_tarballs(self, package, version, target_dir): |
562 | """Fetch the source tarball for a particular version. |
563 | |
564 | :param package: Name of the package |
565 | @@ -89,17 +89,17 @@ |
566 | :param target_dir: Directory in which to store the tarball |
567 | :return: Paths of the fetched tarballs |
568 | """ |
569 | - raise NotImplementedError(self.fetch_tarball) |
570 | + raise NotImplementedError(self.fetch_tarballs) |
571 | |
572 | - def _tarball_path(self, package, version, target_dir, format=None): |
573 | - return os.path.join(target_dir, tarball_name(package, version, |
574 | + def _tarball_path(self, package, version, component, target_dir, format=None): |
575 | + return os.path.join(target_dir, tarball_name(package, version, component, |
576 | format=format)) |
577 | |
578 | |
579 | class AptSource(UpstreamSource): |
580 | """Upstream source that uses apt-source.""" |
581 | |
582 | - def fetch_tarball(self, package, upstream_version, target_dir, |
583 | + def fetch_tarballs(self, package, upstream_version, target_dir, |
584 | _apt_pkg=None): |
585 | if _apt_pkg is None: |
586 | import apt_pkg |
587 | @@ -184,7 +184,7 @@ |
588 | note("get-orig-source did not create file with prefix %s", prefix) |
589 | return None |
590 | |
591 | - def fetch_tarball(self, package, version, target_dir): |
592 | + def fetch_tarballs(self, package, version, target_dir): |
593 | if self.larstiq: |
594 | rules_name = 'rules' |
595 | else: |
596 | @@ -266,7 +266,7 @@ |
597 | os.unlink(tempfilename) |
598 | return self._xml_report_extract_upstream_version(stdout) |
599 | |
600 | - def fetch_tarball(self, package, version, target_dir): |
601 | + def fetch_tarballs(self, package, version, target_dir): |
602 | note("Using uscan to look for the upstream tarball.") |
603 | try: |
604 | tempfilename = self._export_watchfile() |
605 | @@ -285,7 +285,8 @@ |
606 | if r != 0: |
607 | note("uscan could not find the needed tarball.") |
608 | raise PackageVersionNotPresent(package, version, self) |
609 | - return [self._tarball_path(package, version, target_dir)] |
610 | + # FIXME: What about the other component tarballs? |
611 | + return [self._tarball_path(package, version, None, target_dir)] |
612 | |
613 | |
614 | class SelfSplitSource(UpstreamSource): |
615 | @@ -308,10 +309,10 @@ |
616 | finally: |
617 | shutil.rmtree(tmpdir) |
618 | |
619 | - def fetch_tarball(self, package, version, target_dir): |
620 | + def fetch_tarballs(self, package, version, target_dir): |
621 | note("Using the current branch without the 'debian' directory " |
622 | "to create the tarball") |
623 | - tarball_path = self._tarball_path(package, version, target_dir) |
624 | + tarball_path = self._tarball_path(package, version, None, target_dir) |
625 | self._split(package, version, tarball_path) |
626 | return [tarball_path] |
627 | |
628 | @@ -328,10 +329,10 @@ |
629 | def __repr__(self): |
630 | return "%s(%r)" % (self.__class__.__name__, self._sources) |
631 | |
632 | - def fetch_tarball(self, package, version, target_dir): |
633 | + def fetch_tarballs(self, package, version, target_dir): |
634 | for source in self._sources: |
635 | try: |
636 | - paths = source.fetch_tarball(package, version, target_dir) |
637 | + paths = source.fetch_tarballs(package, version, target_dir) |
638 | except PackageVersionNotPresent: |
639 | pass |
640 | else: |
641 | @@ -402,7 +403,7 @@ |
642 | if not os.path.exists(self.store_dir): |
643 | os.makedirs(self.store_dir) |
644 | try: |
645 | - paths = self.source.fetch_tarball(self.package, |
646 | + paths = self.source.fetch_tarballs(self.package, |
647 | self.version, self.store_dir) |
648 | except PackageVersionNotPresent: |
649 | raise MissingUpstreamTarball(self.package, self.version) |
650 | @@ -476,7 +477,7 @@ |
651 | self.path = path |
652 | self.version = version |
653 | |
654 | - def fetch_tarball(self, package, version, target_dir): |
655 | + def fetch_tarballs(self, package, version, target_dir): |
656 | if version != self.version: |
657 | raise PackageVersionNotPresent(package, version, self) |
658 | dest_name = tarball_name(package, version) |
659 | @@ -521,7 +522,7 @@ |
660 | else: |
661 | self.project = project |
662 | |
663 | - def fetch_tarball(self, package, version, target_dir): |
664 | + def fetch_tarballs(self, package, version, target_dir): |
665 | release = self.project.getRelease(version=version) |
666 | if release is None: |
667 | raise PackageVersionNotPresent(package, version, self) |
668 | |
669 | === modified file 'upstream/branch.py' |
670 | --- upstream/branch.py 2011-06-14 12:26:21 +0000 |
671 | +++ upstream/branch.py 2011-06-27 10:36:00 +0000 |
672 | @@ -254,7 +254,7 @@ |
673 | finally: |
674 | self.upstream_branch.unlock() |
675 | |
676 | - def fetch_tarball(self, package, version, target_dir): |
677 | + def fetch_tarballs(self, package, version, target_dir): |
678 | self.upstream_branch.lock_read() |
679 | try: |
680 | revid = self.version_as_revision(package, version) |
681 | @@ -262,7 +262,7 @@ |
682 | raise PackageVersionNotPresent(package, version, self) |
683 | note("Exporting upstream branch revision %s to create the tarball", |
684 | revid) |
685 | - target_filename = self._tarball_path(package, version, target_dir) |
686 | + target_filename = self._tarball_path(package, version, None, target_dir) |
687 | tarball_base = "%s-%s" % (package, version) |
688 | rev_tree = self.upstream_branch.repository.revision_tree(revid) |
689 | export(rev_tree, target_filename, 'tgz', tarball_base) |
690 | |
691 | === modified file 'upstream/pristinetar.py' |
692 | --- upstream/pristinetar.py 2011-06-23 21:41:36 +0000 |
693 | +++ upstream/pristinetar.py 2011-06-27 10:36:00 +0000 |
694 | @@ -118,19 +118,25 @@ |
695 | def __repr__(self): |
696 | return "<%s at %s>" % (self.__class__.__name__, self.branch.base) |
697 | |
698 | - def tag_name(self, version, distro=None): |
699 | + def tag_name(self, version, component=None, distro=None): |
700 | """Gets the tag name for the upstream part of version. |
701 | |
702 | :param version: the Version object to extract the upstream |
703 | part of the version number from. |
704 | + :param component: Name of the component (None for base) |
705 | + :param distro: Optional distribution name |
706 | :return: a String with the name of the tag. |
707 | """ |
708 | assert isinstance(version, str) |
709 | if distro is None: |
710 | - return "upstream-" + version |
711 | - return "upstream-%s-%s" % (distro, version) |
712 | + name = "upstream-" + version |
713 | + else: |
714 | + name = "upstream-%s-%s" % (distro, version) |
715 | + if component is not None: |
716 | + name += "/%s" % component |
717 | + return name |
718 | |
719 | - def tag_version(self, version, revid): |
720 | + def tag_version(self, version, revid, component=None): |
721 | """Tags the upstream branch's last revision with an upstream version. |
722 | |
723 | Sets a tag on the last revision of the upstream branch and on the main |
724 | @@ -139,12 +145,14 @@ |
725 | |
726 | :param version: the upstream part of the version number to derive the |
727 | tag name from. |
728 | + :param component: name of the component that is being imported |
729 | + (None for base) |
730 | :param revid: the revid to associate the tag with, or None for the |
731 | tip of self.pristine_upstream_branch. |
732 | :return The tag name, revid of the added tag. |
733 | """ |
734 | assert isinstance(version, str) |
735 | - tag_name = self.tag_name(version) |
736 | + tag_name = self.tag_name(version, component=component) |
737 | self.branch.tags.set_tag(tag_name, revid) |
738 | return tag_name, revid |
739 | |
740 | @@ -163,21 +171,28 @@ |
741 | revprops = {} |
742 | if md5 is not None: |
743 | revprops["deb-md5"] = md5 |
744 | - delta_revprops = self.create_delta_revprops(tree, tarball) |
745 | - revprops.update(delta_revprops) |
746 | + delta = self.make_pristine_tar_delta(tree, tarball) |
747 | + uuencoded = standard_b64encode(delta) |
748 | + if tarball.endswith(".tar.bz2"): |
749 | + revprops["deb-pristine-delta-bz2"] = uuencoded |
750 | + else: |
751 | + revprops["deb-pristine-delta"] = uuencoded |
752 | if author is not None: |
753 | revprops['authors'] = author |
754 | timezone = None |
755 | if timestamp is not None: |
756 | timezone = timestamp[1] |
757 | timestamp = timestamp[0] |
758 | - revid = tree.commit("Import upstream version %s" % (version,), |
759 | - revprops=revprops, timestamp=timestamp, timezone=timezone) |
760 | + message = "Import upstream version %s" % (version,) |
761 | + if component is not None: |
762 | + message += ", component %s" % component |
763 | + revid = tree.commit(message, revprops=revprops, timestamp=timestamp, |
764 | + timezone=timezone) |
765 | tag_name, _ = self.tag_version(version, revid=revid) |
766 | return tag_name, revid |
767 | |
768 | - def fetch_tarball(self, package, version, target_dir): |
769 | - revid = self.version_as_revision(package, version) |
770 | + def fetch_component_tarball(self, package, version, component, target_dir): |
771 | + revid = self.version_component_as_revision(package, version, component) |
772 | try: |
773 | rev = self.branch.repository.get_revision(revid) |
774 | except NoSuchRevision: |
775 | @@ -187,7 +202,7 @@ |
776 | format = self.pristine_tar_format(rev) |
777 | else: |
778 | format = 'gz' |
779 | - target_filename = self._tarball_path(package, version, |
780 | + target_filename = self._tarball_path(package, version, component, |
781 | target_dir, format=format) |
782 | try: |
783 | self.reconstruct_pristine_tar(revid, package, version, target_filename) |
784 | @@ -195,9 +210,12 @@ |
785 | raise PackageVersionNotPresent(package, version, self) |
786 | except PerFileTimestampsNotSupported: |
787 | raise PackageVersionNotPresent(package, version, self) |
788 | - return [target_filename] |
789 | - |
790 | - def _has_version(self, tag_name, tarballs=None): |
791 | + return target_filename |
792 | + |
793 | + def fetch_tarballs(self, package, version, target_dir): |
794 | + return [self.fetch_component_tarball(package, version, None, target_dir)] |
795 | + |
796 | + def _has_version_component(self, tag_name, md5=None): |
797 | if not self.branch.tags.has_tag(tag_name): |
798 | return False |
799 | revid = self.branch.tags.lookup_tag(tag_name) |
800 | @@ -208,11 +226,8 @@ |
801 | return False |
802 | finally: |
803 | self.branch.unlock() |
804 | - if tarballs is None: |
805 | + if md5 is None: |
806 | return True |
807 | - if len(tarballs) != 1: |
808 | - raise MultipleUpstreamTarballsNotSupported() |
809 | - (filename, component, md5) = tarballs[0] |
810 | rev = self.branch.repository.get_revision(revid) |
811 | try: |
812 | return rev.properties['deb-md5'] == md5 |
813 | @@ -222,29 +237,49 @@ |
814 | return True |
815 | |
816 | def version_as_revision(self, package, version, tarballs=None): |
817 | + if tarballs is None: |
818 | + return self.version_component_as_revision(package, version, component=None) |
819 | + elif len(tarballs) > 1: |
820 | + raise MultipleUpstreamTarballsNotSupported() |
821 | + else: |
822 | + return self.version_component_as_revision(package, version, tarballs[0][1]) |
823 | + |
824 | + def version_component_as_revision(self, package, version, component, tarballs=None): |
825 | assert isinstance(version, str) |
826 | - for tag_name in self.possible_tag_names(version): |
827 | - if self._has_version(tag_name, tarballs): |
828 | + for tag_name in self.possible_tag_names(version, component=component): |
829 | + if self._has_version_component(tag_name, tarballs): |
830 | return self.branch.tags.lookup_tag(tag_name) |
831 | - tag_name = self.tag_name(version) |
832 | + tag_name = self.tag_name(version, component=component) |
833 | try: |
834 | return self.branch.tags.lookup_tag(tag_name) |
835 | except NoSuchTag: |
836 | raise PackageVersionNotPresent(package, version, self) |
837 | |
838 | def has_version(self, package, version, tarballs=None): |
839 | + if tarballs is None: |
840 | + return self.has_version_component(package, version, component=None) |
841 | + elif len(tarballs) > 1: |
842 | + raise MultipleUpstreamTarballsNotSupported() |
843 | + else: |
844 | + return self.has_version_component(package, version, tarballs[0][1], |
845 | + tarballs[0][2]) |
846 | + |
847 | + def has_version_component(self, package, version, component, md5=None): |
848 | assert isinstance(version, str), str(type(version)) |
849 | - for tag_name in self.possible_tag_names(version): |
850 | - if self._has_version(tag_name, tarballs=tarballs): |
851 | + for tag_name in self.possible_tag_names(version, component=component): |
852 | + if self._has_version_component(tag_name, md5=md5): |
853 | return True |
854 | return False |
855 | |
856 | - def possible_tag_names(self, version): |
857 | + def possible_tag_names(self, version, component): |
858 | assert isinstance(version, str) |
859 | - tags = [self.tag_name(version), |
860 | - self.tag_name(version, distro="debian"), |
861 | - self.tag_name(version, distro="ubuntu"), |
862 | - "upstream/%s" % version] |
863 | + tags = [self.tag_name(version, component=component), |
864 | + self.tag_name(version, component=component, distro="debian"), |
865 | + self.tag_name(version, component=component, distro="ubuntu"), |
866 | + ] |
867 | + if component is None: |
868 | + # compatibility with git-buildpackage |
869 | + tags += ["upstream/%s" % version] |
870 | return tags |
871 | |
872 | def has_pristine_tar_delta(self, rev): |
873 | @@ -302,19 +337,3 @@ |
874 | return make_pristine_tar_delta(dest, tarball_path) |
875 | finally: |
876 | shutil.rmtree(tmpdir) |
877 | - |
878 | - def create_delta_revprops(self, tree, tarball): |
879 | - """Create the revision properties with the pristine tar delta. |
880 | - |
881 | - :param tree: Bazaar Tree to diff against |
882 | - :param tarball: The pristine tarball |
883 | - :return: Dictionary with extra revision properties |
884 | - """ |
885 | - ret = {} |
886 | - delta = self.make_pristine_tar_delta(tree, tarball) |
887 | - uuencoded = standard_b64encode(delta) |
888 | - if tarball.endswith(".tar.bz2"): |
889 | - ret["deb-pristine-delta-bz2"] = uuencoded |
890 | - else: |
891 | - ret["deb-pristine-delta"] = uuencoded |
892 | - return ret |
893 | |
894 | === modified file 'util.py' |
895 | --- util.py 2011-06-15 19:09:24 +0000 |
896 | +++ util.py 2011-06-27 10:36:00 +0000 |
897 | @@ -209,19 +209,22 @@ |
898 | return changes |
899 | |
900 | |
901 | -def tarball_name(package, version, format=None): |
902 | +def tarball_name(package, version, component=None, format=None): |
903 | """Return the name of the .orig.tar.gz for the given package and version. |
904 | |
905 | :param package: the name of the source package. |
906 | :param version: the upstream version of the package. |
907 | + :param component: Component name (None for base) |
908 | :param format: the format for the tarball. If None then 'gz' will be |
909 | used. You probably want on of 'gz', 'bz2', or 'lzma'. |
910 | :return: a string that is the name of the upstream tarball to use. |
911 | """ |
912 | if format is None: |
913 | format = 'gz' |
914 | - return "%s_%s.orig.tar.%s" % (package, str(version), format) |
915 | - |
916 | + name = "%s_%s.orig" % (package, str(version)) |
917 | + if component is not None: |
918 | + name += "-" + component |
919 | + return "%s.tar.%s" % (name, format) |
920 | |
921 | |
922 | def suite_to_distribution(suite): |