Merge lp:~jelmer/bzr-builddeb/multiple-upstream-tarballs-pt1 into lp:bzr-builddeb
- multiple-upstream-tarballs-pt1
- Merge into trunk
Proposed by
Jelmer Vernooij
Status: | Merged |
---|---|
Approved by: | James Westby |
Approved revision: | 573 |
Merged at revision: | 570 |
Proposed branch: | lp:~jelmer/bzr-builddeb/multiple-upstream-tarballs-pt1 |
Merge into: | lp:bzr-builddeb |
Diff against target: |
601 lines (+141/-105) 8 files modified
cmds.py (+30/-24) dh_make.py (+11/-5) errors.py (+4/-3) source_distiller.py (+6/-2) tests/test_upstream.py (+33/-18) upstream/__init__.py (+55/-51) upstream/branch.py (+1/-1) upstream/pristinetar.py (+1/-1) |
To merge this branch: | bzr merge lp:~jelmer/bzr-builddeb/multiple-upstream-tarballs-pt1 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
James Westby | Approve | ||
Review via email: mp+64551@code.launchpad.net |
Commit message
Description of the change
Initial work on supporting multiple upstream tarballs in bzr-builddeb.
This updates the UpstreamSource interface to return multiple paths for upstream tarballs and updates the AptSource and GetOrigSource implementations to actually return multiple tarballs.
Merging multiple upstream tarballs and extracting/
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-03 12:17:42 +0000 |
3 | +++ cmds.py 2011-06-14 14:11:23 +0000 |
4 | @@ -69,6 +69,7 @@ |
5 | BuildFailedError, |
6 | DchError, |
7 | MissingChangelogError, |
8 | + MultipleUpstreamTarballsNotSupported, |
9 | NoPreviousUpload, |
10 | PackageVersionNotPresent, |
11 | StrictBuildFailed, |
12 | @@ -553,45 +554,50 @@ |
13 | 'merge had completed failed. Add the new changelog ' |
14 | 'entry yourself, review the merge, and then commit.') |
15 | |
16 | - def _do_merge(self, tree, tarball_filename, package, version, |
17 | + def _do_merge(self, tree, tarball_filenames, package, version, |
18 | current_version, upstream_branch, upstream_revision, merge_type, |
19 | force): |
20 | db = DistributionBranch(tree.branch, None, tree=tree) |
21 | dbs = DistributionBranchSet() |
22 | dbs.add_branch(db) |
23 | - conflicts = db.merge_upstream(tarball_filename, package, version, |
24 | + if len(tarball_filenames) > 1: |
25 | + raise MultipleUpstreamTarballsNotSupported() |
26 | + conflicts = db.merge_upstream(tarball_filenames[0], package, version, |
27 | current_version, upstream_branch=upstream_branch, |
28 | upstream_revision=upstream_revision, |
29 | merge_type=merge_type, force=force) |
30 | return conflicts |
31 | |
32 | - def _fetch_tarball(self, package, version, orig_dir, location, v3): |
33 | + def _fetch_tarball(self, package, version, orig_dir, locations, v3): |
34 | from bzrlib.plugins.builddeb.repack_tarball import repack_tarball |
35 | + ret = [] |
36 | format = None |
37 | - if v3: |
38 | - if location.endswith(".tar.bz2") or location.endswith(".tbz2"): |
39 | - format = "bz2" |
40 | - dest_name = tarball_name(package, version, format=format) |
41 | - tarball_filename = os.path.join(orig_dir, dest_name) |
42 | - try: |
43 | - repack_tarball(location, dest_name, target_dir=orig_dir, |
44 | - force_gz=not v3) |
45 | - except FileExists: |
46 | - raise BzrCommandError("The target file %s already exists, and is either " |
47 | - "different to the new upstream tarball, or they " |
48 | - "are of different formats. Either delete the target " |
49 | - "file, or use it as the argument to import." |
50 | - % dest_name) |
51 | - return tarball_filename |
52 | + for location in locations: |
53 | + if v3: |
54 | + if location.endswith(".tar.bz2") or location.endswith(".tbz2"): |
55 | + format = "bz2" |
56 | + dest_name = tarball_name(package, version, format=format) |
57 | + tarball_filename = os.path.join(orig_dir, dest_name) |
58 | + try: |
59 | + repack_tarball(location, dest_name, target_dir=orig_dir, |
60 | + force_gz=not v3) |
61 | + except FileExists: |
62 | + raise BzrCommandError("The target file %s already exists, and is either " |
63 | + "different to the new upstream tarball, or they " |
64 | + "are of different formats. Either delete the target " |
65 | + "file, or use it as the argument to import." |
66 | + % dest_name) |
67 | + ret.append(tarball_filename) |
68 | + return ret |
69 | |
70 | def _get_tarball(self, config, tree, package, version, upstream_branch, |
71 | - upstream_revision, v3, location): |
72 | + upstream_revision, v3, locations): |
73 | orig_dir = config.orig_dir or default_orig_dir |
74 | orig_dir = os.path.join(tree.basedir, orig_dir) |
75 | if not os.path.exists(orig_dir): |
76 | os.makedirs(orig_dir) |
77 | return self._fetch_tarball(package, version, orig_dir, |
78 | - location, v3) |
79 | + locations, v3) |
80 | |
81 | def _get_changelog_info(self, tree, last_version, package, distribution): |
82 | current_version = last_version |
83 | @@ -738,15 +744,15 @@ |
84 | (version, upstream_branch_source)) |
85 | if need_upstream_tarball: |
86 | target_dir = tempfile.mkdtemp() # FIXME: Cleanup? |
87 | - location = primary_upstream_source.fetch_tarball( |
88 | + locations = primary_upstream_source.fetch_tarball( |
89 | package, version, target_dir) |
90 | source_format = get_source_format(tree) |
91 | v3 = (source_format in [ |
92 | FORMAT_3_0_QUILT, FORMAT_3_0_NATIVE]) |
93 | - tarball_filename = self._get_tarball(config, tree, package, |
94 | + tarball_filenames = self._get_tarball(config, tree, package, |
95 | version, upstream_branch, upstream_revision, v3, |
96 | - location) |
97 | - conflicts = self._do_merge(tree, tarball_filename, package, |
98 | + locations) |
99 | + conflicts = self._do_merge(tree, tarball_filenames, package, |
100 | version, current_version, upstream_branch, upstream_revision, |
101 | merge_type, force) |
102 | if current_version is not None and Version(current_version) >= Version(version): |
103 | |
104 | === modified file 'dh_make.py' |
105 | --- dh_make.py 2011-02-02 18:33:23 +0000 |
106 | +++ dh_make.py 2011-06-14 14:11:23 +0000 |
107 | @@ -13,6 +13,7 @@ |
108 | |
109 | from bzrlib.plugins.builddeb import ( |
110 | default_orig_dir, |
111 | + errors, |
112 | import_dsc, |
113 | upstream, |
114 | util, |
115 | @@ -50,7 +51,7 @@ |
116 | return tree |
117 | |
118 | |
119 | -def _get_tarball(tree, tarball, package_name, version, use_v3=False): |
120 | +def _get_tarballs(tree, tarball, package_name, version, use_v3=False): |
121 | from bzrlib.plugins.builddeb.repack_tarball import repack_tarball |
122 | config = util.debuild_config(tree, tree) |
123 | orig_dir = config.orig_dir or default_orig_dir |
124 | @@ -62,14 +63,16 @@ |
125 | if tarball.endswith(".tar.bz2") or tarball.endswith(".tbz2"): |
126 | format = "bz2" |
127 | dest_name = util.tarball_name(package_name, version, format=format) |
128 | - tarball_filename = os.path.join(orig_dir, dest_name) |
129 | trace.note("Fetching tarball") |
130 | repack_tarball(tarball, dest_name, target_dir=orig_dir, |
131 | force_gz=not use_v3) |
132 | provider = upstream.UpstreamProvider(package_name, version, |
133 | orig_dir, []) |
134 | - provider.provide(os.path.join(tree.basedir, "..")) |
135 | - return tarball_filename, util.md5sum_filename(tarball_filename) |
136 | + orig_files = provider.provide(os.path.join(tree.basedir, "..")) |
137 | + ret = [] |
138 | + for filename in orig_files: |
139 | + ret.append((filename, util.md5sum_filename(filename))) |
140 | + return ret |
141 | |
142 | |
143 | def import_upstream(tarball, package_name, version, use_v3=False): |
144 | @@ -78,12 +81,15 @@ |
145 | parents = [tree.branch.last_revision()] |
146 | else: |
147 | parents = [] |
148 | - tarball_filename, md5sum = _get_tarball(tree, tarball, |
149 | + tarball_filenames = _get_tarballs(tree, tarball, |
150 | package_name, version, use_v3=use_v3) |
151 | db = import_dsc.DistributionBranch(tree.branch, tree.branch, tree=tree, |
152 | upstream_tree=tree) |
153 | dbs = import_dsc.DistributionBranchSet() |
154 | dbs.add_branch(db) |
155 | + if len(tarball_filenames) > 1: |
156 | + raise errors.MultipleUpstreamTarballsNotSupported() |
157 | + (tarball_filename, md5sum) = tarball_filenames[0] |
158 | db.import_upstream_tarball(tarball_filename, version, parents, md5sum=md5sum) |
159 | return tree |
160 | |
161 | |
162 | === modified file 'errors.py' |
163 | --- errors.py 2011-06-09 21:43:07 +0000 |
164 | +++ errors.py 2011-06-14 14:11:23 +0000 |
165 | @@ -34,10 +34,11 @@ |
166 | |
167 | |
168 | class MissingUpstreamTarball(BzrError): |
169 | - _fmt = "Unable to find the needed upstream tarball: %(tarball_name)s." |
170 | + _fmt = ("Unable to find the needed upstream tarball for package %(package)s, " |
171 | + "version %(version)s.") |
172 | |
173 | - def __init__(self, tarball_name): |
174 | - BzrError.__init__(self, tarball_name=tarball_name) |
175 | + def __init__(self, package, version): |
176 | + BzrError.__init__(self, package=package, version=version) |
177 | |
178 | |
179 | class TarFailed(BzrError): |
180 | |
181 | === modified file 'source_distiller.py' |
182 | --- source_distiller.py 2010-03-11 23:44:57 +0000 |
183 | +++ source_distiller.py 2011-06-14 14:11:23 +0000 |
184 | @@ -26,6 +26,7 @@ |
185 | from bzrlib import errors as bzr_errors |
186 | |
187 | from bzrlib.plugins.builddeb.errors import ( |
188 | + MultipleUpstreamTarballsNotSupported, |
189 | TarFailed, |
190 | ) |
191 | from bzrlib.plugins.builddeb.util import ( |
192 | @@ -121,11 +122,14 @@ |
193 | if parent_dir != '' and not os.path.exists(parent_dir): |
194 | os.makedirs(parent_dir) |
195 | if not self.use_existing: |
196 | - tarball = self.upstream_provider.provide(parent_dir) |
197 | + tarballs = self.upstream_provider.provide(parent_dir) |
198 | + if len(tarballs) > 1: |
199 | + raise MultipleUpstreamTarballsNotSupported() |
200 | + tarball = tarballs[0] |
201 | # Extract it to the right place |
202 | tempdir = tempfile.mkdtemp(prefix='builddeb-merge-') |
203 | try: |
204 | - ret = subprocess.call(['tar','-C',tempdir,'-xf',tarball], |
205 | + ret = subprocess.call(['tar', '-C', tempdir, '-xf', tarball], |
206 | preexec_fn=subprocess_setup) |
207 | if ret != 0: |
208 | raise TarFailed("uncompress", tarball) |
209 | |
210 | === modified file 'tests/test_upstream.py' |
211 | --- tests/test_upstream.py 2011-06-14 00:32:04 +0000 |
212 | +++ tests/test_upstream.py 2011-06-14 14:11:23 +0000 |
213 | @@ -186,6 +186,21 @@ |
214 | self.assertEqual("apackage", sources.lookup_package) |
215 | self.assertEqual(0, caller.called) |
216 | |
217 | + def test_apt_provider_multiple_tarballs(self): |
218 | + caller = MockAptCaller(work=True) |
219 | + sources = MockSources(["0.1-1", "0.2-1"], |
220 | + [[("checksum", 0L, "apackage_0.1.orig.tar.gz", "tar")], |
221 | + [("checksum", 0L, "apackage_0.2.orig.tar.bz2", "tar"), |
222 | + ("checksum", 1L, "apackage_0.2.orig-extra.tar.gz", "tar")]]) |
223 | + apt_pkg = MockAptPkg(sources) |
224 | + src = AptSource() |
225 | + src._run_apt_source = caller.call |
226 | + paths = src.fetch_tarball("apackage", "0.2", "target", |
227 | + _apt_pkg=apt_pkg) |
228 | + self.assertEquals(paths, [ |
229 | + "target/apackage_0.2.orig.tar.bz2", |
230 | + "target/apackage_0.2.orig-extra.tar.gz"]) |
231 | + |
232 | def test_apt_provider_right_version_bz2(self): |
233 | caller = MockAptCaller(work=True) |
234 | sources = MockSources(["0.1-1", "0.2-1"], |
235 | @@ -194,10 +209,9 @@ |
236 | apt_pkg = MockAptPkg(sources) |
237 | src = AptSource() |
238 | src._run_apt_source = caller.call |
239 | - path = src.fetch_tarball("apackage", "0.2", "target", |
240 | + paths = src.fetch_tarball("apackage", "0.2", "target", |
241 | _apt_pkg=apt_pkg) |
242 | - self.assertEquals(path, |
243 | - "target/apackage_0.2.orig.tar.bz2") |
244 | + self.assertEquals(paths, ["target/apackage_0.2.orig.tar.bz2"]) |
245 | |
246 | def test_apt_provider_right_version(self): |
247 | caller = MockAptCaller(work=True) |
248 | @@ -207,10 +221,9 @@ |
249 | apt_pkg = MockAptPkg(sources) |
250 | src = AptSource() |
251 | src._run_apt_source = caller.call |
252 | - path = src.fetch_tarball("apackage", "0.2", "target", |
253 | + paths = src.fetch_tarball("apackage", "0.2", "target", |
254 | _apt_pkg=apt_pkg) |
255 | - self.assertEquals(path, |
256 | - "target/apackage_0.2.orig.tar.gz") |
257 | + self.assertEquals(paths, ["target/apackage_0.2.orig.tar.gz"]) |
258 | self.assertEqual(1, apt_pkg.init_called_times) |
259 | self.assertEqual(1, apt_pkg.get_pkg_source_records_called_times) |
260 | self.assertEqual(1, sources.restart_called_times) |
261 | @@ -276,7 +289,7 @@ |
262 | self._specific_versions.append((package, version, target_dir)) |
263 | if not self._succeed: |
264 | raise PackageVersionNotPresent(package, version, self) |
265 | - return self._tarball_path(package, version, target_dir) |
266 | + return [self._tarball_path(package, version, target_dir)] |
267 | |
268 | def __repr__(self): |
269 | return "%s()" % self.__class__.__name__ |
270 | @@ -377,7 +390,7 @@ |
271 | source = UpstreamBranchSource(self.tree.branch, |
272 | {"1.0": self.tree.branch.last_revision()}) |
273 | os.mkdir("mydir") |
274 | - self.assertEquals("mydir/foo_1.0.orig.tar.gz", |
275 | + self.assertEquals(["mydir/foo_1.0.orig.tar.gz"], |
276 | source.fetch_tarball("foo", "1.0", "mydir")) |
277 | self.assertPathExists("mydir/foo_1.0.orig.tar.gz") |
278 | |
279 | @@ -443,7 +456,7 @@ |
280 | {"1.0": self.tree.branch.last_revision()}) |
281 | self.assertIs(None, source._upstream_branch) |
282 | os.mkdir("mydir") |
283 | - self.assertEquals("mydir/foo_1.0.orig.tar.gz", |
284 | + self.assertEquals(["mydir/foo_1.0.orig.tar.gz"], |
285 | source.fetch_tarball("foo", "1.0", "mydir")) |
286 | self.assertPathExists("mydir/foo_1.0.orig.tar.gz") |
287 | self.assertIsNot(None, source._upstream_branch) |
288 | @@ -721,7 +734,7 @@ |
289 | def test_fetch_tarball(self): |
290 | source = TarfileSource("foo-1.0.tar.gz", "1.0") |
291 | os.mkdir("bar") |
292 | - self.assertEquals("bar/foo_1.0.orig.tar.gz", |
293 | + self.assertEquals(["bar/foo_1.0.orig.tar.gz"], |
294 | source.fetch_tarball("foo", "1.0", "bar")) |
295 | self.assertPathExists("bar/foo_1.0.orig.tar.gz") |
296 | |
297 | @@ -731,7 +744,7 @@ |
298 | zf.close() |
299 | source = TarfileSource("bla-2.0.zip", "2.0") |
300 | os.mkdir("bar") |
301 | - self.assertEquals("bar/foo_2.0.orig.tar.gz", |
302 | + self.assertEquals(["bar/foo_2.0.orig.tar.gz"], |
303 | source.fetch_tarball("foo", "2.0", "bar")) |
304 | self.assertPathExists("bar/foo_2.0.orig.tar.gz") |
305 | |
306 | @@ -748,7 +761,7 @@ |
307 | bz2.BZ2File("foo-1.0.tar.bz2").close() |
308 | source = TarfileSource("foo-1.0.tar.bz2", "1.0") |
309 | os.mkdir("bar") |
310 | - self.assertEquals("bar/foo_1.0.orig.tar.gz", |
311 | + self.assertEquals(["bar/foo_1.0.orig.tar.gz"], |
312 | source.fetch_tarball("foo", "1.0", "bar")) |
313 | self.assertPathExists("bar/foo_1.0.orig.tar.gz") |
314 | gzip.open("bar/foo_1.0.orig.tar.gz").close() |
315 | @@ -761,7 +774,7 @@ |
316 | pass |
317 | |
318 | def provide(self, target_dir): |
319 | - raise MissingUpstreamTarball("test_tarball") |
320 | + raise MissingUpstreamTarball("test_tarball", "1.0") |
321 | |
322 | |
323 | class _TouchUpstreamProvider(UpstreamProvider): |
324 | @@ -771,9 +784,11 @@ |
325 | self.desired_tarball_name = desired_tarball_name |
326 | |
327 | def provide(self, target_dir): |
328 | - f = open(os.path.join(target_dir, self.desired_tarball_name), "wb") |
329 | + path = os.path.join(target_dir, self.desired_tarball_name) |
330 | + f = open(path, "wb") |
331 | f.write("I am a tarball, honest\n") |
332 | f.close() |
333 | + return [path] |
334 | |
335 | |
336 | class _SimpleUpstreamProvider(UpstreamProvider): |
337 | @@ -785,11 +800,11 @@ |
338 | self.store_dir = store_dir |
339 | |
340 | def provide(self, target_dir): |
341 | - path = (self.already_exists_in_target(target_dir) |
342 | + paths = (self.already_exists_in_target(target_dir) |
343 | or self.provide_from_store_dir(target_dir)) |
344 | - if path is not None: |
345 | - return path |
346 | - raise MissingUpstreamTarball(self._tarball_names()[0]) |
347 | + if paths is not None: |
348 | + return paths |
349 | + raise MissingUpstreamTarball(self.package, self.version) |
350 | |
351 | |
352 | class ExtractTarballVersionTests(TestCase): |
353 | |
354 | === modified file 'upstream/__init__.py' |
355 | --- upstream/__init__.py 2011-06-13 22:10:22 +0000 |
356 | +++ upstream/__init__.py 2011-06-14 14:11:23 +0000 |
357 | @@ -85,7 +85,7 @@ |
358 | :param package: Name of the package |
359 | :param version: Version string of the version to fetch |
360 | :param target_dir: Directory in which to store the tarball |
361 | - :return: Path of the fetched tarball |
362 | + :return: Paths of the fetched tarballs |
363 | """ |
364 | raise NotImplementedError(self.fetch_tarball) |
365 | |
366 | @@ -126,14 +126,17 @@ |
367 | lookup = get_fn(sources, 'lookup', 'Lookup') |
368 | while lookup(package): |
369 | version = get_fn(sources, 'version', 'Version') |
370 | + filenames = [] |
371 | for (checksum, size, filename, filekind) in sources.files: |
372 | if filekind != "tar": |
373 | continue |
374 | filename = os.path.basename(filename) |
375 | if filename.startswith("%s_%s.orig" % (package, upstream_version)): |
376 | - if self._run_apt_source(package, version, target_dir): |
377 | - return os.path.join(target_dir, filename) |
378 | - break |
379 | + filenames.append(filename) |
380 | + if filenames: |
381 | + if self._run_apt_source(package, version, target_dir): |
382 | + return [os.path.join(target_dir, filename) |
383 | + for filename in filenames] |
384 | note("apt could not find the needed tarball.") |
385 | raise PackageVersionNotPresent(package, upstream_version, self) |
386 | |
387 | @@ -157,8 +160,7 @@ |
388 | self.tree = tree |
389 | self.larstiq = larstiq |
390 | |
391 | - def _get_orig_source(self, source_dir, desired_tarball_names, |
392 | - target_dir): |
393 | + def _get_orig_source(self, source_dir, prefix, target_dir): |
394 | note("Trying to use get-orig-source to retrieve needed tarball.") |
395 | command = ["make", "-f", "debian/rules", "get-orig-source"] |
396 | proc = subprocess.Popen(command, cwd=source_dir) |
397 | @@ -166,13 +168,18 @@ |
398 | if ret != 0: |
399 | note("Trying to run get-orig-source rule failed") |
400 | return None |
401 | - for desired_tarball_name in desired_tarball_names: |
402 | - fetched_tarball = os.path.join(source_dir, desired_tarball_name) |
403 | + filenames = [] |
404 | + for filename in os.listdir(source_dir): |
405 | + if not filename.startswith(prefix): |
406 | + continue |
407 | + fetched_tarball = os.path.join(source_dir, filename) |
408 | if os.path.exists(fetched_tarball): |
409 | - repack_tarball(fetched_tarball, desired_tarball_name, |
410 | + repack_tarball(fetched_tarball, filename, |
411 | target_dir=target_dir, force_gz=False) |
412 | - return fetched_tarball |
413 | - note("get-orig-source did not create %s", desired_tarball_name) |
414 | + filenames.append(os.path.join(target_dir, filename)) |
415 | + if filenames: |
416 | + return filenames |
417 | + note("get-orig-source did not create file with prefix %s", prefix) |
418 | return None |
419 | |
420 | def fetch_tarball(self, package, version, target_dir): |
421 | @@ -182,9 +189,6 @@ |
422 | rules_name = 'debian/rules' |
423 | rules_id = self.tree.path2id(rules_name) |
424 | if rules_id is not None: |
425 | - desired_tarball_names = [tarball_name(package, version), |
426 | - tarball_name(package, version, 'bz2'), |
427 | - tarball_name(package, version, 'lzma')] |
428 | tmpdir = tempfile.mkdtemp(prefix="builddeb-get-orig-source-") |
429 | try: |
430 | base_export_dir = os.path.join(tmpdir, "export") |
431 | @@ -193,11 +197,11 @@ |
432 | os.mkdir(export_dir) |
433 | export_dir = os.path.join(export_dir, "debian") |
434 | export(self.tree, export_dir, format="dir") |
435 | - tarball_path = self._get_orig_source(base_export_dir, |
436 | - desired_tarball_names, target_dir) |
437 | - if tarball_path is None: |
438 | + tarball_paths = self._get_orig_source(base_export_dir, |
439 | + "%s_%s.orig" % (package, version), target_dir) |
440 | + if tarball_paths is None: |
441 | raise PackageVersionNotPresent(package, version, self) |
442 | - return tarball_path |
443 | + return tarball_paths |
444 | finally: |
445 | shutil.rmtree(tmpdir) |
446 | note("No debian/rules file to try and use for a get-orig-source rule") |
447 | @@ -279,7 +283,7 @@ |
448 | if r != 0: |
449 | note("uscan could not find the needed tarball.") |
450 | raise PackageVersionNotPresent(package, version, self) |
451 | - return self._tarball_path(package, version, target_dir) |
452 | + return [self._tarball_path(package, version, target_dir)] |
453 | |
454 | |
455 | class SelfSplitSource(UpstreamSource): |
456 | @@ -307,13 +311,13 @@ |
457 | "to create the tarball") |
458 | tarball_path = self._tarball_path(package, version, target_dir) |
459 | self._split(package, version, tarball_path) |
460 | - return tarball_path |
461 | + return [tarball_path] |
462 | |
463 | |
464 | class StackedUpstreamSource(UpstreamSource): |
465 | """An upstream source that checks a list of other upstream sources. |
466 | |
467 | - The first source that can provide a tarball, wins. |
468 | + The first source that can provide a tarball, wins. |
469 | """ |
470 | |
471 | def __init__(self, sources): |
472 | @@ -325,12 +329,11 @@ |
473 | def fetch_tarball(self, package, version, target_dir): |
474 | for source in self._sources: |
475 | try: |
476 | - path = source.fetch_tarball(package, version, target_dir) |
477 | + paths = source.fetch_tarball(package, version, target_dir) |
478 | except PackageVersionNotPresent: |
479 | pass |
480 | else: |
481 | - assert isinstance(path, basestring) |
482 | - return path |
483 | + return paths |
484 | raise PackageVersionNotPresent(package, version, self) |
485 | |
486 | def get_latest_version(self, package, version): |
487 | @@ -364,7 +367,7 @@ |
488 | self.source = StackedUpstreamSource(sources) |
489 | |
490 | def provide(self, target_dir): |
491 | - """Provide the upstream tarball any way possible. |
492 | + """Provide the upstream tarball(s) any way possible. |
493 | |
494 | Call this to place the correctly named tarball in to target_dir, |
495 | through means possible. |
496 | @@ -396,44 +399,45 @@ |
497 | if not os.path.exists(self.store_dir): |
498 | os.makedirs(self.store_dir) |
499 | try: |
500 | - path = self.source.fetch_tarball(self.package, |
501 | + paths = self.source.fetch_tarball(self.package, |
502 | self.version, self.store_dir) |
503 | except PackageVersionNotPresent: |
504 | - raise MissingUpstreamTarball(self._tarball_names()[0]) |
505 | - assert isinstance(path, basestring) |
506 | + raise MissingUpstreamTarball(self.package, self.version) |
507 | + assert isinstance(paths, list) |
508 | else: |
509 | note("Using the upstream tarball that is present in %s" % |
510 | self.store_dir) |
511 | - path = self.provide_from_store_dir(target_dir) |
512 | - assert path is not None |
513 | - return path |
514 | + paths = self.provide_from_store_dir(target_dir) |
515 | + assert paths is not None |
516 | + return paths |
517 | + |
518 | + def _gather_orig_files(self, path): |
519 | + prefix = "%s_%s.orig" % (self.package, self.version) |
520 | + ret = [] |
521 | + path = os.path.abspath(path) |
522 | + if not os.path.isdir(path): |
523 | + return None |
524 | + for filename in os.listdir(path): |
525 | + if filename.startswith(prefix): |
526 | + ret.append(os.path.join(path, filename)) |
527 | + if ret: |
528 | + return ret |
529 | + return None |
530 | |
531 | def already_exists_in_target(self, target_dir): |
532 | - for tarball_name in self._tarball_names(): |
533 | - path = os.path.join(target_dir, tarball_name) |
534 | - if os.path.exists(path): |
535 | - return path |
536 | - return None |
537 | + return self._gather_orig_files(target_dir) |
538 | |
539 | def already_exists_in_store(self): |
540 | - for tarball_name in self._tarball_names(): |
541 | - path = os.path.join(self.store_dir, tarball_name) |
542 | - if os.path.exists(path): |
543 | - return path |
544 | - return None |
545 | + return self._gather_orig_files(self.store_dir) |
546 | |
547 | def provide_from_store_dir(self, target_dir): |
548 | - path = self.already_exists_in_store() |
549 | - if path is not None: |
550 | + paths = self.already_exists_in_store() |
551 | + if paths is None: |
552 | + return None |
553 | + for path in paths: |
554 | repack_tarball(path, os.path.basename(path), |
555 | target_dir=target_dir, force_gz=False) |
556 | - return path |
557 | - return path |
558 | - |
559 | - def _tarball_names(self): |
560 | - return [tarball_name(self.package, self.version), |
561 | - tarball_name(self.package, self.version, format='bz2'), |
562 | - tarball_name(self.package, self.version, format='lzma')] |
563 | + return paths |
564 | |
565 | |
566 | def extract_tarball_version(path, packagename): |
567 | @@ -473,7 +477,7 @@ |
568 | raise PackageVersionNotPresent(package, version, self) |
569 | dest_name = tarball_name(package, version) |
570 | repack_tarball(self.path, dest_name, target_dir=target_dir, force_gz=True) |
571 | - return os.path.join(target_dir, dest_name) |
572 | + return [os.path.join(target_dir, dest_name)] |
573 | |
574 | def get_latest_version(self, package, version): |
575 | if self.version is not None: |
576 | |
577 | === modified file 'upstream/branch.py' |
578 | --- upstream/branch.py 2011-04-28 15:46:43 +0000 |
579 | +++ upstream/branch.py 2011-06-14 14:11:23 +0000 |
580 | @@ -268,7 +268,7 @@ |
581 | export(rev_tree, target_filename, 'tgz', tarball_base) |
582 | finally: |
583 | self.upstream_branch.unlock() |
584 | - return target_filename |
585 | + return [target_filename] |
586 | |
587 | def __repr__(self): |
588 | return "<%s for %r>" % (self.__class__.__name__, |
589 | |
590 | === modified file 'upstream/pristinetar.py' |
591 | --- upstream/pristinetar.py 2011-06-03 12:34:57 +0000 |
592 | +++ upstream/pristinetar.py 2011-06-14 14:11:23 +0000 |
593 | @@ -145,7 +145,7 @@ |
594 | raise PackageVersionNotPresent(package, version, self) |
595 | except PerFileTimestampsNotSupported: |
596 | raise PackageVersionNotPresent(package, version, self) |
597 | - return target_filename |
598 | + return [target_filename] |
599 | |
600 | def _has_version(self, tag_name, md5=None): |
601 | if not self.branch.tags.has_tag(tag_name): |