Merge lp:~jelmer/bzr-builddeb/obj into lp:~bzr-builddeb-hackers/bzr-builddeb/trunk-old

Proposed by Jelmer Vernooij
Status: Merged
Merged at revision: not available
Proposed branch: lp:~jelmer/bzr-builddeb/obj
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/obj
Reviewer Review Type Date Requested Status
James Westby Approve
Review via email: mp+5607@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Jelmer Vernooij (jelmer) wrote :

The attached patch adds a new class UpstreamSource (for lack of a
better name) that represents a source of upstream tarballs.
UpstreamSources currently only can retrieve specific version tarballs,
but the idea is that they'll in the future also be able to (where
possible/applicable):

 * retrieve the last upstream version string
 * retrieve the last upstream version tarball
 * return the revid matching a particular upstream version
 * list the available upstream versions

It also makes bzr-builddeb support retrieval of upstream snapshot
versions again ("1.0~bzr13").

Cheers,

Jelmer

Revision history for this message
James Westby (james-w) wrote :

Merged,

Thanks

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'cmds.py'
--- cmds.py 2009-04-15 11:50:06 +0000
+++ cmds.py 2009-04-16 10:42:12 +0000
@@ -74,7 +74,11 @@
74 MergeModeDistiller,74 MergeModeDistiller,
75 NativeSourceDistiller,75 NativeSourceDistiller,
76 )76 )
77from bzrlib.plugins.builddeb.upstream import UpstreamProvider77from bzrlib.plugins.builddeb.upstream import (
78 UpstreamProvider,
79 UpstreamBranchSource,
80 get_upstream_sources,
81 )
78from bzrlib.plugins.builddeb.util import (find_changelog,82from bzrlib.plugins.builddeb.util import (find_changelog,
79 lookup_distribution,83 lookup_distribution,
80 suite_to_distribution,84 suite_to_distribution,
@@ -362,10 +366,11 @@
362 self._get_upstream_branch(merge, export_upstream,366 self._get_upstream_branch(merge, export_upstream,
363 export_upstream_revision, config)367 export_upstream_revision, config)
364368
365 upstream_provider = UpstreamProvider(tree, branch,369 upstream_provider = UpstreamProvider(
366 changelog.package, changelog.version.upstream_version,370 changelog.package, changelog.version.upstream_version,
367 orig_dir, larstiq=larstiq, upstream_branch=upstream_branch,371 orig_dir, get_upstream_sources(tree, branch,
368 upstream_revision=upstream_revision, allow_split=split)372 larstiq=larstiq, upstream_branch=upstream_branch,
373 upstream_revision=upstream_revision, allow_split=split))
369374
370 if merge:375 if merge:
371 distiller_cls = MergeModeDistiller376 distiller_cls = MergeModeDistiller
@@ -379,8 +384,8 @@
379 is_working_tree=working_tree)384 is_working_tree=working_tree)
380385
381 build_source_dir = os.path.join(build_dir,386 build_source_dir = os.path.join(build_dir,
382 changelog.package + "-"387 "%s-%s" % (changelog.package,
383 + changelog.version.upstream_version)388 changelog.version.upstream_version))
384389
385 builder = DebBuild(distiller, build_source_dir, build_cmd,390 builder = DebBuild(distiller, build_source_dir, build_cmd,
386 use_existing=use_existing)391 use_existing=use_existing)
@@ -565,11 +570,10 @@
565 tarball_filename = os.path.join(orig_dir, dest_name)570 tarball_filename = os.path.join(orig_dir, dest_name)
566571
567 if upstream_branch and no_tarball:572 if upstream_branch and no_tarball:
568 info("Exporting the upstream branch to create the tarball")573 upstream = UpstreamBranchSource(upstream_branch,
569 rev_tree = upstream_branch.repository.revision_tree(
570 upstream_revision)574 upstream_revision)
571 export(rev_tree, tarball_filename, format='tgz',575 upstream.get_specific_version(package, version.upstream_version,
572 root="%s-%s" % (package, version.upstream_version))576 orig_dir)
573 else:577 else:
574 try:578 try:
575 repack_tarball(location, dest_name, target_dir=orig_dir)579 repack_tarball(location, dest_name, target_dir=orig_dir)
@@ -764,9 +768,9 @@
764 orig_dir = config.orig_dir768 orig_dir = config.orig_dir
765 if orig_dir is None:769 if orig_dir is None:
766 orig_dir = default_orig_dir770 orig_dir = default_orig_dir
767 upstream_provider = UpstreamProvider(t, t.branch,771 upstream_provider = UpstreamProvider(changelog.package,
768 changelog.package, changelog.version.upstream_version,772 changelog.version.upstream_version, orig_dir,
769 orig_dir, larstiq=larstiq)773 get_upstream_sources(t, t.branch, larstiq=larstiq))
770774
771 distiller = MergeModeDistiller(t, upstream_provider,775 distiller = MergeModeDistiller(t, upstream_provider,
772 larstiq=larstiq)776 larstiq=larstiq)
773777
=== 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 'import_dsc.py'
--- import_dsc.py 2009-03-11 07:23:20 +0000
+++ import_dsc.py 2009-04-15 23:17:50 +0000
@@ -57,6 +57,7 @@
57 )57 )
58from bzrlib.export import export58from bzrlib.export import export
59from bzrlib.osutils import file_iterator, isdir, basename, splitpath59from bzrlib.osutils import file_iterator, isdir, basename, splitpath
60from bzrlib.revisionspec import RevisionSpec
60from bzrlib.revision import NULL_REVISION61from bzrlib.revision import NULL_REVISION
61from bzrlib.trace import warning, info, mutter62from bzrlib.trace import warning, info, mutter
62from bzrlib.transform import TreeTransform, cook_conflicts, resolve_conflicts63from bzrlib.transform import TreeTransform, cook_conflicts, resolve_conflicts
@@ -73,7 +74,7 @@
73 UpstreamAlreadyImported,74 UpstreamAlreadyImported,
74 UpstreamBranchAlreadyMerged,75 UpstreamBranchAlreadyMerged,
75 )76 )
76from bzrlib.plugins.builddeb.util import get_commit_info_from_changelog77from bzrlib.plugins.builddeb.util import get_commit_info_from_changelog, get_snapshot_revision
7778
7879
79files_to_ignore = set(['.cvsignore', '.arch-inventory', '.bzrignore',80files_to_ignore = set(['.cvsignore', '.arch-inventory', '.bzrignore',
@@ -1534,16 +1535,23 @@
1534 "Should use self.upstream_branch if set"1535 "Should use self.upstream_branch if set"
1535 tempdir = tempfile.mkdtemp(dir=os.path.join(self.tree.basedir, '..'))1536 tempdir = tempfile.mkdtemp(dir=os.path.join(self.tree.basedir, '..'))
1536 try:1537 try:
1538 previous_upstream_revision = get_snapshot_revision(previous_version.upstream_version)
1537 if previous_version is not None:1539 if previous_version is not None:
1538 if not self.has_upstream_version_in_packaging_branch(1540 if self.has_upstream_version_in_packaging_branch(
1539 previous_version):1541 previous_version):
1542 upstream_tip = self._revid_of_upstream_version_from_branch(
1543 previous_version)
1544 self._extract_upstream_tree(upstream_tip, tempdir)
1545 elif (upstream_branch is not None and
1546 previous_upstream_revision is not None):
1547 upstream_tip = RevisionSpec.from_string(previous_upstream_revision).as_revision_id(upstream_branch)
1548 assert isinstance(upstream_tip, str)
1549 self._extract_upstream_tree(upstream_tip, tempdir)
1550 else:
1540 raise BzrCommandError("Unable to find the tag for the "1551 raise BzrCommandError("Unable to find the tag for the "
1541 "previous upstream version, %s, in the branch: "1552 "previous upstream version, %s, in the branch: "
1542 "%s" % (previous_version,1553 "%s" % (previous_version,
1543 self.upstream_tag_name(previous_version)))1554 self.upstream_tag_name(previous_version)))
1544 upstream_tip = self._revid_of_upstream_version_from_branch(
1545 previous_version)
1546 self._extract_upstream_tree(upstream_tip, tempdir)
1547 else:1555 else:
1548 self._create_empty_upstream_tree(tempdir)1556 self._create_empty_upstream_tree(tempdir)
1549 if self.has_upstream_version_in_packaging_branch(version):1557 if self.has_upstream_version_in_packaging_branch(version):
15501558
=== modified file 'tests/test_upstream.py'
--- tests/test_upstream.py 2009-03-08 23:18:01 +0000
+++ tests/test_upstream.py 2009-04-16 10:42:12 +0000
@@ -24,14 +24,21 @@
2424
25from debian_bundle.changelog import Version25from debian_bundle.changelog import Version
2626
27from bzrlib.tests import TestCaseWithTransport27from bzrlib.tests import (
28 TestCase,
29 TestCaseWithTransport,
30 )
28from bzrlib.plugins.builddeb.errors import (31from bzrlib.plugins.builddeb.errors import (
29 MissingUpstreamTarball,32 MissingUpstreamTarball,
33 PackageVersionNotPresent,
30 )34 )
31from bzrlib.plugins.builddeb.upstream import (35from bzrlib.plugins.builddeb.upstream import (
36 AptSource,
37 PristineTarSource,
38 StackedUpstreamSource,
32 UpstreamProvider,39 UpstreamProvider,
33 get_apt_command_for_source,40 UpstreamSource,
34 provide_with_apt,41 UScanSource,
35 )42 )
36from bzrlib.plugins.builddeb.util import (43from bzrlib.plugins.builddeb.util import (
37 get_parent_dir,44 get_parent_dir,
@@ -39,156 +46,6 @@
39 )46 )
4047
4148
42class MockProvider(object):
43
44 def create_target(self, path):
45 parent_dir = get_parent_dir(path)
46 if parent_dir != '' and not os.path.exists(parent_dir):
47 os.makedirs(parent_dir)
48 f = open(path, "wb")
49 try:
50 f.write('')
51 finally:
52 f.close()
53
54 def tarball_name(self, package, upstream_version):
55 return tarball_name(package, upstream_version)
56
57
58class MockAptProvider(MockProvider):
59
60 def __init__(self, find=False):
61 self.find = find
62 self.called_times = 0
63 self.package = None
64 self.upstream_version = None
65 self.target_dir = None
66
67 def provide(self, package, upstream_version, target_dir):
68 self.called_times += 1
69 self.package = package
70 self.upstream_version = upstream_version
71 self.target_dir = target_dir
72 if self.find:
73 self.create_target(os.path.join(target_dir,
74 self.tarball_name(package, upstream_version)))
75 return self.find
76
77
78class MockUscanProvider(MockProvider):
79
80 def __init__(self, find=False):
81 self.find = find
82 self.called_times = 0
83 self.package = None
84 self.upstream_version = None
85 self.watch_file_contents = None
86 self.target_dir = None
87
88 def provide(self, package, upstream_version, watch_file, target_dir):
89 self.called_times += 1
90 self.package = package
91 self.upstream_version = upstream_version
92 f = open(watch_file, "rb")
93 try:
94 self.watch_file_contents = f.read()
95 finally:
96 f.close()
97 self.target_dir = target_dir
98 if self.find:
99 self.create_target(os.path.join(target_dir,
100 self.tarball_name(package, upstream_version)))
101 return self.find
102
103
104class MockPristineProvider(MockProvider):
105
106 def __init__(self, find=False):
107 self.find = find
108 self.called_times = 0
109 self.tree = None
110 self.branch = None
111 self.package = None
112 self.version = None
113 self.target_filename = None
114
115 def provide(self, tree, branch, package, version, target_filename):
116 self.called_times += 1
117 self.tree = tree
118 self.branch = branch
119 self.package = package
120 self.version = version
121 self.target_filename = target_filename
122 if self.find:
123 self.create_target(target_filename)
124 return self.find
125
126
127class MockOrigSourceProvider(MockProvider):
128
129 def __init__(self, find=False):
130 self.find = find
131 self.called_times = 0
132 self.source_dir = None
133 self.fetch_dir = None
134 self.desired_tarball_name = None
135 self.target_dir = None
136
137 def provide(self, source_dir, fetch_dir, desired_tarball_name,
138 target_dir):
139 self.called_times += 1
140 self.source_dir = source_dir
141 self.fetch_dir = fetch_dir
142 self.desired_tarball_name = desired_tarball_name
143 self.target_dir = target_dir
144 if self.find:
145 self.create_target(os.path.join(target_dir, desired_tarball_name))
146 return self.find
147
148
149class MockOtherBranchProvider(MockProvider):
150
151 def __init__(self, find=False):
152 self.find = find
153 self.called_times = 0
154 self.upstream_branch = None
155 self.upstream_revision = None
156 self.target_filename = None
157 self.tarball_base = None
158
159 def provide(self, upstream_branch, upstream_revision, target_filename,
160 tarball_base):
161 self.called_times += 1
162 self.upstream_branch = upstream_branch
163 self.upstream_revision = upstream_revision
164 self.target_filename = target_filename
165 self.tarball_base = tarball_base
166 if self.find:
167 self.create_target(target_filename)
168 return self.find
169
170
171class MockSplitProvider(MockProvider):
172
173 def __init__(self, find=False):
174 self.find = find
175 self.called_times = 0
176 self.tree = None
177 self.package = None
178 self.upstream_version = None
179 self.target_filename = None
180
181 def provide(self, tree, package, upstream_version, target_filename):
182 self.called_times += 1
183 self.tree = tree
184 self.package = package
185 self.upstream_version = upstream_version
186 self.target_filename = target_filename
187 if self.find:
188 self.create_target(self.target_filename)
189 return self.find
190
191
192class MockSources(object):49class MockSources(object):
19350
194 def __init__(self, versions):51 def __init__(self, versions):
@@ -245,210 +102,21 @@
245 return self.work102 return self.work
246103
247104
248class UpstreamProviderTests(TestCaseWithTransport):105class AptSourceTests(TestCase):
249
250 def setUp(self):
251 super(UpstreamProviderTests, self).setUp()
252 self.tree = self.make_branch_and_tree(".")
253 self.branch = self.tree.branch
254 self.package = "package"
255 self.version = Version("0.1-1")
256 self.upstream_version = self.version.upstream_version
257 self.desired_tarball_name = tarball_name(self.package,
258 self.upstream_version)
259 self.tarball_base = "%s-%s" % (self.package, self.upstream_version)
260 self.store_dir = "store"
261 self.provider = UpstreamProvider(self.tree, self.branch,
262 self.package, self.version, self.store_dir)
263 self.providers = {}
264 self.providers["apt"]= MockAptProvider()
265 self.provider._apt_provider = self.providers["apt"].provide
266 self.providers["uscan"] = MockUscanProvider()
267 self.provider._uscan_provider = self.providers["uscan"].provide
268 self.providers["pristine"] = MockPristineProvider()
269 self.provider._pristine_provider = self.providers["pristine"].provide
270 self.providers["orig"] = MockOrigSourceProvider()
271 self.provider._orig_source_provider = self.providers["orig"].provide
272 self.providers["upstream"] = MockOtherBranchProvider()
273 self.provider._upstream_branch_provider = \
274 self.providers["upstream"].provide
275 self.providers["split"] = MockSplitProvider()
276 self.provider._split_provider = self.providers["split"].provide
277 self.target_dir = "target"
278 self.target_filename = os.path.join(self.target_dir,
279 self.desired_tarball_name)
280 self.store_filename = os.path.join(self.store_dir,
281 tarball_name(self.package, self.version.upstream_version))
282
283 def assertProvidersCalled(self, providers):
284 for provider_name, provider in self.providers.items():
285 if provider_name in providers:
286 self.assertCalledCorrectly(provider_name)
287 else:
288 self.assertEqual(provider.called_times, 0,
289 "%s wasn't expected to be called" % provider_name)
290
291 def call_provider(self):
292 self.assertEqual(self.provider.provide(self.target_dir),
293 self.target_filename)
294
295 def test_already_in_target(self):
296 os.makedirs(self.target_dir)
297 f = open(self.target_filename, "wb")
298 f.close()
299 self.call_provider()
300 self.failUnlessExists(self.target_filename)
301 # Should this be copied across?
302 self.failIfExists(self.store_filename)
303 self.assertProvidersCalled({})
304
305 def test_already_in_store(self):
306 os.makedirs(self.store_dir)
307 f = open(self.store_filename, "wb")
308 f.close()
309 self.call_provider()
310 self.failUnlessExists(self.target_filename)
311 self.failUnlessExists(self.store_filename)
312 self.assertProvidersCalled({})
313
314 def assertCalledCorrectly(self, provider_name):
315 provider = self.providers[provider_name]
316 for attr_name in provider.__dict__:
317 if attr_name in ("find", "provide", "source_dir"):
318 continue
319 if attr_name == "called_times":
320 self.assertEqual(provider.called_times, 1,
321 "%s was not called" % provider_name)
322 continue
323 if attr_name == "target_filename":
324 self.assertEqual(provider.target_filename,
325 self.store_filename)
326 continue
327 if attr_name == "target_dir":
328 self.assertEqual(provider.target_dir,
329 self.store_dir)
330 continue
331 if attr_name == "fetch_dir":
332 self.assertEqual(provider.fetch_dir,
333 os.path.dirname(provider.source_dir))
334 continue
335 attr = getattr(provider, attr_name)
336 correct_attr = getattr(self, attr_name)
337 self.assertEqual(correct_attr, attr,
338 "%s doesn't match\nexpected: %s\ngot: %s"
339 % (attr_name, correct_attr, attr))
340
341 def assertSuccesfulCall(self, provider, other_providers):
342 self.providers[provider].find = True
343 self.call_provider()
344 self.failUnlessExists(self.target_filename)
345 self.failUnlessExists(self.store_filename)
346 self.assertProvidersCalled([provider] + other_providers)
347
348 def test_from_pristine_tar(self):
349 self.assertSuccesfulCall("pristine", [])
350
351 def test_from_apt(self):
352 self.assertSuccesfulCall("apt", ["pristine"])
353
354 def test_from_uscan(self):
355 self.build_tree(["watch", "debian/", "debian/watch"])
356 self.tree.add(["watch", "debian/", "debian/watch"])
357 self.watch_file_contents = "contents of debian/watch\n"
358 self.assertSuccesfulCall("uscan", ["pristine", "apt"])
359
360 def test_uscan_not_called_if_not_watch(self):
361 self.build_tree(["watch"])
362 self.tree.add(["watch"])
363 self.assertRaises(MissingUpstreamTarball, self.provider.provide,
364 self.target_dir)
365 self.failIfExists(self.target_filename)
366 self.failIfExists(self.store_filename)
367 self.assertProvidersCalled(["pristine", "apt"])
368
369 def test_uscan_in_larstiq(self):
370 self.build_tree(["watch", "debian/", "debian/watch"])
371 self.tree.add(["watch", "debian/", "debian/watch"])
372 self.watch_file_contents = "contents of watch\n"
373 self.provider.larstiq = True
374 self.assertSuccesfulCall("uscan", ["pristine", "apt"])
375
376 def test_from_get_orig_source(self):
377 self.build_tree(["rules", "debian/", "debian/rules"])
378 self.tree.add(["rules", "debian/", "debian/rules"])
379 self.watch_file_contents = "contents of debian/rules\n"
380 self.assertSuccesfulCall("orig", ["pristine", "apt"])
381
382 def test_get_orig_source_not_called_if_no_rules(self):
383 self.build_tree(["rules"])
384 self.tree.add(["rules"])
385 self.assertRaises(MissingUpstreamTarball, self.provider.provide,
386 self.target_dir)
387 self.failIfExists(self.target_filename)
388 self.failIfExists(self.store_filename)
389 self.assertProvidersCalled(["pristine", "apt"])
390
391 def test_get_orig_source_in_larstiq(self):
392 self.build_tree(["rules", "debian/", "debian/rules"])
393 self.tree.add(["rules", "debian/", "debian/rules"])
394 self.watch_file_contents = "contents of rules\n"
395 self.provider.larstiq = True
396 self.assertSuccesfulCall("orig", ["pristine", "apt"])
397
398 def test_from_upstream_branch(self):
399 upstream_tree = self.make_branch_and_tree("upstream")
400 self.build_tree(["upstream/foo"])
401 upstream_tree.add(["foo"])
402 self.upstream_branch = upstream_tree.branch
403 self.upstream_revision = upstream_tree.commit("upstream one")
404 self.provider.upstream_revision = self.upstream_revision
405 self.provider.upstream_branch = self.upstream_branch
406 self.assertSuccesfulCall("upstream", ["pristine", "apt"])
407
408 def test_from_split(self):
409 self.provider.allow_split = True
410 self.assertSuccesfulCall("split", ["pristine", "apt"])
411
412 def test_upstream_before_orig_source(self):
413 upstream_tree = self.make_branch_and_tree("upstream")
414 self.build_tree(["upstream/foo"])
415 upstream_tree.add(["foo"])
416 self.upstream_branch = upstream_tree.branch
417 self.upstream_revision = upstream_tree.commit("upstream one")
418 self.provider.upstream_revision = self.upstream_revision
419 self.provider.upstream_branch = self.upstream_branch
420 self.build_tree(["rules", "debian/", "debian/rules"])
421 self.tree.add(["rules", "debian/", "debian/rules"])
422 self.watch_file_contents = "contents of debian/rules\n"
423 self.assertSuccesfulCall("upstream", ["pristine", "apt"])
424
425 def test_get_orig_source_before_uscan(self):
426 self.build_tree(["rules", "debian/", "debian/rules"])
427 self.tree.add(["rules", "debian/", "debian/rules"])
428 self.watch_file_contents = "contents of debian/rules\n"
429 self.build_tree(["watch", "debian/watch"])
430 self.tree.add(["watch", "debian/watch"])
431 self.watch_file_contents = "contents of debian/watch\n"
432 self.assertSuccesfulCall("orig", ["pristine", "apt"])
433
434 def test_uscan_before_split(self):
435 self.build_tree(["watch", "debian/", "debian/watch"])
436 self.tree.add(["watch", "debian/", "debian/watch"])
437 self.watch_file_contents = "contents of debian/watch\n"
438 self.provider.allow_split = True
439 self.assertSuccesfulCall("uscan", ["pristine", "apt"])
440106
441 def test_get_apt_command_for_source(self):107 def test_get_apt_command_for_source(self):
442 self.assertEqual("apt-get source -y --only-source --tar-only "108 self.assertEqual("apt-get source -y --only-source --tar-only "
443 "apackage=someversion",109 "apackage=someversion",
444 get_apt_command_for_source("apackage", "someversion"))110 AptSource()._get_command("apackage", "someversion"))
445111
446 def test_apt_provider_no_package(self):112 def test_apt_provider_no_package(self):
447 caller = MockAptCaller()113 caller = MockAptCaller()
448 sources = MockSources([])114 sources = MockSources([])
449 apt_pkg = MockAptPkg(sources)115 apt_pkg = MockAptPkg(sources)
450 self.assertEqual(False, provide_with_apt("apackage", "0.2",116 src = AptSource()
451 "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)
452 self.assertEqual(1, apt_pkg.init_called_times)120 self.assertEqual(1, apt_pkg.init_called_times)
453 self.assertEqual(1, apt_pkg.get_pkg_source_records_called_times)121 self.assertEqual(1, apt_pkg.get_pkg_source_records_called_times)
454 self.assertEqual(1, sources.restart_called_times)122 self.assertEqual(1, sources.restart_called_times)
@@ -460,8 +128,10 @@
460 caller = MockAptCaller()128 caller = MockAptCaller()
461 sources = MockSources(["0.1-1"])129 sources = MockSources(["0.1-1"])
462 apt_pkg = MockAptPkg(sources)130 apt_pkg = MockAptPkg(sources)
463 self.assertEqual(False, provide_with_apt("apackage", "0.2",131 src = AptSource()
464 "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)
465 self.assertEqual(1, apt_pkg.init_called_times)135 self.assertEqual(1, apt_pkg.init_called_times)
466 self.assertEqual(1, apt_pkg.get_pkg_source_records_called_times)136 self.assertEqual(1, apt_pkg.get_pkg_source_records_called_times)
467 self.assertEqual(1, sources.restart_called_times)137 self.assertEqual(1, sources.restart_called_times)
@@ -473,8 +143,10 @@
473 caller = MockAptCaller(work=True)143 caller = MockAptCaller(work=True)
474 sources = MockSources(["0.1-1", "0.2-1"])144 sources = MockSources(["0.1-1", "0.2-1"])
475 apt_pkg = MockAptPkg(sources)145 apt_pkg = MockAptPkg(sources)
476 self.assertEqual(True, provide_with_apt("apackage", "0.2",146 src = AptSource()
477 "target", _apt_pkg=apt_pkg, _apt_caller=caller.call))147 src._run_apt_source = caller.call
148 src.get_specific_version("apackage", "0.2", "target",
149 _apt_pkg=apt_pkg)
478 self.assertEqual(1, apt_pkg.init_called_times)150 self.assertEqual(1, apt_pkg.init_called_times)
479 self.assertEqual(1, apt_pkg.get_pkg_source_records_called_times)151 self.assertEqual(1, apt_pkg.get_pkg_source_records_called_times)
480 self.assertEqual(1, sources.restart_called_times)152 self.assertEqual(1, sources.restart_called_times)
@@ -490,8 +162,11 @@
490 caller = MockAptCaller()162 caller = MockAptCaller()
491 sources = MockSources(["0.1-1", "0.2-1"])163 sources = MockSources(["0.1-1", "0.2-1"])
492 apt_pkg = MockAptPkg(sources)164 apt_pkg = MockAptPkg(sources)
493 self.assertEqual(False, provide_with_apt("apackage", "0.2",165 src = AptSource()
494 "target", _apt_pkg=apt_pkg, _apt_caller=caller.call))166 src._run_apt_source = caller.call
167 self.assertRaises(PackageVersionNotPresent, src.get_specific_version,
168 "apackage", "0.2", "target",
169 _apt_pkg=apt_pkg)
495 self.assertEqual(1, apt_pkg.init_called_times)170 self.assertEqual(1, apt_pkg.init_called_times)
496 self.assertEqual(1, apt_pkg.get_pkg_source_records_called_times)171 self.assertEqual(1, apt_pkg.get_pkg_source_records_called_times)
497 self.assertEqual(1, sources.restart_called_times)172 self.assertEqual(1, sources.restart_called_times)
@@ -502,3 +177,71 @@
502 self.assertEqual("apackage", caller.package)177 self.assertEqual("apackage", caller.package)
503 self.assertEqual("0.2-1", caller.version_str)178 self.assertEqual("0.2-1", caller.version_str)
504 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)
505248
=== modified file 'upstream.py'
--- upstream.py 2009-03-07 23:54:46 +0000
+++ upstream.py 2009-04-16 10:06:01 +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#
@@ -26,119 +27,313 @@
26from debian_bundle.changelog import Version27from debian_bundle.changelog import Version
2728
28from bzrlib.export import export29from bzrlib.export import export
30from bzrlib.revisionspec import RevisionSpec
29from bzrlib.trace import info31from bzrlib.trace import info
3032
31from bzrlib.plugins.builddeb.errors import MissingUpstreamTarball33from bzrlib.plugins.builddeb.errors import (
34 MissingUpstreamTarball,
35 PackageVersionNotPresent,
36 )
32from bzrlib.plugins.builddeb.import_dsc import DistributionBranch37from bzrlib.plugins.builddeb.import_dsc import DistributionBranch
33from bzrlib.plugins.builddeb.repack_tarball import repack_tarball38from bzrlib.plugins.builddeb.repack_tarball import repack_tarball
3439from bzrlib.plugins.builddeb.util import (
3540 get_snapshot_revision,
36def get_apt_command_for_source(package, version_str):41 tarball_name,
37 return 'apt-get source -y --only-source --tar-only %s=%s' % \42 )
38 (package, version_str)43
3944
4045class UpstreamSource(object):
41def call_apt_for_source(package, version_str, target_dir):46 """A source for upstream versions (uscan, get-orig-source, etc)."""
42 command = get_apt_command_for_source(package, version_str)47
43 proc = subprocess.Popen(command, shell=True, cwd=target_dir)48 def get_latest_version(self, package, target_dir):
44 proc.wait()49 """Fetch the source tarball for the latest available version.
45 if proc.returncode != 0:50
46 return False51 :param package: Name of the package
47 return True52 :param target_dir: Directory in which to store the tarball
4853 """
4954 raise NotImplemented(self.get_latest_version)
50def provide_with_apt(package, upstream_version, target_dir, _apt_pkg=None,55
51 _apt_caller=None):56 def get_specific_version(self, package, version, target_dir):
52 if _apt_pkg is None:57 """Fetch the source tarball for a particular version.
53 import apt_pkg58
54 else:59 :param package: Name of the package
55 apt_pkg = _apt_pkg60 :param version: Version string of the version to fetch
56 if _apt_caller is None:61 :param target_dir: Directory in which to store the tarball
57 _apt_caller = call_apt_for_source62 """
58 apt_pkg.init()63 raise NotImplemented(self.get_specific_version)
59 sources = apt_pkg.GetPkgSrcRecords()64
60 sources.Restart()65 def _tarball_path(self, package, version, target_dir):
61 info("Using apt to look for the upstream tarball.")66 return os.path.join(target_dir, tarball_name(package, version))
62 while sources.Lookup(package):67
63 if upstream_version \68
64 == Version(sources.Version).upstream_version:69class PristineTarSource(UpstreamSource):
65 if _apt_caller(package, sources.Version, target_dir):70 """Source that uses the pristine-tar revisions in the packaging branch."""
66 return True71
67 break72 def __init__(self, tree, branch):
68 info("apt could not find the needed tarball.")73 self.branch = branch
69 return False74 self.tree = tree
7075
7176 def get_specific_version(self, package, upstream_version, target_dir):
72def provide_with_uscan(package, upstream_version, watch_file, target_dir):77 # FIXME: Make provide_with_pristine_tar take a upstream
73 info("Using uscan to look for the upstream tarball.")78 # version string; it doesn't need the debian-specific data
74 r = os.system("uscan --upstream-version %s --force-download --rename "79 version = Version("%s-1" % upstream_version)
75 "--package %s --watchfile %s --check-dirname-level 0 " 80 target_filename = self._tarball_path(package, upstream_version,
76 "--download --repack --destdir %s" %81 target_dir)
77 (upstream_version, package, watch_file, target_dir))82 db = DistributionBranch(self.branch, None, tree=self.tree)
78 if r != 0:83 if not db.has_upstream_version_in_packaging_branch(version):
79 info("uscan could not find the needed tarball.")84 raise PackageVersionNotPresent(package, upstream_version, self)
80 return False85 revid = db._revid_of_upstream_version_from_branch(version)
81 return True86 if not db.has_pristine_tar_delta(revid):
8287 raise PackageVersionNotPresent(package, upstream_version, self)
8388 info("Using pristine-tar to reconstruct the needed tarball.")
84def provide_with_pristine_tar(tree, branch, package, version,89 db.reconstruct_pristine_tar(revid, package, version, target_filename)
85 target_filename):90
86 db = DistributionBranch(branch, None, tree=tree)91
87 if not db.has_upstream_version_in_packaging_branch(version):92class AptSource(UpstreamSource):
88 return False93 """Upstream source that uses apt-source."""
89 revid = db._revid_of_upstream_version_from_branch(version)94
90 if not db.has_pristine_tar_delta(revid):95 def get_specific_version(self, package, upstream_version, target_dir,
91 return False96 _apt_pkg=None):
92 info("Using pristine-tar to reconstruct the needed tarball.")97 if _apt_pkg is None:
93 db.reconstruct_pristine_tar(revid, package, version, target_filename)98 import apt_pkg
94 return True99 else:
95100 apt_pkg = _apt_pkg
96101 apt_pkg.init()
97def provide_with_get_orig_source(source_dir, fetch_dir, desired_tarball_name,102 sources = apt_pkg.GetPkgSrcRecords()
98 target_dir):103 sources.Restart()
99 info("Trying to use get-orig-source to retrieve needed tarball.")104 info("Using apt to look for the upstream tarball.")
100 command = ["/usr/bin/make", "-f", "debian/rules", "get-orig-source"]105 while sources.Lookup(package):
101 proc = subprocess.Popen(command, cwd=source_dir)106 if upstream_version \
102 ret = proc.wait()107 == Version(sources.Version).upstream_version:
103 if ret != 0:108 if self._run_apt_source(package, sources.Version, target_dir):
104 info("Trying to run get-orig-source rule failed")109 return
105 return False110 break
106 fetched_tarball = os.path.join(fetch_dir, desired_tarball_name)111 info("apt could not find the needed tarball.")
107 if not os.path.exists(fetched_tarball):112 raise PackageVersionNotPresent(package, upstream_version, self)
108 info("get-orig-source did not create %s"113
109 % desired_tarball_name)114 def _get_command(self, package, version_str):
110 return False115 return 'apt-get source -y --only-source --tar-only %s=%s' % \
111 repack_tarball(fetched_tarball, desired_tarball_name,116 (package, version_str)
112 target_dir=target_dir)117
113 return True118 def _run_apt_source(self, package, version_str, target_dir):
114119 command = self._get_command(package, version_str)
115120 proc = subprocess.Popen(command, shell=True, cwd=target_dir)
116def provide_from_other_branch(branch, revision, target_filename,121 proc.wait()
117 tarball_base):122 if proc.returncode != 0:
118 branch.lock_read()123 return False
119 try:124 return True
120 rev_tree = branch.repository.revision_tree(revision)125
121 export(rev_tree, target_filename, 'tgz', tarball_base)126
122 return True127class UpstreamBranchSource(UpstreamSource):
123 finally:128 """Upstream source that uses the upstream branch."""
124 branch.unlock()129
125130 def __init__(self, upstream_branch, upstream_revision=None,
126131 fallback_revspec=None):
127def provide_by_split(tree, package, upstream_version, target_filename):132 self.upstream_branch = upstream_branch
128 tmpdir = tempfile.mkdtemp(prefix="builddeb-get-orig-source-")133 self.upstream_revision = upstream_revision
129 try:134 self.fallback_revspec = fallback_revspec
130 export_dir = os.path.join(tmpdir,135
131 "%s-%s" % (package, upstream_version))136 def _get_revision_id(self, version):
132 export(tree, export_dir, format="dir")137 if self.upstream_revision is not None:
133 shutil.rmtree(os.path.join(export_dir, "debian"))138 # Explicit revision id to use set
134 tar = tarfile.open(target_filename, "w:gz")139 return self.upstream_revision
135 try:140 revspec = get_snapshot_revision(version)
136 tar.add(export_dir, "%s-%s" % (package, upstream_version))141 if revspec is None:
137 finally:142 revspec = self.fallback_revspec
138 tar.close()143 if revspec is not None:
139 return True144 return RevisionSpec.from_string(
140 finally:145 revspec).as_revision_id(self.upstream_branch)
141 shutil.rmtree(tmpdir)146 return self.upstream_branch.last_revision()
147
148 def get_specific_version(self, package, version, target_dir):
149 self.upstream_branch.lock_read()
150 try:
151 revid = self._get_revision_id(version)
152 info("Exporting upstream branch revision %s to create the tarball",
153 revid)
154 target_filename = self._tarball_path(package, version, target_dir)
155 tarball_base = "%s-%s" % (package, version)
156 rev_tree = self.upstream_branch.repository.revision_tree(revid)
157 export(rev_tree, target_filename, 'tgz', tarball_base)
158 finally:
159 self.upstream_branch.unlock()
160
161
162class GetOrigSourceSource(UpstreamSource):
163 """Upstream source that uses the get-orig-source rule in debian/rules."""
164
165 def __init__(self, tree, larstiq):
166 self.tree = tree
167 self.larstiq = larstiq
168
169 def _get_orig_source(self, source_dir, fetch_dir, desired_tarball_name,
170 target_dir):
171 info("Trying to use get-orig-source to retrieve needed tarball.")
172 command = ["/usr/bin/make", "-f", "debian/rules", "get-orig-source"]
173 proc = subprocess.Popen(command, cwd=source_dir)
174 ret = proc.wait()
175 if ret != 0:
176 info("Trying to run get-orig-source rule failed")
177 return False
178 fetched_tarball = os.path.join(fetch_dir, desired_tarball_name)
179 if not os.path.exists(fetched_tarball):
180 info("get-orig-source did not create %s", desired_tarball_name)
181 return False
182 repack_tarball(fetched_tarball, desired_tarball_name,
183 target_dir=target_dir)
184 return True
185
186 def get_specific_version(self, package, version, target_dir):
187 if self.larstiq:
188 rules_name = 'rules'
189 else:
190 rules_name = 'debian/rules'
191 rules_id = self.tree.path2id(rules_name)
192 if rules_id is not None:
193 desired_tarball_name = tarball_name(package, version)
194 tmpdir = tempfile.mkdtemp(prefix="builddeb-get-orig-source-")
195 try:
196 base_export_dir = os.path.join(tmpdir, "export")
197 export_dir = base_export_dir
198 if self.larstiq:
199 os.mkdir(export_dir)
200 export_dir = os.path.join(export_dir, "debian")
201 export(self.tree, export_dir, format="dir")
202 if not self._get_orig_source(base_export_dir, tmpdir,
203 desired_tarball_name, target_dir):
204 raise PackageVersionNotPresent(package, version, self)
205 return
206 finally:
207 shutil.rmtree(tmpdir)
208 info("No debian/rules file to try and use for a get-orig-source rule")
209 raise PackageVersionNotPresent(package, version, self)
210
211
212class UScanSource(UpstreamSource):
213 """Upstream source that uses uscan."""
214
215 def __init__(self, tree, larstiq):
216 self.tree = tree
217 self.larstiq = larstiq
218
219 def _uscan(self, package, upstream_version, watch_file, target_dir):
220 info("Using uscan to look for the upstream tarball.")
221 r = os.system("uscan --upstream-version %s --force-download --rename "
222 "--package %s --watchfile %s --check-dirname-level 0 "
223 "--download --repack --destdir %s" %
224 (upstream_version, package, watch_file, target_dir))
225 if r != 0:
226 info("uscan could not find the needed tarball.")
227 return False
228 return True
229
230 def _export_watchfile(self):
231 if self.larstiq:
232 watchfile = 'watch'
233 else:
234 watchfile = 'debian/watch'
235 watch_id = self.tree.path2id(watchfile)
236 if watch_id is None:
237 info("No watch file to use to retrieve upstream tarball.")
238 return None
239 (tmp, tempfilename) = tempfile.mkstemp()
240 try:
241 tmp = os.fdopen(tmp, 'wb')
242 watch = self.tree.get_file_text(watch_id)
243 tmp.write(watch)
244 finally:
245 tmp.close()
246 return tempfilename
247
248 def get_specific_version(self, package, version, target_dir):
249 tempfilename = self._export_watchfile()
250 if tempfilename is None:
251 raise PackageVersionNotPresent(package, version, self)
252 try:
253 if not self._uscan(package, version, tempfilename,
254 target_dir):
255 raise PackageVersionNotPresent(package, version, self)
256 finally:
257 os.unlink(tempfilename)
258
259
260class SelfSplitSource(UpstreamSource):
261
262 def __init__(self, tree):
263 self.tree = tree
264
265 def _split(self, package, upstream_version, target_filename):
266 tmpdir = tempfile.mkdtemp(prefix="builddeb-get-orig-source-")
267 try:
268 export_dir = os.path.join(tmpdir,
269 "%s-%s" % (package, upstream_version))
270 export(self.tree, export_dir, format="dir")
271 shutil.rmtree(os.path.join(export_dir, "debian"))
272 tar = tarfile.open(target_filename, "w:gz")
273 try:
274 tar.add(export_dir, "%s-%s" % (package, upstream_version))
275 finally:
276 tar.close()
277 finally:
278 shutil.rmtree(tmpdir)
279
280 def get_specific_version(self, package, version, target_dir):
281 info("Using the current branch without the 'debian' directory "
282 "to create the tarball")
283 self._split(package, version,
284 self._tarball_path(package, version, target_dir))
285
286
287class StackedUpstreamSource(UpstreamSource):
288 """An upstream source that checks a list of other upstream sources.
289
290 The first source that can provide a tarball, wins.
291 """
292
293 def __init__(self, sources):
294 self._sources = sources
295
296 def __repr__(self):
297 return "%s(%r)" % (self.__class__.__name__, self._sources)
298
299 def get_specific_version(self, package, version, target_dir):
300 for source in self._sources:
301 try:
302 return source.get_specific_version(package, version, target_dir)
303 except PackageVersionNotPresent:
304 pass
305 raise PackageVersionNotPresent(package, version, self)
306
307
308def get_upstream_sources(tree, branch, larstiq=False, upstream_branch=None,
309 upstream_revision=None, allow_split=False):
310 """Get the list of upstream sources to retrieve upstream versions from.
311
312 :param tree: The tree that is being built from.
313 :param branch: The branch that is being built from.
314 :param larstiq: Whether the tree versions the root of ./debian.
315 :param upstream_branch: An upstream branch that can be exported
316 if needed.
317 :param upstream_revision: The revision to use of the upstream branch
318 if it is used.
319 :param allow_split: Whether the provider can provide the tarball
320 by exporting the branch and removing the "debian" dir.
321
322 """
323 sources = [
324 PristineTarSource(tree, branch),
325 AptSource(),
326 ]
327 if upstream_branch is not None:
328 sources.append(
329 UpstreamBranchSource(upstream_branch, upstream_revision))
330 sources.extend([
331 GetOrigSourceSource(tree, larstiq),
332 UScanSource(tree, larstiq),
333 ])
334 if allow_split:
335 sources.append(SelfSplitSource(tree))
336 return sources
142337
143338
144class UpstreamProvider(object):339class UpstreamProvider(object):
@@ -148,40 +343,17 @@
148 instance using pristine-tar, or using apt.343 instance using pristine-tar, or using apt.
149 """344 """
150345
151 def __init__(self, tree, branch, package, version, store_dir,346 def __init__(self, package, version, store_dir, sources):
152 larstiq=False, upstream_branch=None, upstream_revision=None,
153 allow_split=False):
154 """Create an UpstreamProvider.347 """Create an UpstreamProvider.
155348
156 :param tree: The tree that is being built from.
157 :param branch: The branch that is being built from.
158 :param package: the name of the source package that is being built.349 :param package: the name of the source package that is being built.
159 :param version: the Version of the package that is being built.350 :param version: the Version of the package that is being built.
160 :param store_dir: A directory to cache the tarballs.351 :param store_dir: A directory to cache the tarballs.
161 :param larstiq: Whether the tree versions the root of ./debian.
162 :param upstream_branch: An upstream branch that can be exported
163 if needed.
164 :param upstream_revision: The revision to use of the upstream branch
165 if it is used.
166 :param allow_split: Whether the provider can provide the tarball
167 by exporting the branch and removing the "debian" dir.
168 """352 """
169 self.tree = tree
170 self.branch = branch
171 self.package = package353 self.package = package
172 self.version = Version(version)354 self.version = Version(version)
173 self.store_dir = store_dir355 self.store_dir = store_dir
174 self.larstiq = larstiq356 self.source = StackedUpstreamSource(sources)
175 self.upstream_branch = upstream_branch
176 self.upstream_revision = upstream_revision
177 self.allow_split = allow_split
178 # for testing
179 self._apt_provider = provide_with_apt
180 self._uscan_provider = provide_with_uscan
181 self._pristine_provider = provide_with_pristine_tar
182 self._orig_source_provider = provide_with_get_orig_source
183 self._upstream_branch_provider = provide_from_other_branch
184 self._split_provider = provide_by_split
185357
186 def provide(self, target_dir):358 def provide(self, target_dir):
187 """Provide the upstream tarball any way possible.359 """Provide the upstream tarball any way possible.
@@ -214,24 +386,16 @@
214 if not self.already_exists_in_store():386 if not self.already_exists_in_store():
215 if not os.path.exists(self.store_dir):387 if not os.path.exists(self.store_dir):
216 os.makedirs(self.store_dir)388 os.makedirs(self.store_dir)
217 if self.provide_with_pristine_tar(self.store_dir):389 try:
218 pass390 self.source.get_specific_version(self.package,
219 elif self.provide_with_apt(self.store_dir):391 self.version.upstream_version, target_dir)
220 pass392 except PackageVersionNotPresent:
221 elif self.provide_from_upstream_branch(self.store_dir):393 raise MissingUpstreamTarball(self._tarball_name())
222 pass
223 elif self.provide_with_get_orig_source(self.store_dir):
224 pass
225 elif self.provide_with_uscan(self.store_dir):
226 pass
227 elif self.provide_from_self_by_split(self.store_dir):
228 pass
229 else:394 else:
230 info("Using the upstream tarball that is present in "395 info("Using the upstream tarball that is present in "
231 "%s" % self.store_dir)396 "%s" % self.store_dir)
232 if self.provide_from_store_dir(target_dir):397 assert self.provide_from_store_dir(target_dir)
233 return os.path.join(target_dir, self._tarball_name())398 return os.path.join(target_dir, self._tarball_name())
234 raise MissingUpstreamTarball(self._tarball_name())
235399
236 def already_exists_in_target(self, target_dir):400 def already_exists_in_target(self, target_dir):
237 return os.path.exists(os.path.join(target_dir, self._tarball_name()))401 return os.path.exists(os.path.join(target_dir, self._tarball_name()))
@@ -247,83 +411,8 @@
247 return True411 return True
248 return False412 return False
249413
250 def provide_with_apt(self, target_dir):
251 return self._apt_provider(self.package, self.version.upstream_version,
252 target_dir)
253
254 def provide_with_uscan(self, target_dir):
255 if self.larstiq:
256 watchfile = 'watch'
257 else:
258 watchfile = 'debian/watch'
259 watch_id = self.tree.path2id(watchfile)
260 if watch_id is None:
261 info("No watch file to use to retrieve upstream tarball.")
262 return False
263 (tmp, tempfilename) = tempfile.mkstemp()
264 try:
265 tmp = os.fdopen(tmp, 'wb')
266 watch = self.tree.get_file_text(watch_id)
267 tmp.write(watch)
268 finally:
269 tmp.close()
270 try:
271 return self._uscan_provider(self.package,
272 self.version.upstream_version, tempfilename, target_dir)
273 finally:
274 os.unlink(tempfilename)
275
276 def provide_with_pristine_tar(self, target_dir):
277 target_filename = os.path.join(target_dir, self._tarball_name())
278 return self._pristine_provider(self.tree, self.branch, self.package,
279 self.version, target_filename)
280
281 def provide_with_get_orig_source(self, target_dir):
282 if self.larstiq:
283 rules_name = 'rules'
284 else:
285 rules_name = 'debian/rules'
286 rules_id = self.tree.path2id(rules_name)
287 if rules_id is not None:
288 desired_tarball_name = self._tarball_name()
289 tmpdir = tempfile.mkdtemp(prefix="builddeb-get-orig-source-")
290 try:
291 base_export_dir = os.path.join(tmpdir, "export")
292 export_dir = base_export_dir
293 if self.larstiq:
294 os.mkdir(export_dir)
295 export_dir = os.path.join(export_dir, "debian")
296 export(self.tree, export_dir, format="dir")
297 return self._orig_source_provider(base_export_dir, tmpdir,
298 desired_tarball_name, target_dir)
299 finally:
300 shutil.rmtree(tmpdir)
301 info("No debian/rules file to try and use for a get-orig-source "
302 "rule")
303 return False
304
305 def _tarball_name(self):414 def _tarball_name(self):
306 return "%s_%s.orig.tar.gz" % (self.package,415 return tarball_name(self.package, self.version.upstream_version)
307 self.version.upstream_version)
308
309 def provide_from_upstream_branch(self, target_dir):
310 if self.upstream_branch is None:
311 return False
312 assert self.upstream_revision is not None
313 info("Exporting the upstream branch to create the tarball")
314 target_filename = os.path.join(target_dir, self._tarball_name())
315 tarball_base = "%s-%s" % (self.package, self.version.upstream_version)
316 return self._upstream_branch_provider(self.upstream_branch,
317 self.upstream_revision, target_filename, tarball_base)
318
319 def provide_from_self_by_split(self, target_dir):
320 if not self.allow_split:
321 return False
322 info("Using the current branch without the 'debian' directory "
323 "to create the tarball")
324 target_filename = os.path.join(target_dir, self._tarball_name())
325 return self._split_provider(self.tree, self.package,
326 self.version.upstream_version, target_filename)
327416
328417
329class _MissingUpstreamProvider(UpstreamProvider):418class _MissingUpstreamProvider(UpstreamProvider):
@@ -347,6 +436,7 @@
347 f.write("I am a tarball, honest\n")436 f.write("I am a tarball, honest\n")
348 f.close()437 f.close()
349438
439
350class _SimpleUpstreamProvider(UpstreamProvider):440class _SimpleUpstreamProvider(UpstreamProvider):
351 """For tests"""441 """For tests"""
352442

Subscribers

People subscribed via source and target branches