Merge lp:~jelmer/bzr-builddeb/recommend-lplib into lp:~bzr-builddeb-hackers/bzr-builddeb/trunk-old
- recommend-lplib
- Merge into trunk-old
Proposed by
Jelmer Vernooij
Status: | Superseded |
---|---|
Proposed branch: | lp:~jelmer/bzr-builddeb/recommend-lplib |
Merge into: | lp:~bzr-builddeb-hackers/bzr-builddeb/trunk-old |
Diff against target: | None lines |
To merge this branch: | bzr merge lp:~jelmer/bzr-builddeb/recommend-lplib |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Bzr-builddeb-hackers | Pending | ||
Review via email:
|
This proposal has been superseded by a proposal from 2009-08-04.
Commit message
Description of the change
To post a comment you must log in.
Revision history for this message
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Jelmer Vernooij (jelmer) wrote : | # |
Unmerged revisions
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 2009-07-26 16:21:15 +0000 |
3 | +++ cmds.py 2009-07-26 18:21:49 +0000 |
4 | @@ -34,6 +34,7 @@ |
5 | urlutils, |
6 | ) |
7 | from bzrlib.branch import Branch |
8 | +from bzrlib.bzrdir import BzrDir |
9 | from bzrlib.commands import Command |
10 | from bzrlib.errors import (BzrCommandError, |
11 | NoWorkingTree, |
12 | @@ -73,7 +74,11 @@ |
13 | MergeModeDistiller, |
14 | NativeSourceDistiller, |
15 | ) |
16 | -from bzrlib.plugins.builddeb.upstream import UpstreamProvider, UpstreamBranchSource |
17 | +from bzrlib.plugins.builddeb.upstream import ( |
18 | + UpstreamProvider, |
19 | + UpstreamBranchSource, |
20 | + get_upstream_sources, |
21 | + ) |
22 | from bzrlib.plugins.builddeb.util import (find_changelog, |
23 | get_export_upstream_revision, |
24 | find_last_distribution, |
25 | @@ -211,12 +216,7 @@ |
26 | is_local = urlparse.urlsplit(location)[0] in ('', 'file') |
27 | if is_local: |
28 | os.chdir(location) |
29 | - try: |
30 | - tree, _ = WorkingTree.open_containing(location) |
31 | - branch = tree.branch |
32 | - except NoWorkingTree: |
33 | - tree = None |
34 | - branch, _ = Branch.open_containing(location) |
35 | + tree, branch, relpath = BzrDir.open_containing_tree_or_branch(location) |
36 | return tree, branch, is_local |
37 | |
38 | def _get_build_tree(self, revision, tree, branch): |
39 | @@ -375,10 +375,11 @@ |
40 | export_upstream_revision, config, |
41 | changelog.version) |
42 | |
43 | - upstream_provider = UpstreamProvider(tree, branch, |
44 | + upstream_provider = UpstreamProvider( |
45 | changelog.package, changelog.version, |
46 | - orig_dir, larstiq=larstiq, upstream_branch=upstream_branch, |
47 | - upstream_revision=upstream_revision, allow_split=split) |
48 | + orig_dir, get_upstream_sources(tree, branch, |
49 | + larstiq=larstiq, upstream_branch=upstream_branch, |
50 | + upstream_revision=upstream_revision, allow_split=split)) |
51 | |
52 | if merge: |
53 | distiller_cls = MergeModeDistiller |
54 | @@ -392,8 +393,8 @@ |
55 | is_working_tree=working_tree) |
56 | |
57 | build_source_dir = os.path.join(build_dir, |
58 | - changelog.package + "-" |
59 | - + changelog.version.upstream_version) |
60 | + "%s-%s" % (changelog.package, |
61 | + changelog.version.upstream_version)) |
62 | |
63 | builder = DebBuild(distiller, build_source_dir, build_cmd, |
64 | use_existing=use_existing) |
65 | @@ -780,9 +781,9 @@ |
66 | orig_dir = config.orig_dir |
67 | if orig_dir is None: |
68 | orig_dir = default_orig_dir |
69 | - upstream_provider = UpstreamProvider(t, t.branch, |
70 | - changelog.package, changelog.version.upstream_version, |
71 | - orig_dir, larstiq=larstiq) |
72 | + upstream_provider = UpstreamProvider(changelog.package, |
73 | + changelog.version.upstream_version, orig_dir, |
74 | + get_upstream_sources(t, t.branch, larstiq=larstiq)) |
75 | |
76 | distiller = MergeModeDistiller(t, upstream_provider, |
77 | larstiq=larstiq) |
78 | |
79 | === modified file 'debian/control' |
80 | --- debian/control 2009-03-31 14:48:29 +0000 |
81 | +++ debian/control 2009-07-26 18:35:25 +0000 |
82 | @@ -14,6 +14,7 @@ |
83 | Package: bzr-builddeb |
84 | Architecture: all |
85 | Depends: bzr (>= 1.10~), python-debian (>= 0.1.11), python-apt, ${python:Depends}, dpkg-dev, fakeroot, bzrtools (>= 1.2), devscripts, patchutils, pristine-tar |
86 | +Recommends: python-launchpadlib |
87 | Suggests: bzr-svn (>= 0.4.10) |
88 | Provides: bzr-buildpackage |
89 | XB-Python-Version: ${python:Versions} |
90 | |
91 | === modified file 'directory.py' |
92 | --- directory.py 2009-04-15 23:17:50 +0000 |
93 | +++ directory.py 2009-04-16 10:42:12 +0000 |
94 | @@ -86,5 +86,15 @@ |
95 | else: |
96 | return urls[version]["Git"] |
97 | |
98 | + if "Hg" in urls[version]: |
99 | + try: |
100 | + import bzrlib.plugins.hg |
101 | + except ImportError: |
102 | + info("This package uses hg. If you would like to " |
103 | + "access it with bzr then please install bzr-hg" |
104 | + "and re-run the command.") |
105 | + else: |
106 | + return urls[version]["Hg"] |
107 | + |
108 | raise errors.InvalidURL(path=url, |
109 | extra='unsupported VCSes %r found' % urls[version].keys()) |
110 | |
111 | === modified file 'errors.py' |
112 | --- errors.py 2009-03-02 22:36:36 +0000 |
113 | +++ errors.py 2009-04-16 09:30:49 +0000 |
114 | @@ -153,6 +153,14 @@ |
115 | _fmt = "You did not specify a package version." |
116 | |
117 | |
118 | +class PackageVersionNotPresent(BzrError): |
119 | + _fmt = "%(package)s %(version)s was not found in %(upstream)s." |
120 | + |
121 | + def __init__(self, package, version, upstream): |
122 | + BzrError.__init__(self, package=package, version=version, |
123 | + upstream=upstream) |
124 | + |
125 | + |
126 | class UnsupportedRepackFormat(BzrError): |
127 | _fmt = ('Either the file extension of "%(location)s" indicates that ' |
128 | 'it is a format unsupported for repacking or it is a ' |
129 | |
130 | === modified file 'tests/test_upstream.py' |
131 | --- tests/test_upstream.py 2009-07-26 08:05:34 +0000 |
132 | +++ tests/test_upstream.py 2009-07-26 18:21:49 +0000 |
133 | @@ -30,12 +30,15 @@ |
134 | ) |
135 | from bzrlib.plugins.builddeb.errors import ( |
136 | MissingUpstreamTarball, |
137 | + PackageVersionNotPresent, |
138 | ) |
139 | from bzrlib.plugins.builddeb.upstream import ( |
140 | + AptSource, |
141 | + PristineTarSource, |
142 | + StackedUpstreamSource, |
143 | UpstreamProvider, |
144 | UpstreamSource, |
145 | - AptSource, |
146 | - PristineTarSource, |
147 | + UScanSource, |
148 | ) |
149 | from bzrlib.plugins.builddeb.util import ( |
150 | get_parent_dir, |
151 | @@ -43,151 +46,6 @@ |
152 | ) |
153 | |
154 | |
155 | -class MockProvider(UpstreamSource): |
156 | - |
157 | - def create_target(self, path): |
158 | - parent_dir = get_parent_dir(path) |
159 | - if parent_dir != '' and not os.path.exists(parent_dir): |
160 | - os.makedirs(parent_dir) |
161 | - f = open(path, "wb") |
162 | - try: |
163 | - f.write('') |
164 | - finally: |
165 | - f.close() |
166 | - |
167 | - |
168 | -class MockAptProvider(MockProvider): |
169 | - |
170 | - def __init__(self, find=False): |
171 | - self.find = find |
172 | - self.called_times = 0 |
173 | - self.package = None |
174 | - self.upstream_version = None |
175 | - self.target_dir = None |
176 | - |
177 | - def get_specific_version(self, package, upstream_version, target_dir): |
178 | - self.called_times += 1 |
179 | - self.package = package |
180 | - self.upstream_version = upstream_version |
181 | - self.target_dir = target_dir |
182 | - if self.find: |
183 | - self.create_target(os.path.join(target_dir, |
184 | - tarball_name(package, upstream_version))) |
185 | - return self.find |
186 | - |
187 | - |
188 | -class MockUscanProvider(MockProvider): |
189 | - |
190 | - def __init__(self, find=False): |
191 | - self.find = find |
192 | - self.called_times = 0 |
193 | - self.package = None |
194 | - self.upstream_version = None |
195 | - self.watch_file_contents = None |
196 | - self.target_dir = None |
197 | - |
198 | - def provide(self, package, upstream_version, watch_file, target_dir): |
199 | - self.called_times += 1 |
200 | - self.package = package |
201 | - self.upstream_version = upstream_version |
202 | - f = open(watch_file, "rb") |
203 | - try: |
204 | - self.watch_file_contents = f.read() |
205 | - finally: |
206 | - f.close() |
207 | - self.target_dir = target_dir |
208 | - if self.find: |
209 | - self.create_target(os.path.join(target_dir, |
210 | - tarball_name(package, upstream_version))) |
211 | - return self.find |
212 | - |
213 | - |
214 | -class MockPristineProvider(MockProvider): |
215 | - |
216 | - def __init__(self, find=False): |
217 | - self.find = find |
218 | - self.called_times = 0 |
219 | - self.tree = None |
220 | - self.branch = None |
221 | - self.package = None |
222 | - self.upstream_version = None |
223 | - self.target_filename = None |
224 | - |
225 | - def provide(self, tree, branch, package, upstream_version, target_filename): |
226 | - self.called_times += 1 |
227 | - self.tree = tree |
228 | - self.branch = branch |
229 | - self.package = package |
230 | - self.upstream_version = upstream_version |
231 | - self.target_filename = target_filename |
232 | - if self.find: |
233 | - self.create_target(target_filename) |
234 | - return self.find |
235 | - |
236 | - |
237 | -class MockOrigSourceProvider(MockProvider): |
238 | - |
239 | - def __init__(self, find=False): |
240 | - self.find = find |
241 | - self.called_times = 0 |
242 | - self.source_dir = None |
243 | - self.desired_tarball_name = None |
244 | - self.target_dir = None |
245 | - |
246 | - def provide(self, source_dir, desired_tarball_name, |
247 | - target_dir): |
248 | - self.called_times += 1 |
249 | - self.source_dir = source_dir |
250 | - self.desired_tarball_name = desired_tarball_name |
251 | - self.target_dir = target_dir |
252 | - if self.find: |
253 | - self.create_target(os.path.join(target_dir, desired_tarball_name)) |
254 | - return self.find |
255 | - |
256 | - |
257 | -class MockOtherBranchProvider(MockProvider): |
258 | - |
259 | - def __init__(self, find=False): |
260 | - self.find = find |
261 | - self.called_times = 0 |
262 | - self.upstream_branch = None |
263 | - self.upstream_revision = None |
264 | - self.target_filename = None |
265 | - self.tarball_base = None |
266 | - |
267 | - def provide(self, upstream_branch, upstream_revision, target_filename, |
268 | - tarball_base): |
269 | - self.called_times += 1 |
270 | - self.upstream_branch = upstream_branch |
271 | - self.upstream_revision = upstream_revision |
272 | - self.target_filename = target_filename |
273 | - self.tarball_base = tarball_base |
274 | - if self.find: |
275 | - self.create_target(target_filename) |
276 | - return self.find |
277 | - |
278 | - |
279 | -class MockSplitProvider(MockProvider): |
280 | - |
281 | - def __init__(self, find=False): |
282 | - self.find = find |
283 | - self.called_times = 0 |
284 | - self.tree = None |
285 | - self.package = None |
286 | - self.upstream_version = None |
287 | - self.target_filename = None |
288 | - |
289 | - def provide(self, tree, package, upstream_version, target_filename): |
290 | - self.called_times += 1 |
291 | - self.tree = tree |
292 | - self.package = package |
293 | - self.upstream_version = upstream_version |
294 | - self.target_filename = target_filename |
295 | - if self.find: |
296 | - self.create_target(self.target_filename) |
297 | - return self.find |
298 | - |
299 | - |
300 | class MockSources(object): |
301 | |
302 | def __init__(self, versions): |
303 | @@ -227,202 +85,6 @@ |
304 | return self.sources |
305 | |
306 | |
307 | -class UpstreamProviderTests(TestCaseWithTransport): |
308 | - |
309 | - def setUp(self): |
310 | - super(UpstreamProviderTests, self).setUp() |
311 | - self.tree = self.make_branch_and_tree(".") |
312 | - self.branch = self.tree.branch |
313 | - self.package = "package" |
314 | - self.version = Version("0.1-1") |
315 | - self.upstream_version = self.version.upstream_version |
316 | - self.desired_tarball_name = tarball_name(self.package, |
317 | - self.upstream_version) |
318 | - self.tarball_base = "%s-%s" % (self.package, self.upstream_version) |
319 | - self.store_dir = "store" |
320 | - self.provider = UpstreamProvider(self.tree, self.branch, |
321 | - self.package, self.version, self.store_dir) |
322 | - self.provider._sources = [] |
323 | - self.providers = {} |
324 | - self.providers["apt"] = MockAptProvider() |
325 | - self.provider._sources.append(self.providers["apt"]) |
326 | - self.providers["uscan"] = MockUscanProvider() |
327 | - self.provider._sources.append(self.providers["uscan"]) |
328 | - self.providers["pristine"] = MockPristineProvider() |
329 | - self.provider._sources.append(self.providers["pristine"]) |
330 | - self.providers["orig"] = MockOrigSourceProvider() |
331 | - self.provider._sources.append(self.providers["orig"]) |
332 | - self.providers["upstream"] = MockOtherBranchProvider() |
333 | - self.provider._sources.append(self.providers["upstream"]) |
334 | - self.provider._upstream_branch_provider = \ |
335 | - self.providers["upstream"].provide |
336 | - self.providers["split"] = MockSplitProvider() |
337 | - self.provider._sources.append(self.providers["split"]) |
338 | - self.target_dir = "target" |
339 | - self.target_filename = os.path.join(self.target_dir, |
340 | - self.desired_tarball_name) |
341 | - self.store_filename = os.path.join(self.store_dir, |
342 | - tarball_name(self.package, self.version.upstream_version)) |
343 | - |
344 | - def assertProvidersCalled(self, providers): |
345 | - for provider_name, provider in self.providers.items(): |
346 | - if provider_name in providers: |
347 | - self.assertCalledCorrectly(provider_name) |
348 | - else: |
349 | - self.assertEqual(provider.called_times, 0, |
350 | - "%s wasn't expected to be called" % provider_name) |
351 | - |
352 | - def call_provider(self): |
353 | - self.assertEqual(self.provider.provide(self.target_dir), |
354 | - self.target_filename) |
355 | - |
356 | - def test_already_in_target(self): |
357 | - os.makedirs(self.target_dir) |
358 | - f = open(self.target_filename, "wb") |
359 | - f.close() |
360 | - self.call_provider() |
361 | - self.failUnlessExists(self.target_filename) |
362 | - # Should this be copied across? |
363 | - self.failIfExists(self.store_filename) |
364 | - self.assertProvidersCalled({}) |
365 | - |
366 | - def test_already_in_store(self): |
367 | - os.makedirs(self.store_dir) |
368 | - f = open(self.store_filename, "wb") |
369 | - f.close() |
370 | - self.call_provider() |
371 | - self.failUnlessExists(self.target_filename) |
372 | - self.failUnlessExists(self.store_filename) |
373 | - self.assertProvidersCalled({}) |
374 | - |
375 | - def assertCalledCorrectly(self, provider_name): |
376 | - provider = self.providers[provider_name] |
377 | - for attr_name in provider.__dict__: |
378 | - if attr_name in ("find", "provide", "source_dir"): |
379 | - continue |
380 | - if attr_name == "called_times": |
381 | - self.assertEqual(provider.called_times, 1, |
382 | - "%s was not called" % provider_name) |
383 | - continue |
384 | - if attr_name == "target_filename": |
385 | - self.assertEqual(provider.target_filename, |
386 | - self.store_filename) |
387 | - continue |
388 | - if attr_name == "target_dir": |
389 | - self.assertEqual(provider.target_dir, |
390 | - self.store_dir) |
391 | - continue |
392 | - if attr_name == "fetch_dir": |
393 | - self.assertEqual(provider.fetch_dir, |
394 | - os.path.dirname(provider.source_dir)) |
395 | - continue |
396 | - attr = getattr(provider, attr_name) |
397 | - correct_attr = getattr(self, attr_name) |
398 | - self.assertEqual(correct_attr, attr, |
399 | - "%s doesn't match\nexpected: %s\ngot: %s" |
400 | - % (attr_name, correct_attr, attr)) |
401 | - |
402 | - def assertSuccesfulCall(self, provider, other_providers): |
403 | - self.providers[provider].find = True |
404 | - self.call_provider() |
405 | - self.failUnlessExists(self.target_filename) |
406 | - self.failUnlessExists(self.store_filename) |
407 | - self.assertProvidersCalled([provider] + other_providers) |
408 | - |
409 | - def test_from_pristine_tar(self): |
410 | - self.assertSuccesfulCall("pristine", []) |
411 | - |
412 | - def test_from_apt(self): |
413 | - self.assertSuccesfulCall("apt", ["pristine"]) |
414 | - |
415 | - def test_from_uscan(self): |
416 | - self.build_tree(["watch", "debian/", "debian/watch"]) |
417 | - self.tree.add(["watch", "debian/", "debian/watch"]) |
418 | - self.watch_file_contents = "contents of debian/watch\n" |
419 | - self.assertSuccesfulCall("uscan", ["pristine", "apt"]) |
420 | - |
421 | - def test_uscan_not_called_if_not_watch(self): |
422 | - self.build_tree(["watch"]) |
423 | - self.tree.add(["watch"]) |
424 | - self.assertRaises(MissingUpstreamTarball, self.provider.provide, |
425 | - self.target_dir) |
426 | - self.failIfExists(self.target_filename) |
427 | - self.failIfExists(self.store_filename) |
428 | - self.assertProvidersCalled(["pristine", "apt"]) |
429 | - |
430 | - def test_uscan_in_larstiq(self): |
431 | - self.build_tree(["watch", "debian/", "debian/watch"]) |
432 | - self.tree.add(["watch", "debian/", "debian/watch"]) |
433 | - self.watch_file_contents = "contents of watch\n" |
434 | - self.provider.larstiq = True |
435 | - self.assertSuccesfulCall("uscan", ["pristine", "apt"]) |
436 | - |
437 | - def test_from_get_orig_source(self): |
438 | - self.build_tree(["rules", "debian/", "debian/rules"]) |
439 | - self.tree.add(["rules", "debian/", "debian/rules"]) |
440 | - self.watch_file_contents = "contents of debian/rules\n" |
441 | - self.assertSuccesfulCall("orig", ["pristine", "apt"]) |
442 | - |
443 | - def test_get_orig_source_not_called_if_no_rules(self): |
444 | - self.build_tree(["rules"]) |
445 | - self.tree.add(["rules"]) |
446 | - self.assertRaises(MissingUpstreamTarball, self.provider.provide, |
447 | - self.target_dir) |
448 | - self.failIfExists(self.target_filename) |
449 | - self.failIfExists(self.store_filename) |
450 | - self.assertProvidersCalled(["pristine", "apt"]) |
451 | - |
452 | - def test_get_orig_source_in_larstiq(self): |
453 | - self.build_tree(["rules", "debian/", "debian/rules"]) |
454 | - self.tree.add(["rules", "debian/", "debian/rules"]) |
455 | - self.watch_file_contents = "contents of rules\n" |
456 | - self.provider.larstiq = True |
457 | - self.assertSuccesfulCall("orig", ["pristine", "apt"]) |
458 | - |
459 | - def test_from_upstream_branch(self): |
460 | - upstream_tree = self.make_branch_and_tree("upstream") |
461 | - self.build_tree(["upstream/foo"]) |
462 | - upstream_tree.add(["foo"]) |
463 | - self.upstream_branch = upstream_tree.branch |
464 | - self.upstream_revision = upstream_tree.commit("upstream one") |
465 | - self.provider.upstream_revision = self.upstream_revision |
466 | - self.provider.upstream_branch = self.upstream_branch |
467 | - self.assertSuccesfulCall("upstream", ["pristine", "apt"]) |
468 | - |
469 | - def test_from_split(self): |
470 | - self.provider.allow_split = True |
471 | - self.assertSuccesfulCall("split", ["pristine", "apt"]) |
472 | - |
473 | - def test_upstream_before_orig_source(self): |
474 | - upstream_tree = self.make_branch_and_tree("upstream") |
475 | - self.build_tree(["upstream/foo"]) |
476 | - upstream_tree.add(["foo"]) |
477 | - self.upstream_branch = upstream_tree.branch |
478 | - self.upstream_revision = upstream_tree.commit("upstream one") |
479 | - self.provider.upstream_revision = self.upstream_revision |
480 | - self.provider.upstream_branch = self.upstream_branch |
481 | - self.build_tree(["rules", "debian/", "debian/rules"]) |
482 | - self.tree.add(["rules", "debian/", "debian/rules"]) |
483 | - self.watch_file_contents = "contents of debian/rules\n" |
484 | - self.assertSuccesfulCall("upstream", ["pristine", "apt"]) |
485 | - |
486 | - def test_get_orig_source_before_uscan(self): |
487 | - self.build_tree(["rules", "debian/", "debian/rules"]) |
488 | - self.tree.add(["rules", "debian/", "debian/rules"]) |
489 | - self.watch_file_contents = "contents of debian/rules\n" |
490 | - self.build_tree(["watch", "debian/watch"]) |
491 | - self.tree.add(["watch", "debian/watch"]) |
492 | - self.watch_file_contents = "contents of debian/watch\n" |
493 | - self.assertSuccesfulCall("orig", ["pristine", "apt"]) |
494 | - |
495 | - def test_uscan_before_split(self): |
496 | - self.build_tree(["watch", "debian/", "debian/watch"]) |
497 | - self.tree.add(["watch", "debian/", "debian/watch"]) |
498 | - self.watch_file_contents = "contents of debian/watch\n" |
499 | - self.provider.allow_split = True |
500 | - self.assertSuccesfulCall("uscan", ["pristine", "apt"]) |
501 | - |
502 | - |
503 | class MockAptCaller(object): |
504 | |
505 | def __init__(self, work=False): |
506 | @@ -451,8 +113,10 @@ |
507 | caller = MockAptCaller() |
508 | sources = MockSources([]) |
509 | apt_pkg = MockAptPkg(sources) |
510 | - self.assertEqual(False, AptSource().get_specific_version( |
511 | - "apackage", "0.2", "target", _apt_pkg=apt_pkg, _apt_caller=caller)) |
512 | + src = AptSource() |
513 | + src._run_apt_source = caller.call |
514 | + self.assertRaises(PackageVersionNotPresent, src.get_specific_version, |
515 | + "apackage", "0.2", "target", _apt_pkg=apt_pkg) |
516 | self.assertEqual(1, apt_pkg.init_called_times) |
517 | self.assertEqual(1, apt_pkg.get_pkg_source_records_called_times) |
518 | self.assertEqual(1, sources.restart_called_times) |
519 | @@ -464,8 +128,10 @@ |
520 | caller = MockAptCaller() |
521 | sources = MockSources(["0.1-1"]) |
522 | apt_pkg = MockAptPkg(sources) |
523 | - self.assertEqual(False, AptSource().get_specific_version( |
524 | - "apackage", "0.2", "target", _apt_pkg=apt_pkg, _apt_caller=caller)) |
525 | + src = AptSource() |
526 | + src._run_apt_source = caller.call |
527 | + self.assertRaises(PackageVersionNotPresent, src.get_specific_version, |
528 | + "apackage", "0.2", "target", _apt_pkg=apt_pkg) |
529 | self.assertEqual(1, apt_pkg.init_called_times) |
530 | self.assertEqual(1, apt_pkg.get_pkg_source_records_called_times) |
531 | self.assertEqual(1, sources.restart_called_times) |
532 | @@ -477,9 +143,10 @@ |
533 | caller = MockAptCaller(work=True) |
534 | sources = MockSources(["0.1-1", "0.2-1"]) |
535 | apt_pkg = MockAptPkg(sources) |
536 | - self.assertEqual(True, AptSource().get_specific_version( |
537 | - "apackage", "0.2", "target", |
538 | - _apt_pkg=apt_pkg, _apt_caller=caller.call)) |
539 | + src = AptSource() |
540 | + src._run_apt_source = caller.call |
541 | + src.get_specific_version("apackage", "0.2", "target", |
542 | + _apt_pkg=apt_pkg) |
543 | self.assertEqual(1, apt_pkg.init_called_times) |
544 | self.assertEqual(1, apt_pkg.get_pkg_source_records_called_times) |
545 | self.assertEqual(1, sources.restart_called_times) |
546 | @@ -495,9 +162,11 @@ |
547 | caller = MockAptCaller() |
548 | sources = MockSources(["0.1-1", "0.2-1"]) |
549 | apt_pkg = MockAptPkg(sources) |
550 | - self.assertEqual(False, AptSource().get_specific_version( |
551 | + src = AptSource() |
552 | + src._run_apt_source = caller.call |
553 | + self.assertRaises(PackageVersionNotPresent, src.get_specific_version, |
554 | "apackage", "0.2", "target", |
555 | - _apt_pkg=apt_pkg, _apt_caller=caller.call)) |
556 | + _apt_pkg=apt_pkg) |
557 | self.assertEqual(1, apt_pkg.init_called_times) |
558 | self.assertEqual(1, apt_pkg.get_pkg_source_records_called_times) |
559 | self.assertEqual(1, sources.restart_called_times) |
560 | @@ -508,3 +177,71 @@ |
561 | self.assertEqual("apackage", caller.package) |
562 | self.assertEqual("0.2-1", caller.version_str) |
563 | self.assertEqual("target", caller.target_dir) |
564 | + |
565 | + |
566 | +class RecordingSource(object): |
567 | + |
568 | + def __init__(self, succeed): |
569 | + self._succeed = succeed |
570 | + self._specific_versions = [] |
571 | + |
572 | + def get_specific_version(self, package, version, target_dir): |
573 | + self._specific_versions.append((package, version, target_dir)) |
574 | + if not self._succeed: |
575 | + raise PackageVersionNotPresent(package, version, self) |
576 | + |
577 | + def __repr__(self): |
578 | + return "%s()" % self.__class__.__name__ |
579 | + |
580 | + |
581 | +class StackedUpstreamSourceTests(TestCase): |
582 | + |
583 | + def test_first_wins(self): |
584 | + a = RecordingSource(False) |
585 | + b = RecordingSource(True) |
586 | + c = RecordingSource(False) |
587 | + stack = StackedUpstreamSource([a, b, c]) |
588 | + stack.get_specific_version("mypkg", "1.0", "bla") |
589 | + self.assertEquals([("mypkg", "1.0", "bla")], b._specific_versions) |
590 | + self.assertEquals([("mypkg", "1.0", "bla")], a._specific_versions) |
591 | + self.assertEquals([], c._specific_versions) |
592 | + |
593 | + def test_repr(self): |
594 | + self.assertEquals("StackedUpstreamSource([])", |
595 | + repr(StackedUpstreamSource([]))) |
596 | + self.assertEquals("StackedUpstreamSource([RecordingSource()])", |
597 | + repr(StackedUpstreamSource([RecordingSource(False)]))) |
598 | + |
599 | + def test_none(self): |
600 | + a = RecordingSource(False) |
601 | + b = RecordingSource(False) |
602 | + stack = StackedUpstreamSource([a, b]) |
603 | + self.assertRaises(PackageVersionNotPresent, |
604 | + stack.get_specific_version, "pkg", "1.0", "bla") |
605 | + self.assertEquals([("pkg", "1.0", "bla")], b._specific_versions) |
606 | + self.assertEquals([("pkg", "1.0", "bla")], a._specific_versions) |
607 | + |
608 | + |
609 | +class UScanSourceTests(TestCaseWithTransport): |
610 | + |
611 | + def setUp(self): |
612 | + super(UScanSourceTests, self).setUp() |
613 | + self.tree = self.make_branch_and_tree('.') |
614 | + |
615 | + def test_export_watchfile_none(self): |
616 | + src = UScanSource(self.tree, False) |
617 | + self.assertEquals(None, src._export_watchfile()) |
618 | + |
619 | + def test_export_watchfile_larstiq(self): |
620 | + src = UScanSource(self.tree, True) |
621 | + self.build_tree(['watch']) |
622 | + self.assertEquals(None, src._export_watchfile()) |
623 | + self.tree.add(['watch']) |
624 | + self.assertTrue(src._export_watchfile() is not None) |
625 | + |
626 | + def test_export_watchfile(self): |
627 | + src = UScanSource(self.tree, False) |
628 | + self.build_tree(['debian/', 'debian/watch']) |
629 | + self.assertEquals(None, src._export_watchfile()) |
630 | + self.tree.smart_add(['debian/watch']) |
631 | + self.assertTrue(src._export_watchfile() is not None) |
632 | |
633 | === modified file 'upstream.py' |
634 | --- upstream.py 2009-07-26 08:05:34 +0000 |
635 | +++ upstream.py 2009-07-26 18:21:49 +0000 |
636 | @@ -1,5 +1,6 @@ |
637 | # upstream.py -- Providers of upstream source |
638 | # Copyright (C) 2009 Canonical Ltd. |
639 | +# Copyright (C) 2009 Jelmer Vernooij <jelmer@debian.org> |
640 | # |
641 | # This file is part of bzr-builddeb. |
642 | # |
643 | @@ -29,7 +30,10 @@ |
644 | from bzrlib.revisionspec import RevisionSpec |
645 | from bzrlib.trace import info |
646 | |
647 | -from bzrlib.plugins.builddeb.errors import MissingUpstreamTarball |
648 | +from bzrlib.plugins.builddeb.errors import ( |
649 | + MissingUpstreamTarball, |
650 | + PackageVersionNotPresent, |
651 | + ) |
652 | from bzrlib.plugins.builddeb.import_dsc import DistributionBranch |
653 | from bzrlib.plugins.builddeb.repack_tarball import repack_tarball |
654 | from bzrlib.plugins.builddeb.util import ( |
655 | @@ -55,7 +59,6 @@ |
656 | :param package: Name of the package |
657 | :param version: Version string of the version to fetch |
658 | :param target_dir: Directory in which to store the tarball |
659 | - :return: Boolean indicating whether a tarball was fetched |
660 | """ |
661 | raise NotImplemented(self.get_specific_version) |
662 | |
663 | @@ -70,32 +73,28 @@ |
664 | self.branch = branch |
665 | self.tree = tree |
666 | |
667 | - def get_specific_version(self, package, upstream_version, target_dir): |
668 | - target_filename = self._tarball_path(package, upstream_version, |
669 | + def get_specific_version(self, package, version, target_dir): |
670 | + target_filename = self._tarball_path(package, version, |
671 | target_dir) |
672 | db = DistributionBranch(self.branch, None, tree=self.tree) |
673 | - if not db.has_upstream_version_in_packaging_branch(upstream_version): |
674 | - return False |
675 | - revid = db._revid_of_upstream_version_from_branch(upstream_version) |
676 | + if not db.has_upstream_version_in_packaging_branch(version): |
677 | + raise PackageVersionNotPresent(package, version, self) |
678 | + revid = db._revid_of_upstream_version_from_branch(version) |
679 | if not db.has_pristine_tar_delta(revid): |
680 | - return False |
681 | + raise PackageVersionNotPresent(package, version, self) |
682 | info("Using pristine-tar to reconstruct the needed tarball.") |
683 | - db.reconstruct_pristine_tar(revid, package, upstream_version, |
684 | - target_filename) |
685 | - return True |
686 | + db.reconstruct_pristine_tar(revid, package, version, target_filename) |
687 | |
688 | |
689 | class AptSource(UpstreamSource): |
690 | """Upstream source that uses apt-source.""" |
691 | |
692 | def get_specific_version(self, package, upstream_version, target_dir, |
693 | - _apt_pkg=None, _apt_caller=None): |
694 | + _apt_pkg=None): |
695 | if _apt_pkg is None: |
696 | import apt_pkg |
697 | else: |
698 | apt_pkg = _apt_pkg |
699 | - if _apt_caller is None: |
700 | - _apt_caller = self._run_apt_source |
701 | apt_pkg.init() |
702 | sources = apt_pkg.GetPkgSrcRecords() |
703 | sources.Restart() |
704 | @@ -103,11 +102,11 @@ |
705 | while sources.Lookup(package): |
706 | if upstream_version \ |
707 | == Version(sources.Version).upstream_version: |
708 | - if _apt_caller(package, sources.Version, target_dir): |
709 | - return True |
710 | + if self._run_apt_source(package, sources.Version, target_dir): |
711 | + return |
712 | break |
713 | info("apt could not find the needed tarball.") |
714 | - return False |
715 | + raise PackageVersionNotPresent(package, upstream_version, self) |
716 | |
717 | def _get_command(self, package, version_str): |
718 | return 'apt-get source -y --only-source --tar-only %s=%s' % \ |
719 | @@ -153,7 +152,6 @@ |
720 | tarball_base = "%s-%s" % (package, version) |
721 | rev_tree = self.upstream_branch.repository.revision_tree(revid) |
722 | export(rev_tree, target_filename, 'tgz', tarball_base) |
723 | - return True |
724 | finally: |
725 | self.upstream_branch.unlock() |
726 | |
727 | @@ -198,13 +196,14 @@ |
728 | os.mkdir(export_dir) |
729 | export_dir = os.path.join(export_dir, "debian") |
730 | export(self.tree, export_dir, format="dir") |
731 | - return self._get_orig_source(base_export_dir, |
732 | - desired_tarball_name, target_dir) |
733 | + if not self._get_orig_source(base_export_dir, |
734 | + desired_tarball_name, target_dir): |
735 | + raise PackageVersionNotPresent(package, version, self) |
736 | + return |
737 | finally: |
738 | shutil.rmtree(tmpdir) |
739 | - info("No debian/rules file to try and use for a get-orig-source " |
740 | - "rule") |
741 | - return False |
742 | + info("No debian/rules file to try and use for a get-orig-source rule") |
743 | + raise PackageVersionNotPresent(package, version, self) |
744 | |
745 | |
746 | class UScanSource(UpstreamSource): |
747 | @@ -226,7 +225,7 @@ |
748 | return False |
749 | return True |
750 | |
751 | - def get_specific_version(self, package, version, target_dir): |
752 | + def _export_watchfile(self): |
753 | if self.larstiq: |
754 | watchfile = 'watch' |
755 | else: |
756 | @@ -234,7 +233,7 @@ |
757 | watch_id = self.tree.path2id(watchfile) |
758 | if watch_id is None: |
759 | info("No watch file to use to retrieve upstream tarball.") |
760 | - return False |
761 | + return None |
762 | (tmp, tempfilename) = tempfile.mkstemp() |
763 | try: |
764 | tmp = os.fdopen(tmp, 'wb') |
765 | @@ -242,9 +241,16 @@ |
766 | tmp.write(watch) |
767 | finally: |
768 | tmp.close() |
769 | + return tempfilename |
770 | + |
771 | + def get_specific_version(self, package, version, target_dir): |
772 | + tempfilename = self._export_watchfile() |
773 | + if tempfilename is None: |
774 | + raise PackageVersionNotPresent(package, version, self) |
775 | try: |
776 | - return self._uscan(package, version, tempfilename, |
777 | - target_dir) |
778 | + if not self._uscan(package, version, tempfilename, |
779 | + target_dir): |
780 | + raise PackageVersionNotPresent(package, version, self) |
781 | finally: |
782 | os.unlink(tempfilename) |
783 | |
784 | @@ -266,15 +272,14 @@ |
785 | tar.add(export_dir, "%s-%s" % (package, upstream_version)) |
786 | finally: |
787 | tar.close() |
788 | - return True |
789 | finally: |
790 | shutil.rmtree(tmpdir) |
791 | |
792 | def get_specific_version(self, package, version, target_dir): |
793 | info("Using the current branch without the 'debian' directory " |
794 | "to create the tarball") |
795 | - return self._split(package, |
796 | - version, self._tarball_path(package, version, target_dir)) |
797 | + self._split(package, version, |
798 | + self._tarball_path(package, version, target_dir)) |
799 | |
800 | |
801 | class StackedUpstreamSource(UpstreamSource): |
802 | @@ -286,11 +291,47 @@ |
803 | def __init__(self, sources): |
804 | self._sources = sources |
805 | |
806 | + def __repr__(self): |
807 | + return "%s(%r)" % (self.__class__.__name__, self._sources) |
808 | + |
809 | def get_specific_version(self, package, version, target_dir): |
810 | for source in self._sources: |
811 | - if source.get_specific_version(package, version, target_dir): |
812 | - return True |
813 | - return False |
814 | + try: |
815 | + return source.get_specific_version(package, version, target_dir) |
816 | + except PackageVersionNotPresent: |
817 | + pass |
818 | + raise PackageVersionNotPresent(package, version, self) |
819 | + |
820 | + |
821 | +def get_upstream_sources(tree, branch, larstiq=False, upstream_branch=None, |
822 | + upstream_revision=None, allow_split=False): |
823 | + """Get the list of upstream sources to retrieve upstream versions from. |
824 | + |
825 | + :param tree: The tree that is being built from. |
826 | + :param branch: The branch that is being built from. |
827 | + :param larstiq: Whether the tree versions the root of ./debian. |
828 | + :param upstream_branch: An upstream branch that can be exported |
829 | + if needed. |
830 | + :param upstream_revision: The revision to use of the upstream branch |
831 | + if it is used. |
832 | + :param allow_split: Whether the provider can provide the tarball |
833 | + by exporting the branch and removing the "debian" dir. |
834 | + |
835 | + """ |
836 | + sources = [ |
837 | + PristineTarSource(tree, branch), |
838 | + AptSource(), |
839 | + ] |
840 | + if upstream_branch is not None: |
841 | + sources.append( |
842 | + UpstreamBranchSource(upstream_branch, upstream_revision)) |
843 | + sources.extend([ |
844 | + GetOrigSourceSource(tree, larstiq), |
845 | + UScanSource(tree, larstiq), |
846 | + ]) |
847 | + if allow_split: |
848 | + sources.append(SelfSplitSource(tree)) |
849 | + return sources |
850 | |
851 | |
852 | class UpstreamProvider(object): |
853 | @@ -300,40 +341,16 @@ |
854 | instance using pristine-tar, or using apt. |
855 | """ |
856 | |
857 | - def __init__(self, tree, branch, package, version, store_dir, |
858 | - larstiq=False, upstream_branch=None, upstream_revision=None, |
859 | - allow_split=False): |
860 | + def __init__(self, package, version, store_dir, sources): |
861 | """Create an UpstreamProvider. |
862 | |
863 | - :param tree: The tree that is being built from. |
864 | - :param branch: The branch that is being built from. |
865 | :param package: the name of the source package that is being built. |
866 | :param version: the Version of the package that is being built. |
867 | :param store_dir: A directory to cache the tarballs. |
868 | - :param larstiq: Whether the tree versions the root of ./debian. |
869 | - :param upstream_branch: An upstream branch that can be exported |
870 | - if needed. |
871 | - :param upstream_revision: The revision to use of the upstream branch |
872 | - if it is used. |
873 | - :param allow_split: Whether the provider can provide the tarball |
874 | - by exporting the branch and removing the "debian" dir. |
875 | """ |
876 | self.package = package |
877 | self.version = Version(version) |
878 | self.store_dir = store_dir |
879 | - sources = [ |
880 | - PristineTarSource(tree, branch), |
881 | - AptSource(), |
882 | - ] |
883 | - if upstream_branch is not None: |
884 | - sources.append( |
885 | - UpstreamBranchSource(upstream_branch, upstream_revision)) |
886 | - sources.extend([ |
887 | - GetOrigSourceSource(tree, larstiq), |
888 | - UScanSource(tree, larstiq), |
889 | - ]) |
890 | - if allow_split: |
891 | - sources.append(SelfSplitSource(tree)) |
892 | self.source = StackedUpstreamSource(sources) |
893 | |
894 | def provide(self, target_dir): |
895 | @@ -367,15 +384,16 @@ |
896 | if not self.already_exists_in_store(): |
897 | if not os.path.exists(self.store_dir): |
898 | os.makedirs(self.store_dir) |
899 | - self.source.get_specific_version(self.package, |
900 | - self.version.upstream_version, |
901 | - target_dir) |
902 | + try: |
903 | + self.source.get_specific_version(self.package, |
904 | + self.version.upstream_version, target_dir) |
905 | + except PackageVersionNotPresent: |
906 | + raise MissingUpstreamTarball(self._tarball_name()) |
907 | else: |
908 | info("Using the upstream tarball that is present in " |
909 | "%s" % self.store_dir) |
910 | - if self.provide_from_store_dir(target_dir): |
911 | - return os.path.join(target_dir, self._tarball_name()) |
912 | - raise MissingUpstreamTarball(self._tarball_name()) |
913 | + assert self.provide_from_store_dir(target_dir) |
914 | + return os.path.join(target_dir, self._tarball_name()) |
915 | |
916 | def already_exists_in_target(self, target_dir): |
917 | return os.path.exists(os.path.join(target_dir, self._tarball_name())) |
Trivial patch to recommend python-launchpadlib since it's used by bzr-builddeb but optional.