Merge lp:~jelmer/bzr-builddeb/version-as-revisions into lp:bzr-builddeb
- version-as-revisions
- Merge into trunk
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 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
James Westby | Approve | ||
Review via email: mp+77058@code.launchpad.net |
Commit message
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) |