Merge lp:~jelmer/bzr-builddeb/version-as-revisions into lp:bzr-builddeb

Proposed by Jelmer Vernooij
Status: Merged
Approved by: James Westby
Approved revision: 620
Merged at revision: 626
Proposed branch: lp:~jelmer/bzr-builddeb/version-as-revisions
Merge into: lp:bzr-builddeb
Diff against target: 863 lines (+240/-119)
8 files modified
cmds.py (+15/-15)
import_dsc.py (+60/-34)
merge_package.py (+9/-4)
tests/test_import_dsc.py (+41/-32)
tests/test_upstream.py (+38/-7)
upstream/__init__.py (+5/-4)
upstream/branch.py (+12/-2)
upstream/pristinetar.py (+60/-21)
To merge this branch: bzr merge lp:~jelmer/bzr-builddeb/version-as-revisions
Reviewer Review Type Date Requested Status
James Westby Approve
Review via email: mp+77058@code.launchpad.net

Description of the change

Change the UpstreamSource API to support providing multiple upstream revisions - in case there are multiple components.

To post a comment you must log in.
Revision history for this message
James Westby (james-w) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'cmds.py'
2--- cmds.py 2011-09-09 13:20:42 +0000
3+++ cmds.py 2011-09-26 22:30:28 +0000
4@@ -556,7 +556,7 @@
5 'entry yourself, review the merge, and then commit.')
6
7 def _do_merge(self, tree, tarball_filenames, package, version,
8- current_version, upstream_branch, upstream_revision, merge_type,
9+ current_version, upstream_branch, upstream_revisions, merge_type,
10 force):
11 db = DistributionBranch(tree.branch, tree.branch, tree=tree)
12 dbs = DistributionBranchSet()
13@@ -565,7 +565,7 @@
14 in tarball_filenames]
15 conflicts = db.merge_upstream(tarballs, package, version,
16 current_version, upstream_branch=upstream_branch,
17- upstream_revision=upstream_revision,
18+ upstream_revisions=upstream_revisions,
19 merge_type=merge_type, force=force)
20 return conflicts
21
22@@ -712,15 +712,15 @@
23 raise BzrCommandError("merge-upstream takes only a "
24 "single --revision")
25 upstream_revspec = revision[0]
26- upstream_revision = upstream_revspec.as_revision_id(
27- upstream_branch)
28+ upstream_revisions = { None: upstream_revspec.as_revision_id(
29+ upstream_branch) }
30 else:
31- upstream_revision = None
32+ upstream_revisions = None
33
34- if version is None and upstream_revision is not None:
35+ if version is None and upstream_revisions is not None:
36 # Look up the version from the upstream revision
37 version = upstream_branch_source.get_version(package,
38- current_version, upstream_revision)
39+ current_version, upstream_revisions)
40 elif version is None and primary_upstream_source is not None:
41 version = primary_upstream_source.get_latest_version(
42 package, current_version)
43@@ -735,9 +735,9 @@
44 assert isinstance(version, str)
45 note("Using version string %s." % (version))
46 # Look up the revision id from the version string
47- if upstream_revision is None and upstream_branch_source is not None:
48+ if upstream_revisions is None and upstream_branch_source is not None:
49 try:
50- upstream_revision = upstream_branch_source.version_as_revision(
51+ upstream_revisions = upstream_branch_source.version_as_revisions(
52 package, version)
53 except PackageVersionNotPresent:
54 raise BzrCommandError(
55@@ -753,10 +753,10 @@
56 v3 = (source_format in [
57 FORMAT_3_0_QUILT, FORMAT_3_0_NATIVE])
58 tarball_filenames = self._get_tarballs(config, tree, package,
59- version, upstream_branch, upstream_revision, v3,
60+ version, upstream_branch, upstream_revisions, v3,
61 locations)
62 conflicts = self._do_merge(tree, tarball_filenames, package,
63- version, current_version, upstream_branch, upstream_revision,
64+ version, current_version, upstream_branch, upstream_revisions,
65 merge_type, force)
66 if (current_version is not None and
67 Version(current_version) >= Version(version)):
68@@ -886,9 +886,9 @@
69 "sure it is tagged as %r." % (last_version,
70 db.pristine_upstream_source.tag_name(
71 last_version.upstream_version)))
72- upstream_tip = db.pristine_upstream_source.version_as_revision(
73+ upstream_tips = db.pristine_upstream_source.version_as_revisions(
74 changelog.package, last_version.upstream_version)
75- db.extract_upstream_tree(upstream_tip, tempdir)
76+ db.extract_upstream_tree(upstream_tips, tempdir)
77 else:
78 db._create_empty_upstream_tree(tempdir)
79 self.import_many(db, files_list, orig_target)
80@@ -966,7 +966,7 @@
81 if upstream is not None:
82 # See bug lp:309682
83 upstream.repository.fetch(branch.repository, parents[0])
84- db.extract_upstream_tree(parents[0], tempdir)
85+ db.extract_upstream_tree({ None: parents[0] }, tempdir)
86 else:
87 db._create_empty_upstream_tree(tempdir)
88 tree = db.branch.basis_tree()
89@@ -983,7 +983,7 @@
90 tarballs = [(location, None, md5sum_filename(location))]
91 for (component, tag_name, revid) in db.import_upstream_tarballs(
92 tarballs, None, version, parents, upstream_branch=upstream,
93- upstream_revision=upstream_revid):
94+ upstream_revisions={ None: upstream_revid }):
95 if component is None:
96 self.outf.write('Imported %s as tag:%s.\n' % (
97 location, tag_name))
98
99=== modified file 'import_dsc.py'
100--- import_dsc.py 2011-09-09 13:20:42 +0000
101+++ import_dsc.py 2011-09-26 22:30:28 +0000
102@@ -60,6 +60,7 @@
103
104 from bzrlib.plugins.builddeb.bzrtools_import import import_dir
105 from bzrlib.plugins.builddeb.errors import (
106+ MultipleUpstreamTarballsNotSupported,
107 PackageVersionNotPresent,
108 UpstreamAlreadyImported,
109 UpstreamBranchAlreadyMerged,
110@@ -556,6 +557,7 @@
111 tarballs=upstream_tarballs):
112 return False
113
114+
115 up_branch = self.pristine_upstream_branch
116 up_branch.lock_read()
117 try:
118@@ -563,10 +565,14 @@
119 other_up_branch = branch.pristine_upstream_branch
120 other_up_branch.lock_read()
121 try:
122+ pristine_upstream_revids = branch.pristine_upstream_source.version_as_revisions(package, version)
123+ if pristine_upstream_revids.keys() != [None]:
124+ raise MultipleUpstreamTarballsNotSupported()
125+ pristine_upstream_revid = pristine_upstream_revids[None]
126 graph = other_up_branch.repository.get_graph(
127 up_branch.repository)
128 return graph.is_ancestor(up_branch.last_revision(),
129- branch.pristine_upstream_source.version_as_revision(package, version))
130+ pristine_upstream_revid)
131 finally:
132 other_up_branch.unlock()
133 finally:
134@@ -680,7 +686,11 @@
135 :param version: the upstream version string
136 """
137 assert isinstance(version, str)
138- pull_revision = pull_branch.pristine_upstream_source.version_as_revision(package, version)
139+ pull_revisions = pull_branch.pristine_upstream_source.version_as_revisions(
140+ package, version)
141+ if pull_revisions.keys() != [None]:
142+ raise MultipleUpstreamTarballsNotSupported()
143+ pull_revision = pull_revisions[None]
144 mutter("Pulling upstream part of %s from revision %s" % \
145 (version, pull_revision))
146 assert self.pristine_upstream_tree is not None, \
147@@ -774,12 +784,17 @@
148 break
149 real_parents = [p[2] for p in parents]
150 if need_upstream_parent:
151- parent_revid = self.pristine_upstream_source.version_as_revision(package,
152+ upstream_revids = self.pristine_upstream_source.version_as_revisions(package,
153 version.upstream_version, tarballs)
154- if len(parents) > 0:
155- real_parents.insert(1, parent_revid)
156- else:
157- real_parents = [parent_revid]
158+ def key(a):
159+ if a is None:
160+ return None
161+ return a
162+ for component in sorted(upstream_revids.keys(), key=key):
163+ if len(real_parents) > 0:
164+ real_parents.insert(1, upstream_revids[component])
165+ else:
166+ real_parents = [upstream_revids[component]]
167 return real_parents
168
169 def _fetch_upstream_to_branch(self, revid):
170@@ -793,7 +808,7 @@
171
172 def import_upstream(self, upstream_part, package, version, upstream_parents,
173 upstream_tarballs, upstream_branch=None,
174- upstream_revision=None, timestamp=None, author=None,
175+ upstream_revisions=None, timestamp=None, author=None,
176 file_ids_from=None):
177 """Import an upstream part on to the upstream branch.
178
179@@ -821,18 +836,23 @@
180 other_branches = self.get_other_branches()
181 ret = []
182 for (tarball, component, md5) in upstream_tarballs:
183+ if upstream_revisions is not None:
184+ revid = upstream_revisions[component]
185+ else:
186+ revid = None
187 upstream_trees = [o.pristine_upstream_branch.basis_tree()
188 for o in other_branches]
189 target_tree = None
190 if upstream_branch is not None:
191- if upstream_revision is None:
192- upstream_revision = upstream_branch.last_revision()
193+ if revid is None:
194+ # FIXME: This is wrong for component tarballs
195+ revid = upstream_branch.last_revision()
196 self.pristine_upstream_branch.fetch(upstream_branch,
197- last_revision=upstream_revision)
198+ last_revision=revid)
199 upstream_branch.tags.merge_to(self.pristine_upstream_branch.tags)
200- upstream_parents.append(upstream_revision)
201+ upstream_parents.append(revid)
202 target_tree = self.pristine_upstream_branch.repository.revision_tree(
203- upstream_revision)
204+ revid)
205 if file_ids_from is not None:
206 upstream_trees = file_ids_from + upstream_trees
207 if self.tree:
208@@ -858,15 +878,16 @@
209 finally:
210 self_tree.unlock()
211 (tag, revid) = self.pristine_upstream_source.import_component_tarball(
212- package, version, self.pristine_upstream_tree, upstream_parents, component,
213- md5, tarball, author=author, timestamp=timestamp)
214+ package, version, self.pristine_upstream_tree, upstream_parents,
215+ component, md5, tarball, author=author, timestamp=timestamp)
216+ self.pristine_upstream_branch.generate_revision_history(revid)
217 ret.append((component, tag, revid))
218 self.branch.fetch(self.pristine_upstream_branch)
219 self.branch.tags.set_tag(tag, revid)
220 return ret
221
222 def import_upstream_tarballs(self, tarballs, package, version, parents,
223- upstream_branch=None, upstream_revision=None):
224+ upstream_branch=None, upstream_revisions=None):
225 """Import an upstream part to the upstream branch.
226
227 :param tarballs: List of tarballs / components to extract
228@@ -876,7 +897,7 @@
229 parents.
230 :param upstream_branch: An upstream branch to associate with the
231 tarball.
232- :param upstream_revision: Upstream revision id
233+ :param upstream_revisions: Upstream revision ids dictionary
234 :param md5sum: hex digest of the md5sum of the tarball, if known.
235 :return: list with (component, tag, revid) tuples
236 """
237@@ -885,7 +906,7 @@
238 return self.import_upstream(tarball_dir, package, version, parents,
239 tarballs,
240 upstream_branch=upstream_branch,
241- upstream_revision=upstream_revision)
242+ upstream_revisions=upstream_revisions)
243 finally:
244 shutil.rmtree(tarball_dir)
245
246@@ -1052,8 +1073,11 @@
247 pull_branch = pull_parents[1][0]
248 pull_version = pull_parents[1][1]
249 if not pull_branch.is_version_native(pull_version):
250- pull_revid = pull_branch.pristine_upstream_source.version_as_revision(
251+ pull_revids = pull_branch.pristine_upstream_source.version_as_revisions(
252 package, pull_version.upstream_version)
253+ if pull_revids.keys() != [None]:
254+ raise MultipleUpstreamTarballsNotSupported()
255+ pull_revid = pull_revids[None]
256 mutter("Initialising upstream from %s, version %s",
257 str(pull_branch), str(pull_version))
258 parents.append(pull_revid)
259@@ -1245,16 +1269,16 @@
260 finally:
261 extractor.cleanup()
262
263- def extract_upstream_tree(self, upstream_tip, basedir):
264+ def extract_upstream_tree(self, upstream_tips, basedir):
265 """Extract upstream_tip to a tempdir as a working tree."""
266 # TODO: should stack rather than trying to use the repository,
267 # as that will be more efficient.
268- # TODO: remove the _extract_upstream_tree alias below.
269 to_location = os.path.join(basedir, "upstream")
270 # Use upstream_branch if it has been set, otherwise self.branch.
271 source_branch = self.pristine_upstream_branch or self.branch
272+ assert upstream_tips.keys() == [None]
273 dir_to = source_branch.bzrdir.sprout(to_location,
274- revision_id=upstream_tip,
275+ revision_id=upstream_tips[None],
276 accelerator_tree=self.tree)
277 try:
278 self.pristine_upstream_tree = dir_to.open_workingtree()
279@@ -1263,8 +1287,6 @@
280 self.pristine_upstream_tree = dir_to.create_workingtree()
281 self.pristine_upstream_branch = self.pristine_upstream_tree.branch
282
283- _extract_upstream_tree = extract_upstream_tree
284-
285 def _create_empty_upstream_tree(self, basedir):
286 to_location = os.path.join(basedir, "upstream")
287 to_transport = get_transport(to_location)
288@@ -1314,7 +1336,7 @@
289 assert isinstance(previous_version, str), \
290 "Should pass upstream version as str, not Version."
291 try:
292- upstream_tip = self.pristine_upstream_source.version_as_revision(
293+ upstream_tips = self.pristine_upstream_source.version_as_revisions(
294 package, previous_version)
295 except PackageVersionNotPresent:
296 raise BzrCommandError("Unable to find the tag for the "
297@@ -1322,10 +1344,16 @@
298 "%s" % (
299 previous_version,
300 self.pristine_upstream_source.tag_name(previous_version)))
301- self.extract_upstream_tree(upstream_tip, tempdir)
302+ self.extract_upstream_tree(upstream_tips, tempdir)
303+
304+ def has_merged_upstream_revisions(self, this_revision, upstream_repository, upstream_revisions):
305+ graph = self.branch.repository.get_graph(
306+ other_repository=upstream_repository)
307+ return all(graph.is_ancestor(upstream_revision, this_revision)
308+ for upstream_revision in upstream_revisions.values())
309
310 def merge_upstream(self, tarball_filenames, package, version, previous_version,
311- upstream_branch=None, upstream_revision=None, merge_type=None,
312+ upstream_branch=None, upstream_revisions=None, merge_type=None,
313 force=False):
314 assert isinstance(version, str), \
315 "Should pass version as str not %s" % str(type(version))
316@@ -1344,12 +1372,10 @@
317 upstream_branch.lock_read()
318 try:
319 if upstream_branch is not None:
320- if upstream_revision is None:
321- upstream_revision = upstream_branch.last_revision()
322- graph = self.branch.repository.get_graph(
323- other_repository=upstream_branch.repository)
324- if not force and graph.is_ancestor(upstream_revision,
325- self.branch.last_revision()):
326+ if upstream_revisions is None:
327+ upstream_revisions = { None: upstream_branch.last_revision() }
328+ if (not force and
329+ self.has_merged_upstream_revisions(self.branch.last_revision(), upstream_branch.repository, upstream_revisions)):
330 raise UpstreamBranchAlreadyMerged
331 upstream_tarballs = [
332 (os.path.abspath(fn), component, md5sum_filename(fn)) for
333@@ -1364,7 +1390,7 @@
334 for (component, tag, revid) in self.import_upstream(tarball_dir,
335 package, version, parents, upstream_tarballs=upstream_tarballs,
336 upstream_branch=upstream_branch,
337- upstream_revision=upstream_revision):
338+ upstream_revisions=upstream_revisions):
339 self._fetch_upstream_to_branch(revid)
340 finally:
341 shutil.rmtree(tarball_dir)
342
343=== modified file 'merge_package.py'
344--- merge_package.py 2011-06-15 13:21:22 +0000
345+++ merge_package.py 2011-09-26 22:30:28 +0000
346@@ -31,7 +31,9 @@
347 from debian_bundle.changelog import Version
348
349 from bzrlib.plugins.builddeb.errors import (
350- SharedUpstreamConflictsWithTargetPackaging)
351+ MultipleUpstreamTarballsNotSupported,
352+ SharedUpstreamConflictsWithTargetPackaging,
353+ )
354 from bzrlib.plugins.builddeb.import_dsc import DistributionBranch
355 from bzrlib.plugins.builddeb.util import find_changelog
356
357@@ -59,8 +61,11 @@
358 for branch in (source, target):
359 db = DistributionBranch(branch, branch)
360 uver = _latest_version(branch).upstream_version
361- results.append((Version(uver),
362- db.pristine_upstream_source.version_as_revision(None, uver)))
363+ upstream_revids = db.pristine_upstream_source.version_as_revisions(None, uver)
364+ if upstream_revids.keys() != [None]:
365+ raise MultipleUpstreamTarballsNotSupported()
366+ upstream_revid = upstream_revids[None]
367+ results.append((Version(uver), upstream_revid))
368
369 return results
370
371@@ -136,7 +141,7 @@
372 try:
373 # Extract the merge target's upstream tree into a temporary
374 # directory.
375- db.extract_upstream_tree(ut_revid, tempdir)
376+ db.extract_upstream_tree({None: ut_revid}, tempdir)
377 tmp_target_utree = db.pristine_upstream_tree
378
379 # Merge upstream branch tips to obtain a shared upstream parent.
380
381=== modified file 'tests/test_import_dsc.py'
382--- tests/test_import_dsc.py 2011-09-09 13:20:42 +0000
383+++ tests/test_import_dsc.py 2011-09-26 22:30:28 +0000
384@@ -213,14 +213,15 @@
385 db.tag_version(version)
386 self.assertEqual(db.revid_of_version(version), revid)
387
388- def test_upstream_version_as_revid(self):
389+ def test_upstream_versions_as_revid(self):
390 db = self.db1
391 tree = self.up_tree1
392 version = "0.1"
393 revid = tree.commit("one")
394 db.tag_upstream_version(version)
395 self.assertEqual(
396- db.pristine_upstream_source.version_as_revision("package", version), revid)
397+ db.pristine_upstream_source.version_as_revisions("package", version),
398+ { None: revid })
399
400 def test_contained_versions(self):
401 db = self.db1
402@@ -710,8 +711,8 @@
403 self.assertEqual(self.tree2.branch.last_revision(), revid)
404 self.assertEqual(self.up_tree2.branch.last_revision(), up_revid)
405 self.assertEqual(self.db2.revid_of_version(version), revid)
406- self.assertEqual(self.db2.pristine_upstream_source.version_as_revision(
407- "package", version.upstream_version), up_revid)
408+ self.assertEqual(self.db2.pristine_upstream_source.version_as_revisions(
409+ "package", version.upstream_version), {None: up_revid})
410
411 def test_pull_from_lesser_branch_with_upstream(self):
412 version = Version("0.1-1")
413@@ -726,8 +727,8 @@
414 self.assertEqual(self.tree2.branch.last_revision(), revid)
415 self.assertEqual(self.up_tree2.branch.last_revision(), up_revid)
416 self.assertEqual(self.db2.revid_of_version(version), revid)
417- self.assertEqual(self.db2.pristine_upstream_source.version_as_revision(
418- "package", version.upstream_version), up_revid)
419+ self.assertEqual(self.db2.pristine_upstream_source.version_as_revisions(
420+ "package", version.upstream_version), {None: up_revid})
421
422 def test_pull_upstream_from_branch(self):
423 version = "0.1"
424@@ -737,8 +738,9 @@
425 self.assertNotEqual(self.up_tree2.branch.last_revision(), up_revid)
426 self.db2.pull_upstream_from_branch(self.db1, "package", version)
427 self.assertEqual(self.up_tree2.branch.last_revision(), up_revid)
428- self.assertEqual(self.db2.pristine_upstream_source.version_as_revision("package", version),
429- up_revid)
430+ self.assertEqual(
431+ self.db2.pristine_upstream_source.version_as_revisions("package", version),
432+ {None: up_revid})
433
434 def check_changes(self, changes, added=[], removed=[], modified=[],
435 renamed=[]):
436@@ -794,8 +796,8 @@
437 branch = tree.branch
438 rh = branch.revision_history()
439 self.assertEqual(len(rh), 1)
440- self.assertEqual(self.db1.pristine_upstream_source.version_as_revision(
441- "package", version.upstream_version), rh[0])
442+ self.assertEqual(self.db1.pristine_upstream_source.version_as_revisions(
443+ "package", version.upstream_version), {None: rh[0]})
444 rev = branch.repository.get_revision(rh[0])
445 self.assertEqual(rev.message,
446 "Import upstream version %s" % str(version.upstream_version))
447@@ -833,7 +835,9 @@
448 rh = branch.revision_history()
449 self.assertEqual(len(rh), 2)
450 self.assertEqual(
451- self.db1.pristine_upstream_source.version_as_revision("package", version2.upstream_version), rh[1])
452+ self.db1.pristine_upstream_source.version_as_revisions(
453+ "package", version2.upstream_version),
454+ {None: rh[1]})
455 rev = branch.repository.get_revision(rh[1])
456 self.assertEqual(rev.message,
457 "Import upstream version %s" % str(version2.upstream_version))
458@@ -864,8 +868,8 @@
459 branch = tree.branch
460 rh = branch.revision_history()
461 self.assertEqual(len(rh), 1)
462- self.assertEqual(self.db1.pristine_upstream_source.version_as_revision(
463- "package", version.upstream_version), rh[0])
464+ self.assertEqual(self.db1.pristine_upstream_source.version_as_revisions(
465+ "package", version.upstream_version), {None: rh[0]})
466 rev = branch.repository.get_revision(rh[0])
467 self.assertEqual(rev.message,
468 "Import upstream version %s" % str(version.upstream_version))
469@@ -892,8 +896,8 @@
470 branch = tree.branch
471 rh = branch.revision_history()
472 self.assertEqual(len(rh), 1)
473- self.assertEqual(self.db1.pristine_upstream_source.version_as_revision(
474- "package", version.upstream_version), rh[0])
475+ self.assertEqual(self.db1.pristine_upstream_source.version_as_revisions(
476+ "package", version.upstream_version), {None: rh[0]})
477 rev = branch.repository.get_revision(rh[0])
478 self.assertEqual(rev.message,
479 "Import upstream version %s" % str(version.upstream_version))
480@@ -941,8 +945,8 @@
481 branch = tree.branch
482 rh = branch.revision_history()
483 self.assertEqual(len(rh), 1)
484- self.assertEqual(self.db1.pristine_upstream_source.version_as_revision(
485- "package", version.upstream_version), rh[0])
486+ self.assertEqual(self.db1.pristine_upstream_source.version_as_revisions(
487+ "package", version.upstream_version), {None: rh[0]})
488 rev = branch.repository.get_revision(rh[0])
489 self.assertEqual(rev.message,
490 "Import upstream version %s" % str(version.upstream_version))
491@@ -1381,8 +1385,9 @@
492 self.assertEqual(self.db1.revid_of_version(version2), rh1[2])
493 self.assertEqual(self.db1.revid_of_version(version3), rh1[3])
494 self.assertEqual(
495- self.db1.pristine_upstream_source.version_as_revision("package", version1.upstream_version),
496- up_rh1[0])
497+ self.db1.pristine_upstream_source.version_as_revisions(
498+ "package", version1.upstream_version),
499+ {None: up_rh1[0]})
500 self.tree1.lock_read()
501 self.addCleanup(self.tree1.unlock)
502 self.assertFalse(self.db1.is_version_native(version1))
503@@ -1434,11 +1439,13 @@
504 self.assertEqual(self.db1.revid_of_version(version2), rh1[2])
505 self.assertEqual(self.db1.revid_of_version(version3), rh1[3])
506 self.assertEqual(
507- self.db1.pristine_upstream_source.version_as_revision("package", version1.upstream_version),
508- up_rh1[0])
509+ self.db1.pristine_upstream_source.version_as_revisions("package",
510+ version1.upstream_version),
511+ {None: up_rh1[0]})
512 self.assertEqual(
513- self.db1.pristine_upstream_source.version_as_revision("package", version3.upstream_version),
514- up_rh1[1])
515+ self.db1.pristine_upstream_source.version_as_revisions("package",
516+ version3.upstream_version),
517+ {None: up_rh1[1]})
518 self.tree1.lock_read()
519 self.addCleanup(self.tree1.unlock)
520 self.assertFalse(self.db1.is_version_native(version1))
521@@ -1489,11 +1496,13 @@
522 self.assertEqual(self.db1.revid_of_version(version2), rh1[2])
523 self.assertEqual(self.db1.revid_of_version(version3), rh1[3])
524 self.assertEqual(
525- self.db1.pristine_upstream_source.version_as_revision("package", version1.upstream_version),
526- up_rh1[0])
527+ self.db1.pristine_upstream_source.version_as_revisions("package",
528+ version1.upstream_version),
529+ { None: up_rh1[0] })
530 self.assertEqual(
531- self.db1.pristine_upstream_source.version_as_revision("package", version3.upstream_version),
532- up_rh1[1])
533+ self.db1.pristine_upstream_source.version_as_revisions("package",
534+ version3.upstream_version),
535+ { None: up_rh1[1] })
536 self.tree1.lock_read()
537 self.addCleanup(self.tree1.unlock)
538 self.assertFalse(self.db1.is_version_native(version1))
539@@ -1604,7 +1613,7 @@
540 tf.close()
541 conflicts = db.merge_upstream([(tarball_filename, None)], "foo", "0.2", "0.1",
542 upstream_branch=upstream_tree.branch,
543- upstream_revision=upstream_rev)
544+ upstream_revisions={None: upstream_rev})
545 self.assertEqual(0, conflicts)
546
547 def test_merge_upstream_initial_with_removed_debian(self):
548@@ -1644,7 +1653,7 @@
549 tf.close()
550 conflicts = db.merge_upstream([(tarball_filename, None)], "foo", "0.2", "0.1",
551 upstream_branch=upstream_tree.branch,
552- upstream_revision=upstream_rev)
553+ upstream_revisions={None: upstream_rev})
554 # ./debian conflicts.
555 self.assertEqual(3, conflicts)
556
557@@ -1686,7 +1695,7 @@
558 db.merge_upstream([(builder.tar_name(), None)], "package", str(version2),
559 version1.upstream_version,
560 upstream_branch=upstream_tree.branch,
561- upstream_revision=upstream_rev)
562+ upstream_revisions={None: upstream_rev})
563 rh1 = tree.branch.revision_history()
564 self.assertEqual(2, len(rh1))
565 packaging_upstream_tip = tree.get_parent_ids()[1]
566@@ -1765,7 +1774,7 @@
567 version2.upstream_version,
568 version1.upstream_version,
569 upstream_branch=upstream_tree.branch,
570- upstream_revision=upstream_rev2)
571+ upstream_revisions={None: upstream_rev2})
572 self.assertEqual("a-id", tree.path2id("b"))
573
574 def test_merge_upstream_rename_on_top(self):
575@@ -1802,7 +1811,7 @@
576 version2.upstream_version,
577 version1.upstream_version,
578 upstream_branch=upstream_tree.branch,
579- upstream_revision=upstream_rev2)
580+ upstream_revisions={None:upstream_rev2})
581 self.assertEqual("a-id", tree.path2id("b"))
582
583 def test_merge_upstream_rename_in_packaging_branch(self):
584
585=== modified file 'tests/test_upstream.py'
586--- tests/test_upstream.py 2011-09-09 13:20:42 +0000
587+++ tests/test_upstream.py 2011-09-26 22:30:28 +0000
588@@ -432,6 +432,20 @@
589 self.tree.commit("msg")
590 self.assertEquals("2.1+bzr2", source.get_latest_version("foo", "1.0"))
591
592+ def test_version_as_revisions(self):
593+ revid1 = self.tree.commit("msg")
594+ self.tree.branch.tags.set_tag("2.1", self.tree.branch.last_revision())
595+ config = DebBuildConfig(
596+ [('user.conf', True), ('default.conf', False)],
597+ branch=self.tree.branch)
598+ source = UpstreamBranchSource(self.tree.branch,
599+ {"2.1": self.tree.branch.last_revision()},
600+ config=config)
601+ revid2 = self.tree.commit("msg")
602+ self.assertEquals(revid2,
603+ source.version_as_revision("foo", "2.1+bzr2"))
604+ self.assertEquals({None: revid1}, source.version_as_revisions("foo", "2.1"))
605+
606 def test_version_as_revision(self):
607 revid1 = self.tree.commit("msg")
608 self.tree.branch.tags.set_tag("2.1", self.tree.branch.last_revision())
609@@ -766,14 +780,31 @@
610 rev.properties["deb-pristine-delta"] = standard_b64encode("bla")
611 self.assertEquals("bla", self.source.pristine_tar_delta(rev))
612
613- def test_version_as_revision_missing(self):
614+ def test_version_as_revisions_missing(self):
615 self.assertRaises(PackageVersionNotPresent,
616- self.source.version_as_revision, None, "1.2")
617-
618- def test_version_as_revision(self):
619- revid1 = self.tree.commit("msg")
620- self.tree.branch.tags.set_tag("upstream-2.1", revid1)
621- self.assertEquals(revid1, self.source.version_as_revision(None, "2.1"))
622+ self.source.version_as_revisions, None, "1.2")
623+
624+ def test_version_as_revisions_single(self):
625+ revid1 = self.tree.commit("msg")
626+ self.tree.branch.tags.set_tag("upstream-2.1", revid1)
627+ self.assertEquals({None: revid1},
628+ self.source.version_as_revisions(None, "2.1"))
629+
630+ def test_version_component_as_revision(self):
631+ revid1 = self.tree.commit("msg")
632+ self.tree.branch.tags.set_tag("upstream-2.1/lib", revid1)
633+ self.assertEquals(revid1,
634+ self.source.version_component_as_revision(None, "2.1", "lib"))
635+
636+ def test_version_as_revisions(self):
637+ revid1 = self.tree.commit("msg")
638+ revid2 = self.tree.commit("msg")
639+ self.tree.branch.tags.set_tag("upstream-2.1", revid1)
640+ self.tree.branch.tags.set_tag("upstream-2.1/lib", revid2)
641+ self.assertEquals({ None: revid1, "lib": revid2 },
642+ self.source.version_as_revisions(None, "2.1", [
643+ ("upstream_2.1.orig.tar.gz", None, "somemd5sum"),
644+ ("upstream_2.1.orig-lib.tar.gz", "lib", "othermd5sum")]))
645
646
647 class TarfileSourceTests(TestCaseWithTransport):
648
649=== modified file 'upstream/__init__.py'
650--- upstream/__init__.py 2011-09-07 20:11:50 +0000
651+++ upstream/__init__.py 2011-09-26 22:30:28 +0000
652@@ -75,15 +75,16 @@
653 """
654 raise NotImplementedError(self.get_latest_version)
655
656- def version_as_revision(self, package, version):
657- """Lookup the revision id for a particular version.
658+ def version_as_revisions(self, package, version, tarballs=None):
659+ """Lookup the revision ids for a particular version.
660
661 :param package: Package name
662- :package version: Version string
663+ :param version: Version string
664 :raise PackageVersionNotPresent: When the specified version was not
665 found
666+ :return: dictionary mapping component names to revision ids
667 """
668- raise NotImplementedError(self.version_as_revision)
669+ raise NotImplementedError(self.version_as_revisions)
670
671 def has_version(self, package, version, md5=None):
672 """Check whether this upstream source contains a particular package.
673
674=== modified file 'upstream/branch.py'
675--- upstream/branch.py 2011-06-26 21:02:48 +0000
676+++ upstream/branch.py 2011-09-26 22:30:28 +0000
677@@ -28,7 +28,10 @@
678 from bzrlib.revisionspec import RevisionSpec
679 from bzrlib.trace import note
680
681-from bzrlib.plugins.builddeb.errors import PackageVersionNotPresent
682+from bzrlib.plugins.builddeb.errors import (
683+ MultipleUpstreamTarballsNotSupported,
684+ PackageVersionNotPresent,
685+ )
686 from bzrlib.plugins.builddeb.upstream import UpstreamSource
687 from bzrlib.plugins.builddeb.util import (
688 export,
689@@ -228,7 +231,7 @@
690 else:
691 self.upstream_revision_map = upstream_revision_map
692
693- def version_as_revision(self, package, version):
694+ def version_as_revision(self, package, version, tarballs=None):
695 assert isinstance(version, str)
696 if version in self.upstream_revision_map:
697 revspec = self.upstream_revision_map[version]
698@@ -242,6 +245,13 @@
699 raise PackageVersionNotPresent(package, version, self)
700 raise PackageVersionNotPresent(package, version, self)
701
702+ def version_as_revisions(self, package, version, tarballs=None):
703+ # FIXME: Support multiple upstream locations if there are multiple
704+ # components
705+ if tarballs is not None and tarballs.keys() != [None]:
706+ raise MultipleUpstreamTarballsNotSupported()
707+ return { None: self.version_as_revision(package, version, tarballs) }
708+
709 def get_latest_version(self, package, current_version):
710 return self.get_version(package, current_version,
711 self.upstream_branch.last_revision())
712
713=== modified file 'upstream/pristinetar.py'
714--- upstream/pristinetar.py 2011-09-09 13:20:42 +0000
715+++ upstream/pristinetar.py 2011-09-26 22:30:28 +0000
716@@ -39,13 +39,17 @@
717 subprocess_setup,
718 )
719
720-from bzrlib import osutils
721+from bzrlib import (
722+ osutils,
723+ revision as _mod_revision,
724+ )
725 from bzrlib.errors import (
726 BzrError,
727 NoSuchRevision,
728 NoSuchTag,
729 )
730 from bzrlib.trace import (
731+ mutter,
732 note,
733 warning,
734 )
735@@ -166,32 +170,43 @@
736 :param parent_ids: Parent revisions
737 :param tarballs: List of (path, component, md5)
738 :param timestamp: Optional timestamp for new commits
739- :param author: Optional author for new commits
740+ :param author: Optional author for new commitscopmone
741 :return: List of tuples with (component, tag, revid)
742 """
743 ret = []
744+ component_paths = [cp for (_, cp, _) in tarballs if cp is not None]
745 for (tarball, component, md5) in tarballs:
746+ if component is None:
747+ exclude = component_paths
748+ else:
749+ exclude = []
750 (tag, revid) = self.import_component_tarball(
751- package, version, tree, parent_ids, component,
752- md5, tarball, author=author, timestamp=timestamp)
753+ package, version, tree, parent_ids, component,
754+ md5, tarball, author=author, timestamp=timestamp,
755+ exclude=exclude)
756 ret.append((component, tag, revid))
757+ # FIXME: Handle multiple components
758+ tree.branch.generate_revision_history(revid)
759 return ret
760
761 def import_component_tarball(self, package, version, tree, parent_ids,
762- component=None, md5=None, tarball=None, author=None, timestamp=None):
763+ component=None, md5=None, tarball=None, author=None, timestamp=None,
764+ subdir=None, exclude=None):
765 """Import a tarball.
766
767 :param package: Package name
768 :param version: Upstream version
769 :param component: Component name (None for base)
770+ :param exclude: Exclude directories
771 """
772- if component is not None:
773- raise BzrError("Importing non-base tarballs not yet supported")
774- tree.set_parent_ids(parent_ids)
775+ if exclude is not None or subdir is not None:
776+ raise NotImplementedError
777+ if exclude is None:
778+ exclude = []
779 revprops = {}
780 if md5 is not None:
781 revprops["deb-md5"] = md5
782- delta = self.make_pristine_tar_delta(tree, tarball)
783+ delta = self.make_pristine_tar_delta(tree, tarball, subdir=subdir)
784 uuencoded = standard_b64encode(delta)
785 if tarball.endswith(".tar.bz2"):
786 revprops["deb-pristine-delta-bz2"] = uuencoded
787@@ -208,9 +223,31 @@
788 message = "Import upstream version %s" % (version,)
789 if component is not None:
790 message += ", component %s" % component
791- revid = tree.commit(message, revprops=revprops, timestamp=timestamp,
792- timezone=timezone)
793- tag_name, _ = self.tag_version(version, revid=revid)
794+ if len(parent_ids) == 0:
795+ base_revid = _mod_revision.NULL_REVISION
796+ else:
797+ base_revid = parent_ids[0]
798+ basis_tree = tree.branch.repository.revision_tree(base_revid)
799+ tree.lock_write()
800+ try:
801+ builder = tree.branch.get_commit_builder(parents=parent_ids,
802+ revprops=revprops, timestamp=timestamp, timezone=timezone)
803+ builder.will_record_deletes()
804+ try:
805+ list(builder.record_iter_changes(tree, base_revid,
806+ tree.iter_changes(basis_tree)))
807+ builder.finish_inventory()
808+ except:
809+ builder.abort()
810+ raise
811+ revid = builder.commit(message)
812+ tag_name, _ = self.tag_version(version, revid=revid, component=component)
813+ tree.update_basis_by_delta(revid, builder.get_basis_delta())
814+ finally:
815+ tree.unlock()
816+ mutter(
817+ 'imported %s version %s component %r as revid %s, tagged %s',
818+ package, version, component, revid, tag_name)
819 return tag_name, revid
820
821 def fetch_component_tarball(self, package, version, component, target_dir):
822@@ -256,14 +293,16 @@
823 "revision %s", revid)
824 return True
825
826- def version_as_revision(self, package, version, tarballs=None):
827+ def version_as_revisions(self, package, version, tarballs=None):
828 if tarballs is None:
829- return self.version_component_as_revision(package, version, component=None)
830- elif len(tarballs) > 1:
831- raise MultipleUpstreamTarballsNotSupported()
832- else:
833- return self.version_component_as_revision(package, version, tarballs[0][1],
834- tarballs[0][2])
835+ # FIXME: What if there are multiple tarballs?
836+ return {
837+ None: self.version_component_as_revision(package, version, component=None) }
838+ ret = {}
839+ for (tarball, component, md5) in tarballs:
840+ ret[component] = self.version_component_as_revision(
841+ package, version, component, md5)
842+ return ret
843
844 def version_component_as_revision(self, package, version, component, md5=None):
845 assert isinstance(version, str)
846@@ -359,7 +398,7 @@
847 finally:
848 shutil.rmtree(tmpdir)
849
850- def make_pristine_tar_delta(self, tree, tarball_path):
851+ def make_pristine_tar_delta(self, tree, tarball_path, subdir=None):
852 tmpdir = tempfile.mkdtemp(prefix="builddeb-pristine-")
853 try:
854 dest = os.path.join(tmpdir, "orig")
855@@ -367,7 +406,7 @@
856 try:
857 for (dp, ie) in tree.inventory.iter_entries():
858 ie._read_tree_state(dp, tree)
859- export(tree, dest, format='dir')
860+ export(tree, dest, format='dir', subdir=subdir)
861 finally:
862 tree.unlock()
863 return make_pristine_tar_delta(dest, tarball_path)

Subscribers

People subscribed via source and target branches