Merge lp:~jelmer/bzr-builddeb/recommend-lplib into lp:~bzr-builddeb-hackers/bzr-builddeb/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
Reviewer Review Type Date Requested Status
Bzr-builddeb-hackers Pending
Review via email: mp+9296@code.launchpad.net

This proposal has been superseded by a proposal from 2009-08-04.

To post a comment you must log in.
Revision history for this message
Jelmer Vernooij (jelmer) wrote :

Trivial patch to recommend python-launchpadlib since it's used by bzr-builddeb but optional.

Unmerged revisions

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'cmds.py'
--- cmds.py 2009-07-26 16:21:15 +0000
+++ cmds.py 2009-07-26 18:21:49 +0000
@@ -34,6 +34,7 @@
34 urlutils,34 urlutils,
35 )35 )
36from bzrlib.branch import Branch36from bzrlib.branch import Branch
37from bzrlib.bzrdir import BzrDir
37from bzrlib.commands import Command38from bzrlib.commands import Command
38from bzrlib.errors import (BzrCommandError,39from bzrlib.errors import (BzrCommandError,
39 NoWorkingTree,40 NoWorkingTree,
@@ -73,7 +74,11 @@
73 MergeModeDistiller,74 MergeModeDistiller,
74 NativeSourceDistiller,75 NativeSourceDistiller,
75 )76 )
76from bzrlib.plugins.builddeb.upstream import UpstreamProvider, UpstreamBranchSource77from bzrlib.plugins.builddeb.upstream import (
78 UpstreamProvider,
79 UpstreamBranchSource,
80 get_upstream_sources,
81 )
77from bzrlib.plugins.builddeb.util import (find_changelog,82from bzrlib.plugins.builddeb.util import (find_changelog,
78 get_export_upstream_revision,83 get_export_upstream_revision,
79 find_last_distribution,84 find_last_distribution,
@@ -211,12 +216,7 @@
211 is_local = urlparse.urlsplit(location)[0] in ('', 'file')216 is_local = urlparse.urlsplit(location)[0] in ('', 'file')
212 if is_local:217 if is_local:
213 os.chdir(location)218 os.chdir(location)
214 try:219 tree, branch, relpath = BzrDir.open_containing_tree_or_branch(location)
215 tree, _ = WorkingTree.open_containing(location)
216 branch = tree.branch
217 except NoWorkingTree:
218 tree = None
219 branch, _ = Branch.open_containing(location)
220 return tree, branch, is_local220 return tree, branch, is_local
221221
222 def _get_build_tree(self, revision, tree, branch):222 def _get_build_tree(self, revision, tree, branch):
@@ -375,10 +375,11 @@
375 export_upstream_revision, config,375 export_upstream_revision, config,
376 changelog.version)376 changelog.version)
377377
378 upstream_provider = UpstreamProvider(tree, branch,378 upstream_provider = UpstreamProvider(
379 changelog.package, changelog.version,379 changelog.package, changelog.version,
380 orig_dir, larstiq=larstiq, upstream_branch=upstream_branch,380 orig_dir, get_upstream_sources(tree, branch,
381 upstream_revision=upstream_revision, allow_split=split)381 larstiq=larstiq, upstream_branch=upstream_branch,
382 upstream_revision=upstream_revision, allow_split=split))
382383
383 if merge:384 if merge:
384 distiller_cls = MergeModeDistiller385 distiller_cls = MergeModeDistiller
@@ -392,8 +393,8 @@
392 is_working_tree=working_tree)393 is_working_tree=working_tree)
393394
394 build_source_dir = os.path.join(build_dir,395 build_source_dir = os.path.join(build_dir,
395 changelog.package + "-"396 "%s-%s" % (changelog.package,
396 + changelog.version.upstream_version)397 changelog.version.upstream_version))
397398
398 builder = DebBuild(distiller, build_source_dir, build_cmd,399 builder = DebBuild(distiller, build_source_dir, build_cmd,
399 use_existing=use_existing)400 use_existing=use_existing)
@@ -780,9 +781,9 @@
780 orig_dir = config.orig_dir781 orig_dir = config.orig_dir
781 if orig_dir is None:782 if orig_dir is None:
782 orig_dir = default_orig_dir783 orig_dir = default_orig_dir
783 upstream_provider = UpstreamProvider(t, t.branch,784 upstream_provider = UpstreamProvider(changelog.package,
784 changelog.package, changelog.version.upstream_version,785 changelog.version.upstream_version, orig_dir,
785 orig_dir, larstiq=larstiq)786 get_upstream_sources(t, t.branch, larstiq=larstiq))
786787
787 distiller = MergeModeDistiller(t, upstream_provider,788 distiller = MergeModeDistiller(t, upstream_provider,
788 larstiq=larstiq)789 larstiq=larstiq)
789790
=== modified file 'debian/control'
--- debian/control 2009-03-31 14:48:29 +0000
+++ debian/control 2009-07-26 18:35:25 +0000
@@ -14,6 +14,7 @@
14Package: bzr-builddeb14Package: bzr-builddeb
15Architecture: all15Architecture: all
16Depends: bzr (>= 1.10~), python-debian (>= 0.1.11), python-apt, ${python:Depends}, dpkg-dev, fakeroot, bzrtools (>= 1.2), devscripts, patchutils, pristine-tar16Depends: bzr (>= 1.10~), python-debian (>= 0.1.11), python-apt, ${python:Depends}, dpkg-dev, fakeroot, bzrtools (>= 1.2), devscripts, patchutils, pristine-tar
17Recommends: python-launchpadlib
17Suggests: bzr-svn (>= 0.4.10)18Suggests: bzr-svn (>= 0.4.10)
18Provides: bzr-buildpackage19Provides: bzr-buildpackage
19XB-Python-Version: ${python:Versions}20XB-Python-Version: ${python:Versions}
2021
=== modified file 'directory.py'
--- directory.py 2009-04-15 23:17:50 +0000
+++ directory.py 2009-04-16 10:42:12 +0000
@@ -86,5 +86,15 @@
86 else:86 else:
87 return urls[version]["Git"]87 return urls[version]["Git"]
8888
89 if "Hg" in urls[version]:
90 try:
91 import bzrlib.plugins.hg
92 except ImportError:
93 info("This package uses hg. If you would like to "
94 "access it with bzr then please install bzr-hg"
95 "and re-run the command.")
96 else:
97 return urls[version]["Hg"]
98
89 raise errors.InvalidURL(path=url,99 raise errors.InvalidURL(path=url,
90 extra='unsupported VCSes %r found' % urls[version].keys())100 extra='unsupported VCSes %r found' % urls[version].keys())
91101
=== modified file 'errors.py'
--- errors.py 2009-03-02 22:36:36 +0000
+++ errors.py 2009-04-16 09:30:49 +0000
@@ -153,6 +153,14 @@
153 _fmt = "You did not specify a package version."153 _fmt = "You did not specify a package version."
154154
155155
156class PackageVersionNotPresent(BzrError):
157 _fmt = "%(package)s %(version)s was not found in %(upstream)s."
158
159 def __init__(self, package, version, upstream):
160 BzrError.__init__(self, package=package, version=version,
161 upstream=upstream)
162
163
156class UnsupportedRepackFormat(BzrError):164class UnsupportedRepackFormat(BzrError):
157 _fmt = ('Either the file extension of "%(location)s" indicates that '165 _fmt = ('Either the file extension of "%(location)s" indicates that '
158 'it is a format unsupported for repacking or it is a '166 'it is a format unsupported for repacking or it is a '
159167
=== modified file 'tests/test_upstream.py'
--- tests/test_upstream.py 2009-07-26 08:05:34 +0000
+++ tests/test_upstream.py 2009-07-26 18:21:49 +0000
@@ -30,12 +30,15 @@
30 )30 )
31from bzrlib.plugins.builddeb.errors import (31from bzrlib.plugins.builddeb.errors import (
32 MissingUpstreamTarball,32 MissingUpstreamTarball,
33 PackageVersionNotPresent,
33 )34 )
34from bzrlib.plugins.builddeb.upstream import (35from bzrlib.plugins.builddeb.upstream import (
36 AptSource,
37 PristineTarSource,
38 StackedUpstreamSource,
35 UpstreamProvider,39 UpstreamProvider,
36 UpstreamSource,40 UpstreamSource,
37 AptSource,41 UScanSource,
38 PristineTarSource,
39 )42 )
40from bzrlib.plugins.builddeb.util import (43from bzrlib.plugins.builddeb.util import (
41 get_parent_dir,44 get_parent_dir,
@@ -43,151 +46,6 @@
43 )46 )
4447
4548
46class MockProvider(UpstreamSource):
47
48 def create_target(self, path):
49 parent_dir = get_parent_dir(path)
50 if parent_dir != '' and not os.path.exists(parent_dir):
51 os.makedirs(parent_dir)
52 f = open(path, "wb")
53 try:
54 f.write('')
55 finally:
56 f.close()
57
58
59class MockAptProvider(MockProvider):
60
61 def __init__(self, find=False):
62 self.find = find
63 self.called_times = 0
64 self.package = None
65 self.upstream_version = None
66 self.target_dir = None
67
68 def get_specific_version(self, package, upstream_version, target_dir):
69 self.called_times += 1
70 self.package = package
71 self.upstream_version = upstream_version
72 self.target_dir = target_dir
73 if self.find:
74 self.create_target(os.path.join(target_dir,
75 tarball_name(package, upstream_version)))
76 return self.find
77
78
79class MockUscanProvider(MockProvider):
80
81 def __init__(self, find=False):
82 self.find = find
83 self.called_times = 0
84 self.package = None
85 self.upstream_version = None
86 self.watch_file_contents = None
87 self.target_dir = None
88
89 def provide(self, package, upstream_version, watch_file, target_dir):
90 self.called_times += 1
91 self.package = package
92 self.upstream_version = upstream_version
93 f = open(watch_file, "rb")
94 try:
95 self.watch_file_contents = f.read()
96 finally:
97 f.close()
98 self.target_dir = target_dir
99 if self.find:
100 self.create_target(os.path.join(target_dir,
101 tarball_name(package, upstream_version)))
102 return self.find
103
104
105class MockPristineProvider(MockProvider):
106
107 def __init__(self, find=False):
108 self.find = find
109 self.called_times = 0
110 self.tree = None
111 self.branch = None
112 self.package = None
113 self.upstream_version = None
114 self.target_filename = None
115
116 def provide(self, tree, branch, package, upstream_version, target_filename):
117 self.called_times += 1
118 self.tree = tree
119 self.branch = branch
120 self.package = package
121 self.upstream_version = upstream_version
122 self.target_filename = target_filename
123 if self.find:
124 self.create_target(target_filename)
125 return self.find
126
127
128class MockOrigSourceProvider(MockProvider):
129
130 def __init__(self, find=False):
131 self.find = find
132 self.called_times = 0
133 self.source_dir = None
134 self.desired_tarball_name = None
135 self.target_dir = None
136
137 def provide(self, source_dir, desired_tarball_name,
138 target_dir):
139 self.called_times += 1
140 self.source_dir = source_dir
141 self.desired_tarball_name = desired_tarball_name
142 self.target_dir = target_dir
143 if self.find:
144 self.create_target(os.path.join(target_dir, desired_tarball_name))
145 return self.find
146
147
148class MockOtherBranchProvider(MockProvider):
149
150 def __init__(self, find=False):
151 self.find = find
152 self.called_times = 0
153 self.upstream_branch = None
154 self.upstream_revision = None
155 self.target_filename = None
156 self.tarball_base = None
157
158 def provide(self, upstream_branch, upstream_revision, target_filename,
159 tarball_base):
160 self.called_times += 1
161 self.upstream_branch = upstream_branch
162 self.upstream_revision = upstream_revision
163 self.target_filename = target_filename
164 self.tarball_base = tarball_base
165 if self.find:
166 self.create_target(target_filename)
167 return self.find
168
169
170class MockSplitProvider(MockProvider):
171
172 def __init__(self, find=False):
173 self.find = find
174 self.called_times = 0
175 self.tree = None
176 self.package = None
177 self.upstream_version = None
178 self.target_filename = None
179
180 def provide(self, tree, package, upstream_version, target_filename):
181 self.called_times += 1
182 self.tree = tree
183 self.package = package
184 self.upstream_version = upstream_version
185 self.target_filename = target_filename
186 if self.find:
187 self.create_target(self.target_filename)
188 return self.find
189
190
191class MockSources(object):49class MockSources(object):
19250
193 def __init__(self, versions):51 def __init__(self, versions):
@@ -227,202 +85,6 @@
227 return self.sources85 return self.sources
22886
22987
230class UpstreamProviderTests(TestCaseWithTransport):
231
232 def setUp(self):
233 super(UpstreamProviderTests, self).setUp()
234 self.tree = self.make_branch_and_tree(".")
235 self.branch = self.tree.branch
236 self.package = "package"
237 self.version = Version("0.1-1")
238 self.upstream_version = self.version.upstream_version
239 self.desired_tarball_name = tarball_name(self.package,
240 self.upstream_version)
241 self.tarball_base = "%s-%s" % (self.package, self.upstream_version)
242 self.store_dir = "store"
243 self.provider = UpstreamProvider(self.tree, self.branch,
244 self.package, self.version, self.store_dir)
245 self.provider._sources = []
246 self.providers = {}
247 self.providers["apt"] = MockAptProvider()
248 self.provider._sources.append(self.providers["apt"])
249 self.providers["uscan"] = MockUscanProvider()
250 self.provider._sources.append(self.providers["uscan"])
251 self.providers["pristine"] = MockPristineProvider()
252 self.provider._sources.append(self.providers["pristine"])
253 self.providers["orig"] = MockOrigSourceProvider()
254 self.provider._sources.append(self.providers["orig"])
255 self.providers["upstream"] = MockOtherBranchProvider()
256 self.provider._sources.append(self.providers["upstream"])
257 self.provider._upstream_branch_provider = \
258 self.providers["upstream"].provide
259 self.providers["split"] = MockSplitProvider()
260 self.provider._sources.append(self.providers["split"])
261 self.target_dir = "target"
262 self.target_filename = os.path.join(self.target_dir,
263 self.desired_tarball_name)
264 self.store_filename = os.path.join(self.store_dir,
265 tarball_name(self.package, self.version.upstream_version))
266
267 def assertProvidersCalled(self, providers):
268 for provider_name, provider in self.providers.items():
269 if provider_name in providers:
270 self.assertCalledCorrectly(provider_name)
271 else:
272 self.assertEqual(provider.called_times, 0,
273 "%s wasn't expected to be called" % provider_name)
274
275 def call_provider(self):
276 self.assertEqual(self.provider.provide(self.target_dir),
277 self.target_filename)
278
279 def test_already_in_target(self):
280 os.makedirs(self.target_dir)
281 f = open(self.target_filename, "wb")
282 f.close()
283 self.call_provider()
284 self.failUnlessExists(self.target_filename)
285 # Should this be copied across?
286 self.failIfExists(self.store_filename)
287 self.assertProvidersCalled({})
288
289 def test_already_in_store(self):
290 os.makedirs(self.store_dir)
291 f = open(self.store_filename, "wb")
292 f.close()
293 self.call_provider()
294 self.failUnlessExists(self.target_filename)
295 self.failUnlessExists(self.store_filename)
296 self.assertProvidersCalled({})
297
298 def assertCalledCorrectly(self, provider_name):
299 provider = self.providers[provider_name]
300 for attr_name in provider.__dict__:
301 if attr_name in ("find", "provide", "source_dir"):
302 continue
303 if attr_name == "called_times":
304 self.assertEqual(provider.called_times, 1,
305 "%s was not called" % provider_name)
306 continue
307 if attr_name == "target_filename":
308 self.assertEqual(provider.target_filename,
309 self.store_filename)
310 continue
311 if attr_name == "target_dir":
312 self.assertEqual(provider.target_dir,
313 self.store_dir)
314 continue
315 if attr_name == "fetch_dir":
316 self.assertEqual(provider.fetch_dir,
317 os.path.dirname(provider.source_dir))
318 continue
319 attr = getattr(provider, attr_name)
320 correct_attr = getattr(self, attr_name)
321 self.assertEqual(correct_attr, attr,
322 "%s doesn't match\nexpected: %s\ngot: %s"
323 % (attr_name, correct_attr, attr))
324
325 def assertSuccesfulCall(self, provider, other_providers):
326 self.providers[provider].find = True
327 self.call_provider()
328 self.failUnlessExists(self.target_filename)
329 self.failUnlessExists(self.store_filename)
330 self.assertProvidersCalled([provider] + other_providers)
331
332 def test_from_pristine_tar(self):
333 self.assertSuccesfulCall("pristine", [])
334
335 def test_from_apt(self):
336 self.assertSuccesfulCall("apt", ["pristine"])
337
338 def test_from_uscan(self):
339 self.build_tree(["watch", "debian/", "debian/watch"])
340 self.tree.add(["watch", "debian/", "debian/watch"])
341 self.watch_file_contents = "contents of debian/watch\n"
342 self.assertSuccesfulCall("uscan", ["pristine", "apt"])
343
344 def test_uscan_not_called_if_not_watch(self):
345 self.build_tree(["watch"])
346 self.tree.add(["watch"])
347 self.assertRaises(MissingUpstreamTarball, self.provider.provide,
348 self.target_dir)
349 self.failIfExists(self.target_filename)
350 self.failIfExists(self.store_filename)
351 self.assertProvidersCalled(["pristine", "apt"])
352
353 def test_uscan_in_larstiq(self):
354 self.build_tree(["watch", "debian/", "debian/watch"])
355 self.tree.add(["watch", "debian/", "debian/watch"])
356 self.watch_file_contents = "contents of watch\n"
357 self.provider.larstiq = True
358 self.assertSuccesfulCall("uscan", ["pristine", "apt"])
359
360 def test_from_get_orig_source(self):
361 self.build_tree(["rules", "debian/", "debian/rules"])
362 self.tree.add(["rules", "debian/", "debian/rules"])
363 self.watch_file_contents = "contents of debian/rules\n"
364 self.assertSuccesfulCall("orig", ["pristine", "apt"])
365
366 def test_get_orig_source_not_called_if_no_rules(self):
367 self.build_tree(["rules"])
368 self.tree.add(["rules"])
369 self.assertRaises(MissingUpstreamTarball, self.provider.provide,
370 self.target_dir)
371 self.failIfExists(self.target_filename)
372 self.failIfExists(self.store_filename)
373 self.assertProvidersCalled(["pristine", "apt"])
374
375 def test_get_orig_source_in_larstiq(self):
376 self.build_tree(["rules", "debian/", "debian/rules"])
377 self.tree.add(["rules", "debian/", "debian/rules"])
378 self.watch_file_contents = "contents of rules\n"
379 self.provider.larstiq = True
380 self.assertSuccesfulCall("orig", ["pristine", "apt"])
381
382 def test_from_upstream_branch(self):
383 upstream_tree = self.make_branch_and_tree("upstream")
384 self.build_tree(["upstream/foo"])
385 upstream_tree.add(["foo"])
386 self.upstream_branch = upstream_tree.branch
387 self.upstream_revision = upstream_tree.commit("upstream one")
388 self.provider.upstream_revision = self.upstream_revision
389 self.provider.upstream_branch = self.upstream_branch
390 self.assertSuccesfulCall("upstream", ["pristine", "apt"])
391
392 def test_from_split(self):
393 self.provider.allow_split = True
394 self.assertSuccesfulCall("split", ["pristine", "apt"])
395
396 def test_upstream_before_orig_source(self):
397 upstream_tree = self.make_branch_and_tree("upstream")
398 self.build_tree(["upstream/foo"])
399 upstream_tree.add(["foo"])
400 self.upstream_branch = upstream_tree.branch
401 self.upstream_revision = upstream_tree.commit("upstream one")
402 self.provider.upstream_revision = self.upstream_revision
403 self.provider.upstream_branch = self.upstream_branch
404 self.build_tree(["rules", "debian/", "debian/rules"])
405 self.tree.add(["rules", "debian/", "debian/rules"])
406 self.watch_file_contents = "contents of debian/rules\n"
407 self.assertSuccesfulCall("upstream", ["pristine", "apt"])
408
409 def test_get_orig_source_before_uscan(self):
410 self.build_tree(["rules", "debian/", "debian/rules"])
411 self.tree.add(["rules", "debian/", "debian/rules"])
412 self.watch_file_contents = "contents of debian/rules\n"
413 self.build_tree(["watch", "debian/watch"])
414 self.tree.add(["watch", "debian/watch"])
415 self.watch_file_contents = "contents of debian/watch\n"
416 self.assertSuccesfulCall("orig", ["pristine", "apt"])
417
418 def test_uscan_before_split(self):
419 self.build_tree(["watch", "debian/", "debian/watch"])
420 self.tree.add(["watch", "debian/", "debian/watch"])
421 self.watch_file_contents = "contents of debian/watch\n"
422 self.provider.allow_split = True
423 self.assertSuccesfulCall("uscan", ["pristine", "apt"])
424
425
426class MockAptCaller(object):88class MockAptCaller(object):
42789
428 def __init__(self, work=False):90 def __init__(self, work=False):
@@ -451,8 +113,10 @@
451 caller = MockAptCaller()113 caller = MockAptCaller()
452 sources = MockSources([])114 sources = MockSources([])
453 apt_pkg = MockAptPkg(sources)115 apt_pkg = MockAptPkg(sources)
454 self.assertEqual(False, AptSource().get_specific_version(116 src = AptSource()
455 "apackage", "0.2", "target", _apt_pkg=apt_pkg, _apt_caller=caller))117 src._run_apt_source = caller.call
118 self.assertRaises(PackageVersionNotPresent, src.get_specific_version,
119 "apackage", "0.2", "target", _apt_pkg=apt_pkg)
456 self.assertEqual(1, apt_pkg.init_called_times)120 self.assertEqual(1, apt_pkg.init_called_times)
457 self.assertEqual(1, apt_pkg.get_pkg_source_records_called_times)121 self.assertEqual(1, apt_pkg.get_pkg_source_records_called_times)
458 self.assertEqual(1, sources.restart_called_times)122 self.assertEqual(1, sources.restart_called_times)
@@ -464,8 +128,10 @@
464 caller = MockAptCaller()128 caller = MockAptCaller()
465 sources = MockSources(["0.1-1"])129 sources = MockSources(["0.1-1"])
466 apt_pkg = MockAptPkg(sources)130 apt_pkg = MockAptPkg(sources)
467 self.assertEqual(False, AptSource().get_specific_version(131 src = AptSource()
468 "apackage", "0.2", "target", _apt_pkg=apt_pkg, _apt_caller=caller))132 src._run_apt_source = caller.call
133 self.assertRaises(PackageVersionNotPresent, src.get_specific_version,
134 "apackage", "0.2", "target", _apt_pkg=apt_pkg)
469 self.assertEqual(1, apt_pkg.init_called_times)135 self.assertEqual(1, apt_pkg.init_called_times)
470 self.assertEqual(1, apt_pkg.get_pkg_source_records_called_times)136 self.assertEqual(1, apt_pkg.get_pkg_source_records_called_times)
471 self.assertEqual(1, sources.restart_called_times)137 self.assertEqual(1, sources.restart_called_times)
@@ -477,9 +143,10 @@
477 caller = MockAptCaller(work=True)143 caller = MockAptCaller(work=True)
478 sources = MockSources(["0.1-1", "0.2-1"])144 sources = MockSources(["0.1-1", "0.2-1"])
479 apt_pkg = MockAptPkg(sources)145 apt_pkg = MockAptPkg(sources)
480 self.assertEqual(True, AptSource().get_specific_version(146 src = AptSource()
481 "apackage", "0.2", "target", 147 src._run_apt_source = caller.call
482 _apt_pkg=apt_pkg, _apt_caller=caller.call))148 src.get_specific_version("apackage", "0.2", "target",
149 _apt_pkg=apt_pkg)
483 self.assertEqual(1, apt_pkg.init_called_times)150 self.assertEqual(1, apt_pkg.init_called_times)
484 self.assertEqual(1, apt_pkg.get_pkg_source_records_called_times)151 self.assertEqual(1, apt_pkg.get_pkg_source_records_called_times)
485 self.assertEqual(1, sources.restart_called_times)152 self.assertEqual(1, sources.restart_called_times)
@@ -495,9 +162,11 @@
495 caller = MockAptCaller()162 caller = MockAptCaller()
496 sources = MockSources(["0.1-1", "0.2-1"])163 sources = MockSources(["0.1-1", "0.2-1"])
497 apt_pkg = MockAptPkg(sources)164 apt_pkg = MockAptPkg(sources)
498 self.assertEqual(False, AptSource().get_specific_version(165 src = AptSource()
166 src._run_apt_source = caller.call
167 self.assertRaises(PackageVersionNotPresent, src.get_specific_version,
499 "apackage", "0.2", "target", 168 "apackage", "0.2", "target",
500 _apt_pkg=apt_pkg, _apt_caller=caller.call))169 _apt_pkg=apt_pkg)
501 self.assertEqual(1, apt_pkg.init_called_times)170 self.assertEqual(1, apt_pkg.init_called_times)
502 self.assertEqual(1, apt_pkg.get_pkg_source_records_called_times)171 self.assertEqual(1, apt_pkg.get_pkg_source_records_called_times)
503 self.assertEqual(1, sources.restart_called_times)172 self.assertEqual(1, sources.restart_called_times)
@@ -508,3 +177,71 @@
508 self.assertEqual("apackage", caller.package)177 self.assertEqual("apackage", caller.package)
509 self.assertEqual("0.2-1", caller.version_str)178 self.assertEqual("0.2-1", caller.version_str)
510 self.assertEqual("target", caller.target_dir)179 self.assertEqual("target", caller.target_dir)
180
181
182class RecordingSource(object):
183
184 def __init__(self, succeed):
185 self._succeed = succeed
186 self._specific_versions = []
187
188 def get_specific_version(self, package, version, target_dir):
189 self._specific_versions.append((package, version, target_dir))
190 if not self._succeed:
191 raise PackageVersionNotPresent(package, version, self)
192
193 def __repr__(self):
194 return "%s()" % self.__class__.__name__
195
196
197class StackedUpstreamSourceTests(TestCase):
198
199 def test_first_wins(self):
200 a = RecordingSource(False)
201 b = RecordingSource(True)
202 c = RecordingSource(False)
203 stack = StackedUpstreamSource([a, b, c])
204 stack.get_specific_version("mypkg", "1.0", "bla")
205 self.assertEquals([("mypkg", "1.0", "bla")], b._specific_versions)
206 self.assertEquals([("mypkg", "1.0", "bla")], a._specific_versions)
207 self.assertEquals([], c._specific_versions)
208
209 def test_repr(self):
210 self.assertEquals("StackedUpstreamSource([])",
211 repr(StackedUpstreamSource([])))
212 self.assertEquals("StackedUpstreamSource([RecordingSource()])",
213 repr(StackedUpstreamSource([RecordingSource(False)])))
214
215 def test_none(self):
216 a = RecordingSource(False)
217 b = RecordingSource(False)
218 stack = StackedUpstreamSource([a, b])
219 self.assertRaises(PackageVersionNotPresent,
220 stack.get_specific_version, "pkg", "1.0", "bla")
221 self.assertEquals([("pkg", "1.0", "bla")], b._specific_versions)
222 self.assertEquals([("pkg", "1.0", "bla")], a._specific_versions)
223
224
225class UScanSourceTests(TestCaseWithTransport):
226
227 def setUp(self):
228 super(UScanSourceTests, self).setUp()
229 self.tree = self.make_branch_and_tree('.')
230
231 def test_export_watchfile_none(self):
232 src = UScanSource(self.tree, False)
233 self.assertEquals(None, src._export_watchfile())
234
235 def test_export_watchfile_larstiq(self):
236 src = UScanSource(self.tree, True)
237 self.build_tree(['watch'])
238 self.assertEquals(None, src._export_watchfile())
239 self.tree.add(['watch'])
240 self.assertTrue(src._export_watchfile() is not None)
241
242 def test_export_watchfile(self):
243 src = UScanSource(self.tree, False)
244 self.build_tree(['debian/', 'debian/watch'])
245 self.assertEquals(None, src._export_watchfile())
246 self.tree.smart_add(['debian/watch'])
247 self.assertTrue(src._export_watchfile() is not None)
511248
=== modified file 'upstream.py'
--- upstream.py 2009-07-26 08:05:34 +0000
+++ upstream.py 2009-07-26 18:21:49 +0000
@@ -1,5 +1,6 @@
1# upstream.py -- Providers of upstream source1# upstream.py -- Providers of upstream source
2# Copyright (C) 2009 Canonical Ltd.2# Copyright (C) 2009 Canonical Ltd.
3# Copyright (C) 2009 Jelmer Vernooij <jelmer@debian.org>
3#4#
4# This file is part of bzr-builddeb.5# This file is part of bzr-builddeb.
5#6#
@@ -29,7 +30,10 @@
29from bzrlib.revisionspec import RevisionSpec30from bzrlib.revisionspec import RevisionSpec
30from bzrlib.trace import info31from bzrlib.trace import info
3132
32from bzrlib.plugins.builddeb.errors import MissingUpstreamTarball33from bzrlib.plugins.builddeb.errors import (
34 MissingUpstreamTarball,
35 PackageVersionNotPresent,
36 )
33from bzrlib.plugins.builddeb.import_dsc import DistributionBranch37from bzrlib.plugins.builddeb.import_dsc import DistributionBranch
34from bzrlib.plugins.builddeb.repack_tarball import repack_tarball38from bzrlib.plugins.builddeb.repack_tarball import repack_tarball
35from bzrlib.plugins.builddeb.util import (39from bzrlib.plugins.builddeb.util import (
@@ -55,7 +59,6 @@
55 :param package: Name of the package59 :param package: Name of the package
56 :param version: Version string of the version to fetch60 :param version: Version string of the version to fetch
57 :param target_dir: Directory in which to store the tarball61 :param target_dir: Directory in which to store the tarball
58 :return: Boolean indicating whether a tarball was fetched
59 """62 """
60 raise NotImplemented(self.get_specific_version)63 raise NotImplemented(self.get_specific_version)
6164
@@ -70,32 +73,28 @@
70 self.branch = branch73 self.branch = branch
71 self.tree = tree74 self.tree = tree
7275
73 def get_specific_version(self, package, upstream_version, target_dir):76 def get_specific_version(self, package, version, target_dir):
74 target_filename = self._tarball_path(package, upstream_version, 77 target_filename = self._tarball_path(package, version,
75 target_dir)78 target_dir)
76 db = DistributionBranch(self.branch, None, tree=self.tree)79 db = DistributionBranch(self.branch, None, tree=self.tree)
77 if not db.has_upstream_version_in_packaging_branch(upstream_version):80 if not db.has_upstream_version_in_packaging_branch(version):
78 return False81 raise PackageVersionNotPresent(package, version, self)
79 revid = db._revid_of_upstream_version_from_branch(upstream_version)82 revid = db._revid_of_upstream_version_from_branch(version)
80 if not db.has_pristine_tar_delta(revid):83 if not db.has_pristine_tar_delta(revid):
81 return False84 raise PackageVersionNotPresent(package, version, self)
82 info("Using pristine-tar to reconstruct the needed tarball.")85 info("Using pristine-tar to reconstruct the needed tarball.")
83 db.reconstruct_pristine_tar(revid, package, upstream_version,86 db.reconstruct_pristine_tar(revid, package, version, target_filename)
84 target_filename)
85 return True
8687
8788
88class AptSource(UpstreamSource):89class AptSource(UpstreamSource):
89 """Upstream source that uses apt-source."""90 """Upstream source that uses apt-source."""
9091
91 def get_specific_version(self, package, upstream_version, target_dir, 92 def get_specific_version(self, package, upstream_version, target_dir,
92 _apt_pkg=None, _apt_caller=None):93 _apt_pkg=None):
93 if _apt_pkg is None:94 if _apt_pkg is None:
94 import apt_pkg95 import apt_pkg
95 else:96 else:
96 apt_pkg = _apt_pkg97 apt_pkg = _apt_pkg
97 if _apt_caller is None:
98 _apt_caller = self._run_apt_source
99 apt_pkg.init()98 apt_pkg.init()
100 sources = apt_pkg.GetPkgSrcRecords()99 sources = apt_pkg.GetPkgSrcRecords()
101 sources.Restart()100 sources.Restart()
@@ -103,11 +102,11 @@
103 while sources.Lookup(package):102 while sources.Lookup(package):
104 if upstream_version \103 if upstream_version \
105 == Version(sources.Version).upstream_version:104 == Version(sources.Version).upstream_version:
106 if _apt_caller(package, sources.Version, target_dir):105 if self._run_apt_source(package, sources.Version, target_dir):
107 return True106 return
108 break107 break
109 info("apt could not find the needed tarball.")108 info("apt could not find the needed tarball.")
110 return False109 raise PackageVersionNotPresent(package, upstream_version, self)
111110
112 def _get_command(self, package, version_str):111 def _get_command(self, package, version_str):
113 return 'apt-get source -y --only-source --tar-only %s=%s' % \112 return 'apt-get source -y --only-source --tar-only %s=%s' % \
@@ -153,7 +152,6 @@
153 tarball_base = "%s-%s" % (package, version)152 tarball_base = "%s-%s" % (package, version)
154 rev_tree = self.upstream_branch.repository.revision_tree(revid)153 rev_tree = self.upstream_branch.repository.revision_tree(revid)
155 export(rev_tree, target_filename, 'tgz', tarball_base)154 export(rev_tree, target_filename, 'tgz', tarball_base)
156 return True
157 finally:155 finally:
158 self.upstream_branch.unlock()156 self.upstream_branch.unlock()
159157
@@ -198,13 +196,14 @@
198 os.mkdir(export_dir)196 os.mkdir(export_dir)
199 export_dir = os.path.join(export_dir, "debian")197 export_dir = os.path.join(export_dir, "debian")
200 export(self.tree, export_dir, format="dir")198 export(self.tree, export_dir, format="dir")
201 return self._get_orig_source(base_export_dir,199 if not self._get_orig_source(base_export_dir,
202 desired_tarball_name, target_dir)200 desired_tarball_name, target_dir):
201 raise PackageVersionNotPresent(package, version, self)
202 return
203 finally:203 finally:
204 shutil.rmtree(tmpdir)204 shutil.rmtree(tmpdir)
205 info("No debian/rules file to try and use for a get-orig-source "205 info("No debian/rules file to try and use for a get-orig-source rule")
206 "rule")206 raise PackageVersionNotPresent(package, version, self)
207 return False
208207
209208
210class UScanSource(UpstreamSource):209class UScanSource(UpstreamSource):
@@ -226,7 +225,7 @@
226 return False225 return False
227 return True226 return True
228227
229 def get_specific_version(self, package, version, target_dir):228 def _export_watchfile(self):
230 if self.larstiq:229 if self.larstiq:
231 watchfile = 'watch'230 watchfile = 'watch'
232 else:231 else:
@@ -234,7 +233,7 @@
234 watch_id = self.tree.path2id(watchfile)233 watch_id = self.tree.path2id(watchfile)
235 if watch_id is None:234 if watch_id is None:
236 info("No watch file to use to retrieve upstream tarball.")235 info("No watch file to use to retrieve upstream tarball.")
237 return False236 return None
238 (tmp, tempfilename) = tempfile.mkstemp()237 (tmp, tempfilename) = tempfile.mkstemp()
239 try:238 try:
240 tmp = os.fdopen(tmp, 'wb')239 tmp = os.fdopen(tmp, 'wb')
@@ -242,9 +241,16 @@
242 tmp.write(watch)241 tmp.write(watch)
243 finally:242 finally:
244 tmp.close()243 tmp.close()
244 return tempfilename
245
246 def get_specific_version(self, package, version, target_dir):
247 tempfilename = self._export_watchfile()
248 if tempfilename is None:
249 raise PackageVersionNotPresent(package, version, self)
245 try:250 try:
246 return self._uscan(package, version, tempfilename, 251 if not self._uscan(package, version, tempfilename,
247 target_dir)252 target_dir):
253 raise PackageVersionNotPresent(package, version, self)
248 finally:254 finally:
249 os.unlink(tempfilename)255 os.unlink(tempfilename)
250256
@@ -266,15 +272,14 @@
266 tar.add(export_dir, "%s-%s" % (package, upstream_version))272 tar.add(export_dir, "%s-%s" % (package, upstream_version))
267 finally:273 finally:
268 tar.close()274 tar.close()
269 return True
270 finally:275 finally:
271 shutil.rmtree(tmpdir)276 shutil.rmtree(tmpdir)
272277
273 def get_specific_version(self, package, version, target_dir):278 def get_specific_version(self, package, version, target_dir):
274 info("Using the current branch without the 'debian' directory "279 info("Using the current branch without the 'debian' directory "
275 "to create the tarball")280 "to create the tarball")
276 return self._split(package,281 self._split(package, version,
277 version, self._tarball_path(package, version, target_dir))282 self._tarball_path(package, version, target_dir))
278283
279284
280class StackedUpstreamSource(UpstreamSource):285class StackedUpstreamSource(UpstreamSource):
@@ -286,11 +291,47 @@
286 def __init__(self, sources):291 def __init__(self, sources):
287 self._sources = sources292 self._sources = sources
288293
294 def __repr__(self):
295 return "%s(%r)" % (self.__class__.__name__, self._sources)
296
289 def get_specific_version(self, package, version, target_dir):297 def get_specific_version(self, package, version, target_dir):
290 for source in self._sources:298 for source in self._sources:
291 if source.get_specific_version(package, version, target_dir):299 try:
292 return True300 return source.get_specific_version(package, version, target_dir)
293 return False301 except PackageVersionNotPresent:
302 pass
303 raise PackageVersionNotPresent(package, version, self)
304
305
306def get_upstream_sources(tree, branch, larstiq=False, upstream_branch=None,
307 upstream_revision=None, allow_split=False):
308 """Get the list of upstream sources to retrieve upstream versions from.
309
310 :param tree: The tree that is being built from.
311 :param branch: The branch that is being built from.
312 :param larstiq: Whether the tree versions the root of ./debian.
313 :param upstream_branch: An upstream branch that can be exported
314 if needed.
315 :param upstream_revision: The revision to use of the upstream branch
316 if it is used.
317 :param allow_split: Whether the provider can provide the tarball
318 by exporting the branch and removing the "debian" dir.
319
320 """
321 sources = [
322 PristineTarSource(tree, branch),
323 AptSource(),
324 ]
325 if upstream_branch is not None:
326 sources.append(
327 UpstreamBranchSource(upstream_branch, upstream_revision))
328 sources.extend([
329 GetOrigSourceSource(tree, larstiq),
330 UScanSource(tree, larstiq),
331 ])
332 if allow_split:
333 sources.append(SelfSplitSource(tree))
334 return sources
294335
295336
296class UpstreamProvider(object):337class UpstreamProvider(object):
@@ -300,40 +341,16 @@
300 instance using pristine-tar, or using apt.341 instance using pristine-tar, or using apt.
301 """342 """
302343
303 def __init__(self, tree, branch, package, version, store_dir,344 def __init__(self, package, version, store_dir, sources):
304 larstiq=False, upstream_branch=None, upstream_revision=None,
305 allow_split=False):
306 """Create an UpstreamProvider.345 """Create an UpstreamProvider.
307346
308 :param tree: The tree that is being built from.
309 :param branch: The branch that is being built from.
310 :param package: the name of the source package that is being built.347 :param package: the name of the source package that is being built.
311 :param version: the Version of the package that is being built.348 :param version: the Version of the package that is being built.
312 :param store_dir: A directory to cache the tarballs.349 :param store_dir: A directory to cache the tarballs.
313 :param larstiq: Whether the tree versions the root of ./debian.
314 :param upstream_branch: An upstream branch that can be exported
315 if needed.
316 :param upstream_revision: The revision to use of the upstream branch
317 if it is used.
318 :param allow_split: Whether the provider can provide the tarball
319 by exporting the branch and removing the "debian" dir.
320 """350 """
321 self.package = package351 self.package = package
322 self.version = Version(version)352 self.version = Version(version)
323 self.store_dir = store_dir353 self.store_dir = store_dir
324 sources = [
325 PristineTarSource(tree, branch),
326 AptSource(),
327 ]
328 if upstream_branch is not None:
329 sources.append(
330 UpstreamBranchSource(upstream_branch, upstream_revision))
331 sources.extend([
332 GetOrigSourceSource(tree, larstiq),
333 UScanSource(tree, larstiq),
334 ])
335 if allow_split:
336 sources.append(SelfSplitSource(tree))
337 self.source = StackedUpstreamSource(sources)354 self.source = StackedUpstreamSource(sources)
338355
339 def provide(self, target_dir):356 def provide(self, target_dir):
@@ -367,15 +384,16 @@
367 if not self.already_exists_in_store():384 if not self.already_exists_in_store():
368 if not os.path.exists(self.store_dir):385 if not os.path.exists(self.store_dir):
369 os.makedirs(self.store_dir)386 os.makedirs(self.store_dir)
370 self.source.get_specific_version(self.package, 387 try:
371 self.version.upstream_version,388 self.source.get_specific_version(self.package,
372 target_dir)389 self.version.upstream_version, target_dir)
390 except PackageVersionNotPresent:
391 raise MissingUpstreamTarball(self._tarball_name())
373 else:392 else:
374 info("Using the upstream tarball that is present in "393 info("Using the upstream tarball that is present in "
375 "%s" % self.store_dir)394 "%s" % self.store_dir)
376 if self.provide_from_store_dir(target_dir):395 assert self.provide_from_store_dir(target_dir)
377 return os.path.join(target_dir, self._tarball_name())396 return os.path.join(target_dir, self._tarball_name())
378 raise MissingUpstreamTarball(self._tarball_name())
379397
380 def already_exists_in_target(self, target_dir):398 def already_exists_in_target(self, target_dir):
381 return os.path.exists(os.path.join(target_dir, self._tarball_name()))399 return os.path.exists(os.path.join(target_dir, self._tarball_name()))

Subscribers

People subscribed via source and target branches