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

Subscribers

People subscribed via source and target branches