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

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
Reviewer Review Type Date Requested Status
James Westby Approve
Review via email: mp+65955@code.launchpad.net

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_version which was trivial
 * Pull some duplicate code into can_pull_upstream_from_branch

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):

Subscribers

People subscribed via source and target branches