Merge lp:~jelmer/bzr-builddeb/multiple-upstream-tarballs into lp:bzr-builddeb
- multiple-upstream-tarballs
- Merge into trunk
Proposed by
Jelmer Vernooij
Status: | Superseded |
---|---|
Proposed branch: | lp:~jelmer/bzr-builddeb/multiple-upstream-tarballs |
Merge into: | lp:bzr-builddeb |
Diff against target: |
1272 lines (+339/-191) 11 files modified
cmds.py (+29/-25) debian/changelog (+3/-1) dh_make.py (+2/-2) import_dsc.py (+79/-45) merge_package.py (+9/-4) tests/blackbox/test_merge_upstream.py (+1/-1) tests/test_import_dsc.py (+47/-38) tests/test_upstream.py (+51/-11) upstream/__init__.py (+16/-13) upstream/branch.py (+13/-3) upstream/pristinetar.py (+89/-48) |
To merge this branch: | bzr merge lp:~jelmer/bzr-builddeb/multiple-upstream-tarballs |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Bzr-builddeb-hackers | Pending | ||
Review via email: mp+77075@code.launchpad.net |
This proposal has been superseded by a proposal from 2011-10-03.
Commit message
Description of the change
Importing and building of packages with multiple upstream tarballs now works.
There are still two caveats:
* when exporting the base component before generating a pristine tar delta, we don't exclude non-base components. This probably causes the pristine tar delta to be bigger than it needs to be
* Needs more tests
To post a comment you must log in.
- 625. By Jelmer Vernooij
-
merge lp:bzr-builddeb.
Unmerged revisions
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'cmds.py' | |||
2 | --- cmds.py 2011-09-09 13:20:42 +0000 | |||
3 | +++ cmds.py 2011-09-27 00:50:26 +0000 | |||
4 | @@ -556,7 +556,7 @@ | |||
5 | 556 | 'entry yourself, review the merge, and then commit.') | 556 | 'entry yourself, review the merge, and then commit.') |
6 | 557 | 557 | ||
7 | 558 | def _do_merge(self, tree, tarball_filenames, package, version, | 558 | def _do_merge(self, tree, tarball_filenames, package, version, |
9 | 559 | current_version, upstream_branch, upstream_revision, merge_type, | 559 | current_version, upstream_branch, upstream_revisions, merge_type, |
10 | 560 | force): | 560 | force): |
11 | 561 | db = DistributionBranch(tree.branch, tree.branch, tree=tree) | 561 | db = DistributionBranch(tree.branch, tree.branch, tree=tree) |
12 | 562 | dbs = DistributionBranchSet() | 562 | dbs = DistributionBranchSet() |
13 | @@ -565,7 +565,7 @@ | |||
14 | 565 | in tarball_filenames] | 565 | in tarball_filenames] |
15 | 566 | conflicts = db.merge_upstream(tarballs, package, version, | 566 | conflicts = db.merge_upstream(tarballs, package, version, |
16 | 567 | current_version, upstream_branch=upstream_branch, | 567 | current_version, upstream_branch=upstream_branch, |
18 | 568 | upstream_revision=upstream_revision, | 568 | upstream_revisions=upstream_revisions, |
19 | 569 | merge_type=merge_type, force=force) | 569 | merge_type=merge_type, force=force) |
20 | 570 | return conflicts | 570 | return conflicts |
21 | 571 | 571 | ||
22 | @@ -712,15 +712,15 @@ | |||
23 | 712 | raise BzrCommandError("merge-upstream takes only a " | 712 | raise BzrCommandError("merge-upstream takes only a " |
24 | 713 | "single --revision") | 713 | "single --revision") |
25 | 714 | upstream_revspec = revision[0] | 714 | upstream_revspec = revision[0] |
28 | 715 | upstream_revision = upstream_revspec.as_revision_id( | 715 | upstream_revisions = { None: upstream_revspec.as_revision_id( |
29 | 716 | upstream_branch) | 716 | upstream_branch) } |
30 | 717 | else: | 717 | else: |
32 | 718 | upstream_revision = None | 718 | upstream_revisions = None |
33 | 719 | 719 | ||
35 | 720 | if version is None and upstream_revision is not None: | 720 | if version is None and upstream_revisions is not None: |
36 | 721 | # Look up the version from the upstream revision | 721 | # Look up the version from the upstream revision |
37 | 722 | version = upstream_branch_source.get_version(package, | 722 | version = upstream_branch_source.get_version(package, |
39 | 723 | current_version, upstream_revision) | 723 | current_version, upstream_revisions) |
40 | 724 | elif version is None and primary_upstream_source is not None: | 724 | elif version is None and primary_upstream_source is not None: |
41 | 725 | version = primary_upstream_source.get_latest_version( | 725 | version = primary_upstream_source.get_latest_version( |
42 | 726 | package, current_version) | 726 | package, current_version) |
43 | @@ -735,9 +735,9 @@ | |||
44 | 735 | assert isinstance(version, str) | 735 | assert isinstance(version, str) |
45 | 736 | note("Using version string %s." % (version)) | 736 | note("Using version string %s." % (version)) |
46 | 737 | # Look up the revision id from the version string | 737 | # Look up the revision id from the version string |
48 | 738 | if upstream_revision is None and upstream_branch_source is not None: | 738 | if upstream_revisions is None and upstream_branch_source is not None: |
49 | 739 | try: | 739 | try: |
51 | 740 | upstream_revision = upstream_branch_source.version_as_revision( | 740 | upstream_revisions = upstream_branch_source.version_as_revisions( |
52 | 741 | package, version) | 741 | package, version) |
53 | 742 | except PackageVersionNotPresent: | 742 | except PackageVersionNotPresent: |
54 | 743 | raise BzrCommandError( | 743 | raise BzrCommandError( |
55 | @@ -748,15 +748,15 @@ | |||
56 | 748 | if need_upstream_tarball: | 748 | if need_upstream_tarball: |
57 | 749 | target_dir = tempfile.mkdtemp() # FIXME: Cleanup? | 749 | target_dir = tempfile.mkdtemp() # FIXME: Cleanup? |
58 | 750 | locations = primary_upstream_source.fetch_tarballs( | 750 | locations = primary_upstream_source.fetch_tarballs( |
60 | 751 | package, version, target_dir) | 751 | package, version, target_dir, components=[None]) |
61 | 752 | source_format = get_source_format(tree) | 752 | source_format = get_source_format(tree) |
62 | 753 | v3 = (source_format in [ | 753 | v3 = (source_format in [ |
63 | 754 | FORMAT_3_0_QUILT, FORMAT_3_0_NATIVE]) | 754 | FORMAT_3_0_QUILT, FORMAT_3_0_NATIVE]) |
64 | 755 | tarball_filenames = self._get_tarballs(config, tree, package, | 755 | tarball_filenames = self._get_tarballs(config, tree, package, |
66 | 756 | version, upstream_branch, upstream_revision, v3, | 756 | version, upstream_branch, upstream_revisions, v3, |
67 | 757 | locations) | 757 | locations) |
68 | 758 | conflicts = self._do_merge(tree, tarball_filenames, package, | 758 | conflicts = self._do_merge(tree, tarball_filenames, package, |
70 | 759 | version, current_version, upstream_branch, upstream_revision, | 759 | version, current_version, upstream_branch, upstream_revisions, |
71 | 760 | merge_type, force) | 760 | merge_type, force) |
72 | 761 | if (current_version is not None and | 761 | if (current_version is not None and |
73 | 762 | Version(current_version) >= Version(version)): | 762 | Version(current_version) >= Version(version)): |
74 | @@ -886,9 +886,9 @@ | |||
75 | 886 | "sure it is tagged as %r." % (last_version, | 886 | "sure it is tagged as %r." % (last_version, |
76 | 887 | db.pristine_upstream_source.tag_name( | 887 | db.pristine_upstream_source.tag_name( |
77 | 888 | last_version.upstream_version))) | 888 | last_version.upstream_version))) |
79 | 889 | upstream_tip = db.pristine_upstream_source.version_as_revision( | 889 | upstream_tips = db.pristine_upstream_source.version_as_revisions( |
80 | 890 | changelog.package, last_version.upstream_version) | 890 | changelog.package, last_version.upstream_version) |
82 | 891 | db.extract_upstream_tree(upstream_tip, tempdir) | 891 | db.extract_upstream_tree(upstream_tips, tempdir) |
83 | 892 | else: | 892 | else: |
84 | 893 | db._create_empty_upstream_tree(tempdir) | 893 | db._create_empty_upstream_tree(tempdir) |
85 | 894 | self.import_many(db, files_list, orig_target) | 894 | self.import_many(db, files_list, orig_target) |
86 | @@ -955,19 +955,24 @@ | |||
87 | 955 | if db.pristine_upstream_source.has_version(None, version): | 955 | if db.pristine_upstream_source.has_version(None, version): |
88 | 956 | raise BzrCommandError("Version %s is already present." % version) | 956 | raise BzrCommandError("Version %s is already present." % version) |
89 | 957 | tagged_versions = {} | 957 | tagged_versions = {} |
92 | 958 | for tag, tag_version, revid in db.pristine_upstream_source.iter_versions(): | 958 | for tversion, tcomponents in db.pristine_upstream_source.iter_versions(): |
93 | 959 | tagged_versions[Version(tag_version)] = revid | 959 | tagged_versions[Version(version)] = tcomponents |
94 | 960 | tag_order = sorted(tagged_versions.keys()) | 960 | tag_order = sorted(tagged_versions.keys()) |
95 | 961 | if tag_order: | 961 | if tag_order: |
97 | 962 | parents = [tagged_versions[tag_order[-1]]] | 962 | base_revisions = tagged_versions[tag_order[-1]] |
98 | 963 | else: | 963 | else: |
101 | 964 | parents = [] | 964 | base_revisions = {} |
102 | 965 | if parents: | 965 | if base_revisions: |
103 | 966 | if upstream is not None: | 966 | if upstream is not None: |
104 | 967 | # See bug lp:309682 | 967 | # See bug lp:309682 |
107 | 968 | upstream.repository.fetch(branch.repository, parents[0]) | 968 | for parent in base_revisions.values(): |
108 | 969 | db.extract_upstream_tree(parents[0], tempdir) | 969 | upstream.repository.fetch(branch.repository, parent) |
109 | 970 | db.extract_upstream_tree(base_revisions, tempdir) | ||
110 | 971 | parents = {} | ||
111 | 972 | for name, base_revid in base_revisions.iteritems(): | ||
112 | 973 | parents[name] = [base_revid] | ||
113 | 970 | else: | 974 | else: |
114 | 975 | parents = {} | ||
115 | 971 | db._create_empty_upstream_tree(tempdir) | 976 | db._create_empty_upstream_tree(tempdir) |
116 | 972 | tree = db.branch.basis_tree() | 977 | tree = db.branch.basis_tree() |
117 | 973 | tree.lock_read() | 978 | tree.lock_read() |
118 | @@ -983,7 +988,7 @@ | |||
119 | 983 | tarballs = [(location, None, md5sum_filename(location))] | 988 | tarballs = [(location, None, md5sum_filename(location))] |
120 | 984 | for (component, tag_name, revid) in db.import_upstream_tarballs( | 989 | for (component, tag_name, revid) in db.import_upstream_tarballs( |
121 | 985 | tarballs, None, version, parents, upstream_branch=upstream, | 990 | tarballs, None, version, parents, upstream_branch=upstream, |
123 | 986 | upstream_revision=upstream_revid): | 991 | upstream_revisions={ None: upstream_revid }): |
124 | 987 | if component is None: | 992 | if component is None: |
125 | 988 | self.outf.write('Imported %s as tag:%s.\n' % ( | 993 | self.outf.write('Imported %s as tag:%s.\n' % ( |
126 | 989 | location, tag_name)) | 994 | location, tag_name)) |
127 | @@ -1224,9 +1229,8 @@ | |||
128 | 1224 | dh_make.run_dh_make(tree, package_name, version, use_v3=v3) | 1229 | dh_make.run_dh_make(tree, package_name, version, use_v3=v3) |
129 | 1225 | finally: | 1230 | finally: |
130 | 1226 | tree.unlock() | 1231 | tree.unlock() |
134 | 1227 | note('Package prepared in %s' | 1232 | note('Package prepared in %s', |
135 | 1228 | % urlutils.unescape_for_display(tree.basedir, | 1233 | urlutils.unescape_for_display(tree.basedir, self.outf.encoding)) |
133 | 1229 | self.outf.encoding)) | ||
136 | 1230 | 1234 | ||
137 | 1231 | 1235 | ||
138 | 1232 | class cmd_dep3_patch(Command): | 1236 | class cmd_dep3_patch(Command): |
139 | 1233 | 1237 | ||
140 | === modified file 'debian/changelog' | |||
141 | --- debian/changelog 2011-09-09 13:21:35 +0000 | |||
142 | +++ debian/changelog 2011-09-27 00:50:26 +0000 | |||
143 | @@ -1,8 +1,10 @@ | |||
144 | 1 | bzr-builddeb (2.7.9) UNRELEASED; urgency=low | 1 | bzr-builddeb (2.7.9) UNRELEASED; urgency=low |
145 | 2 | 2 | ||
146 | 3 | * Support .tar.xz Debian files rather than .tar.lzma. | 3 | * Support .tar.xz Debian files rather than .tar.lzma. |
147 | 4 | * Support importing and building packages with multiple upstream | ||
148 | 5 | tarballs. LP: #653757, LP: #664834 | ||
149 | 4 | 6 | ||
151 | 5 | -- Jelmer Vernooij <jelmer@debian.org> Fri, 09 Sep 2011 15:21:22 +0200 | 7 | -- Jelmer Vernooij <jelmer@debian.org> Tue, 27 Sep 2011 02:40:03 +0200 |
152 | 6 | 8 | ||
153 | 7 | bzr-builddeb (2.7.8) unstable; urgency=low | 9 | bzr-builddeb (2.7.8) unstable; urgency=low |
154 | 8 | 10 | ||
155 | 9 | 11 | ||
156 | === modified file 'dh_make.py' | |||
157 | --- dh_make.py 2011-09-09 13:20:42 +0000 | |||
158 | +++ dh_make.py 2011-09-27 00:50:26 +0000 | |||
159 | @@ -79,9 +79,9 @@ | |||
160 | 79 | def import_upstream(tarball, package_name, version, use_v3=False): | 79 | def import_upstream(tarball, package_name, version, use_v3=False): |
161 | 80 | tree = _get_tree(package_name) | 80 | tree = _get_tree(package_name) |
162 | 81 | if tree.branch.last_revision() != mod_revision.NULL_REVISION: | 81 | if tree.branch.last_revision() != mod_revision.NULL_REVISION: |
164 | 82 | parents = [tree.branch.last_revision()] | 82 | parents = { None: [tree.branch.last_revision()] } |
165 | 83 | else: | 83 | else: |
167 | 84 | parents = [] | 84 | parents = {} |
168 | 85 | tarball_filenames = _get_tarballs(tree, tarball, | 85 | tarball_filenames = _get_tarballs(tree, tarball, |
169 | 86 | package_name, version, use_v3=use_v3) | 86 | package_name, version, use_v3=use_v3) |
170 | 87 | db = import_dsc.DistributionBranch(tree.branch, tree.branch, tree=tree, | 87 | db = import_dsc.DistributionBranch(tree.branch, tree.branch, tree=tree, |
171 | 88 | 88 | ||
172 | === modified file 'import_dsc.py' | |||
173 | --- import_dsc.py 2011-09-09 13:20:42 +0000 | |||
174 | +++ import_dsc.py 2011-09-27 00:50:26 +0000 | |||
175 | @@ -60,6 +60,7 @@ | |||
176 | 60 | 60 | ||
177 | 61 | from bzrlib.plugins.builddeb.bzrtools_import import import_dir | 61 | from bzrlib.plugins.builddeb.bzrtools_import import import_dir |
178 | 62 | from bzrlib.plugins.builddeb.errors import ( | 62 | from bzrlib.plugins.builddeb.errors import ( |
179 | 63 | MultipleUpstreamTarballsNotSupported, | ||
180 | 63 | PackageVersionNotPresent, | 64 | PackageVersionNotPresent, |
181 | 64 | UpstreamAlreadyImported, | 65 | UpstreamAlreadyImported, |
182 | 65 | UpstreamBranchAlreadyMerged, | 66 | UpstreamBranchAlreadyMerged, |
183 | @@ -556,6 +557,7 @@ | |||
184 | 556 | tarballs=upstream_tarballs): | 557 | tarballs=upstream_tarballs): |
185 | 557 | return False | 558 | return False |
186 | 558 | 559 | ||
187 | 560 | |||
188 | 559 | up_branch = self.pristine_upstream_branch | 561 | up_branch = self.pristine_upstream_branch |
189 | 560 | up_branch.lock_read() | 562 | up_branch.lock_read() |
190 | 561 | try: | 563 | try: |
191 | @@ -563,10 +565,14 @@ | |||
192 | 563 | other_up_branch = branch.pristine_upstream_branch | 565 | other_up_branch = branch.pristine_upstream_branch |
193 | 564 | other_up_branch.lock_read() | 566 | other_up_branch.lock_read() |
194 | 565 | try: | 567 | try: |
195 | 568 | pristine_upstream_revids = branch.pristine_upstream_source.version_as_revisions(package, version) | ||
196 | 569 | if pristine_upstream_revids.keys() != [None]: | ||
197 | 570 | raise MultipleUpstreamTarballsNotSupported() | ||
198 | 571 | pristine_upstream_revid = pristine_upstream_revids[None] | ||
199 | 566 | graph = other_up_branch.repository.get_graph( | 572 | graph = other_up_branch.repository.get_graph( |
200 | 567 | up_branch.repository) | 573 | up_branch.repository) |
201 | 568 | return graph.is_ancestor(up_branch.last_revision(), | 574 | return graph.is_ancestor(up_branch.last_revision(), |
203 | 569 | branch.pristine_upstream_source.version_as_revision(package, version)) | 575 | pristine_upstream_revid) |
204 | 570 | finally: | 576 | finally: |
205 | 571 | other_up_branch.unlock() | 577 | other_up_branch.unlock() |
206 | 572 | finally: | 578 | finally: |
207 | @@ -680,7 +686,11 @@ | |||
208 | 680 | :param version: the upstream version string | 686 | :param version: the upstream version string |
209 | 681 | """ | 687 | """ |
210 | 682 | assert isinstance(version, str) | 688 | assert isinstance(version, str) |
212 | 683 | pull_revision = pull_branch.pristine_upstream_source.version_as_revision(package, version) | 689 | pull_revisions = pull_branch.pristine_upstream_source.version_as_revisions( |
213 | 690 | package, version) | ||
214 | 691 | if pull_revisions.keys() != [None]: | ||
215 | 692 | raise MultipleUpstreamTarballsNotSupported() | ||
216 | 693 | pull_revision = pull_revisions[None] | ||
217 | 684 | mutter("Pulling upstream part of %s from revision %s" % \ | 694 | mutter("Pulling upstream part of %s from revision %s" % \ |
218 | 685 | (version, pull_revision)) | 695 | (version, pull_revision)) |
219 | 686 | assert self.pristine_upstream_tree is not None, \ | 696 | assert self.pristine_upstream_tree is not None, \ |
220 | @@ -774,12 +784,17 @@ | |||
221 | 774 | break | 784 | break |
222 | 775 | real_parents = [p[2] for p in parents] | 785 | real_parents = [p[2] for p in parents] |
223 | 776 | if need_upstream_parent: | 786 | if need_upstream_parent: |
230 | 777 | parent_revid = self.pristine_upstream_source.version_as_revision(package, | 787 | upstream_revids = self.pristine_upstream_source.version_as_revisions( |
231 | 778 | version.upstream_version, tarballs) | 788 | package, version.upstream_version, tarballs) |
232 | 779 | if len(parents) > 0: | 789 | def key(a): |
233 | 780 | real_parents.insert(1, parent_revid) | 790 | if a is None: |
234 | 781 | else: | 791 | return None |
235 | 782 | real_parents = [parent_revid] | 792 | return a |
236 | 793 | for component in sorted(upstream_revids.keys(), key=key): | ||
237 | 794 | if len(real_parents) > 0: | ||
238 | 795 | real_parents.insert(1, upstream_revids[component]) | ||
239 | 796 | else: | ||
240 | 797 | real_parents = [upstream_revids[component]] | ||
241 | 783 | return real_parents | 798 | return real_parents |
242 | 784 | 799 | ||
243 | 785 | def _fetch_upstream_to_branch(self, revid): | 800 | def _fetch_upstream_to_branch(self, revid): |
244 | @@ -793,7 +808,7 @@ | |||
245 | 793 | 808 | ||
246 | 794 | def import_upstream(self, upstream_part, package, version, upstream_parents, | 809 | def import_upstream(self, upstream_part, package, version, upstream_parents, |
247 | 795 | upstream_tarballs, upstream_branch=None, | 810 | upstream_tarballs, upstream_branch=None, |
249 | 796 | upstream_revision=None, timestamp=None, author=None, | 811 | upstream_revisions=None, timestamp=None, author=None, |
250 | 797 | file_ids_from=None): | 812 | file_ids_from=None): |
251 | 798 | """Import an upstream part on to the upstream branch. | 813 | """Import an upstream part on to the upstream branch. |
252 | 799 | 814 | ||
253 | @@ -814,25 +829,31 @@ | |||
254 | 814 | # TODO: this method needs a lot of work for when we will make | 829 | # TODO: this method needs a lot of work for when we will make |
255 | 815 | # the branches writeable by others. | 830 | # the branches writeable by others. |
256 | 816 | assert isinstance(version, str) | 831 | assert isinstance(version, str) |
259 | 817 | mutter("Importing upstream version %s from %s with parents %s" \ | 832 | mutter("Importing upstream version %s from %s with parents %r" \ |
260 | 818 | % (version, upstream_part, str(upstream_parents))) | 833 | % (version, upstream_part, upstream_parents)) |
261 | 819 | assert self.pristine_upstream_tree is not None, \ | 834 | assert self.pristine_upstream_tree is not None, \ |
262 | 820 | "Can't import upstream with no tree" | 835 | "Can't import upstream with no tree" |
263 | 821 | other_branches = self.get_other_branches() | 836 | other_branches = self.get_other_branches() |
264 | 822 | ret = [] | 837 | ret = [] |
265 | 823 | for (tarball, component, md5) in upstream_tarballs: | 838 | for (tarball, component, md5) in upstream_tarballs: |
266 | 839 | parents = upstream_parents.get(component, []) | ||
267 | 840 | if upstream_revisions is not None: | ||
268 | 841 | revid = upstream_revisions[component] | ||
269 | 842 | else: | ||
270 | 843 | revid = None | ||
271 | 824 | upstream_trees = [o.pristine_upstream_branch.basis_tree() | 844 | upstream_trees = [o.pristine_upstream_branch.basis_tree() |
272 | 825 | for o in other_branches] | 845 | for o in other_branches] |
273 | 826 | target_tree = None | 846 | target_tree = None |
274 | 827 | if upstream_branch is not None: | 847 | if upstream_branch is not None: |
277 | 828 | if upstream_revision is None: | 848 | if revid is None: |
278 | 829 | upstream_revision = upstream_branch.last_revision() | 849 | # FIXME: This is wrong for component tarballs |
279 | 850 | revid = upstream_branch.last_revision() | ||
280 | 830 | self.pristine_upstream_branch.fetch(upstream_branch, | 851 | self.pristine_upstream_branch.fetch(upstream_branch, |
282 | 831 | last_revision=upstream_revision) | 852 | last_revision=revid) |
283 | 832 | upstream_branch.tags.merge_to(self.pristine_upstream_branch.tags) | 853 | upstream_branch.tags.merge_to(self.pristine_upstream_branch.tags) |
285 | 833 | upstream_parents.append(upstream_revision) | 854 | parents.append(revid) |
286 | 834 | target_tree = self.pristine_upstream_branch.repository.revision_tree( | 855 | target_tree = self.pristine_upstream_branch.repository.revision_tree( |
288 | 835 | upstream_revision) | 856 | revid) |
289 | 836 | if file_ids_from is not None: | 857 | if file_ids_from is not None: |
290 | 837 | upstream_trees = file_ids_from + upstream_trees | 858 | upstream_trees = file_ids_from + upstream_trees |
291 | 838 | if self.tree: | 859 | if self.tree: |
292 | @@ -841,8 +862,8 @@ | |||
293 | 841 | else: | 862 | else: |
294 | 842 | self_tree = self.branch.basis_tree() | 863 | self_tree = self.branch.basis_tree() |
295 | 843 | self_tree.lock_read() | 864 | self_tree.lock_read() |
298 | 844 | if len(upstream_parents) > 0: | 865 | if len(parents) > 0: |
299 | 845 | parent_revid = upstream_parents[0] | 866 | parent_revid = parents[0] |
300 | 846 | else: | 867 | else: |
301 | 847 | parent_revid = NULL_REVISION | 868 | parent_revid = NULL_REVISION |
302 | 848 | self.pristine_upstream_tree.pull(self.pristine_upstream_tree.branch, | 869 | self.pristine_upstream_tree.pull(self.pristine_upstream_tree.branch, |
303 | @@ -857,16 +878,22 @@ | |||
304 | 857 | target_tree=target_tree) | 878 | target_tree=target_tree) |
305 | 858 | finally: | 879 | finally: |
306 | 859 | self_tree.unlock() | 880 | self_tree.unlock() |
307 | 881 | if component is None: | ||
308 | 882 | exclude = [tb[1] for tb in upstream_tarballs if tb[1] is not None] | ||
309 | 883 | else: | ||
310 | 884 | exclude = [] | ||
311 | 860 | (tag, revid) = self.pristine_upstream_source.import_component_tarball( | 885 | (tag, revid) = self.pristine_upstream_source.import_component_tarball( |
314 | 861 | package, version, self.pristine_upstream_tree, upstream_parents, component, | 886 | package, version, self.pristine_upstream_tree, parents, |
315 | 862 | md5, tarball, author=author, timestamp=timestamp) | 887 | component, md5, tarball, author=author, timestamp=timestamp, |
316 | 888 | exclude=exclude) | ||
317 | 889 | self.pristine_upstream_branch.generate_revision_history(revid) | ||
318 | 863 | ret.append((component, tag, revid)) | 890 | ret.append((component, tag, revid)) |
319 | 864 | self.branch.fetch(self.pristine_upstream_branch) | 891 | self.branch.fetch(self.pristine_upstream_branch) |
320 | 865 | self.branch.tags.set_tag(tag, revid) | 892 | self.branch.tags.set_tag(tag, revid) |
321 | 866 | return ret | 893 | return ret |
322 | 867 | 894 | ||
323 | 868 | def import_upstream_tarballs(self, tarballs, package, version, parents, | 895 | def import_upstream_tarballs(self, tarballs, package, version, parents, |
325 | 869 | upstream_branch=None, upstream_revision=None): | 896 | upstream_branch=None, upstream_revisions=None): |
326 | 870 | """Import an upstream part to the upstream branch. | 897 | """Import an upstream part to the upstream branch. |
327 | 871 | 898 | ||
328 | 872 | :param tarballs: List of tarballs / components to extract | 899 | :param tarballs: List of tarballs / components to extract |
329 | @@ -876,7 +903,7 @@ | |||
330 | 876 | parents. | 903 | parents. |
331 | 877 | :param upstream_branch: An upstream branch to associate with the | 904 | :param upstream_branch: An upstream branch to associate with the |
332 | 878 | tarball. | 905 | tarball. |
334 | 879 | :param upstream_revision: Upstream revision id | 906 | :param upstream_revisions: Upstream revision ids dictionary |
335 | 880 | :param md5sum: hex digest of the md5sum of the tarball, if known. | 907 | :param md5sum: hex digest of the md5sum of the tarball, if known. |
336 | 881 | :return: list with (component, tag, revid) tuples | 908 | :return: list with (component, tag, revid) tuples |
337 | 882 | """ | 909 | """ |
338 | @@ -885,7 +912,7 @@ | |||
339 | 885 | return self.import_upstream(tarball_dir, package, version, parents, | 912 | return self.import_upstream(tarball_dir, package, version, parents, |
340 | 886 | tarballs, | 913 | tarballs, |
341 | 887 | upstream_branch=upstream_branch, | 914 | upstream_branch=upstream_branch, |
343 | 888 | upstream_revision=upstream_revision) | 915 | upstream_revisions=upstream_revisions) |
344 | 889 | finally: | 916 | finally: |
345 | 890 | shutil.rmtree(tarball_dir) | 917 | shutil.rmtree(tarball_dir) |
346 | 891 | 918 | ||
347 | @@ -1052,8 +1079,11 @@ | |||
348 | 1052 | pull_branch = pull_parents[1][0] | 1079 | pull_branch = pull_parents[1][0] |
349 | 1053 | pull_version = pull_parents[1][1] | 1080 | pull_version = pull_parents[1][1] |
350 | 1054 | if not pull_branch.is_version_native(pull_version): | 1081 | if not pull_branch.is_version_native(pull_version): |
352 | 1055 | pull_revid = pull_branch.pristine_upstream_source.version_as_revision( | 1082 | pull_revids = pull_branch.pristine_upstream_source.version_as_revisions( |
353 | 1056 | package, pull_version.upstream_version) | 1083 | package, pull_version.upstream_version) |
354 | 1084 | if pull_revids.keys() != [None]: | ||
355 | 1085 | raise MultipleUpstreamTarballsNotSupported() | ||
356 | 1086 | pull_revid = pull_revids[None] | ||
357 | 1057 | mutter("Initialising upstream from %s, version %s", | 1087 | mutter("Initialising upstream from %s, version %s", |
358 | 1058 | str(pull_branch), str(pull_version)) | 1088 | str(pull_branch), str(pull_version)) |
359 | 1059 | parents.append(pull_revid) | 1089 | parents.append(pull_revid) |
360 | @@ -1062,7 +1092,8 @@ | |||
361 | 1062 | last_revision=pull_revid) | 1092 | last_revision=pull_revid) |
362 | 1063 | pull_branch.pristine_upstream_branch.tags.merge_to( | 1093 | pull_branch.pristine_upstream_branch.tags.merge_to( |
363 | 1064 | self.pristine_upstream_branch.tags) | 1094 | self.pristine_upstream_branch.tags) |
365 | 1065 | return parents | 1095 | # FIXME: What about other versions ? |
366 | 1096 | return { None: parents } | ||
367 | 1066 | 1097 | ||
368 | 1067 | def get_changelog_from_source(self, dir): | 1098 | def get_changelog_from_source(self, dir): |
369 | 1068 | cl_filename = os.path.join(dir, "debian", "changelog") | 1099 | cl_filename = os.path.join(dir, "debian", "changelog") |
370 | @@ -1245,16 +1276,16 @@ | |||
371 | 1245 | finally: | 1276 | finally: |
372 | 1246 | extractor.cleanup() | 1277 | extractor.cleanup() |
373 | 1247 | 1278 | ||
375 | 1248 | def extract_upstream_tree(self, upstream_tip, basedir): | 1279 | def extract_upstream_tree(self, upstream_tips, basedir): |
376 | 1249 | """Extract upstream_tip to a tempdir as a working tree.""" | 1280 | """Extract upstream_tip to a tempdir as a working tree.""" |
377 | 1250 | # TODO: should stack rather than trying to use the repository, | 1281 | # TODO: should stack rather than trying to use the repository, |
378 | 1251 | # as that will be more efficient. | 1282 | # as that will be more efficient. |
379 | 1252 | # TODO: remove the _extract_upstream_tree alias below. | ||
380 | 1253 | to_location = os.path.join(basedir, "upstream") | 1283 | to_location = os.path.join(basedir, "upstream") |
381 | 1254 | # Use upstream_branch if it has been set, otherwise self.branch. | 1284 | # Use upstream_branch if it has been set, otherwise self.branch. |
382 | 1255 | source_branch = self.pristine_upstream_branch or self.branch | 1285 | source_branch = self.pristine_upstream_branch or self.branch |
383 | 1286 | assert upstream_tips.keys() == [None] | ||
384 | 1256 | dir_to = source_branch.bzrdir.sprout(to_location, | 1287 | dir_to = source_branch.bzrdir.sprout(to_location, |
386 | 1257 | revision_id=upstream_tip, | 1288 | revision_id=upstream_tips[None], |
387 | 1258 | accelerator_tree=self.tree) | 1289 | accelerator_tree=self.tree) |
388 | 1259 | try: | 1290 | try: |
389 | 1260 | self.pristine_upstream_tree = dir_to.open_workingtree() | 1291 | self.pristine_upstream_tree = dir_to.open_workingtree() |
390 | @@ -1263,8 +1294,6 @@ | |||
391 | 1263 | self.pristine_upstream_tree = dir_to.create_workingtree() | 1294 | self.pristine_upstream_tree = dir_to.create_workingtree() |
392 | 1264 | self.pristine_upstream_branch = self.pristine_upstream_tree.branch | 1295 | self.pristine_upstream_branch = self.pristine_upstream_tree.branch |
393 | 1265 | 1296 | ||
394 | 1266 | _extract_upstream_tree = extract_upstream_tree | ||
395 | 1267 | |||
396 | 1268 | def _create_empty_upstream_tree(self, basedir): | 1297 | def _create_empty_upstream_tree(self, basedir): |
397 | 1269 | to_location = os.path.join(basedir, "upstream") | 1298 | to_location = os.path.join(basedir, "upstream") |
398 | 1270 | to_transport = get_transport(to_location) | 1299 | to_transport = get_transport(to_location) |
399 | @@ -1314,7 +1343,7 @@ | |||
400 | 1314 | assert isinstance(previous_version, str), \ | 1343 | assert isinstance(previous_version, str), \ |
401 | 1315 | "Should pass upstream version as str, not Version." | 1344 | "Should pass upstream version as str, not Version." |
402 | 1316 | try: | 1345 | try: |
404 | 1317 | upstream_tip = self.pristine_upstream_source.version_as_revision( | 1346 | upstream_tips = self.pristine_upstream_source.version_as_revisions( |
405 | 1318 | package, previous_version) | 1347 | package, previous_version) |
406 | 1319 | except PackageVersionNotPresent: | 1348 | except PackageVersionNotPresent: |
407 | 1320 | raise BzrCommandError("Unable to find the tag for the " | 1349 | raise BzrCommandError("Unable to find the tag for the " |
408 | @@ -1322,10 +1351,16 @@ | |||
409 | 1322 | "%s" % ( | 1351 | "%s" % ( |
410 | 1323 | previous_version, | 1352 | previous_version, |
411 | 1324 | self.pristine_upstream_source.tag_name(previous_version))) | 1353 | self.pristine_upstream_source.tag_name(previous_version))) |
413 | 1325 | self.extract_upstream_tree(upstream_tip, tempdir) | 1354 | self.extract_upstream_tree(upstream_tips, tempdir) |
414 | 1355 | |||
415 | 1356 | def has_merged_upstream_revisions(self, this_revision, upstream_repository, upstream_revisions): | ||
416 | 1357 | graph = self.branch.repository.get_graph( | ||
417 | 1358 | other_repository=upstream_repository) | ||
418 | 1359 | return all(graph.is_ancestor(upstream_revision, this_revision) | ||
419 | 1360 | for upstream_revision in upstream_revisions.values()) | ||
420 | 1326 | 1361 | ||
421 | 1327 | def merge_upstream(self, tarball_filenames, package, version, previous_version, | 1362 | def merge_upstream(self, tarball_filenames, package, version, previous_version, |
423 | 1328 | upstream_branch=None, upstream_revision=None, merge_type=None, | 1363 | upstream_branch=None, upstream_revisions=None, merge_type=None, |
424 | 1329 | force=False): | 1364 | force=False): |
425 | 1330 | assert isinstance(version, str), \ | 1365 | assert isinstance(version, str), \ |
426 | 1331 | "Should pass version as str not %s" % str(type(version)) | 1366 | "Should pass version as str not %s" % str(type(version)) |
427 | @@ -1344,12 +1379,10 @@ | |||
428 | 1344 | upstream_branch.lock_read() | 1379 | upstream_branch.lock_read() |
429 | 1345 | try: | 1380 | try: |
430 | 1346 | if upstream_branch is not None: | 1381 | if upstream_branch is not None: |
437 | 1347 | if upstream_revision is None: | 1382 | if upstream_revisions is None: |
438 | 1348 | upstream_revision = upstream_branch.last_revision() | 1383 | upstream_revisions = { None: upstream_branch.last_revision() } |
439 | 1349 | graph = self.branch.repository.get_graph( | 1384 | if (not force and |
440 | 1350 | other_repository=upstream_branch.repository) | 1385 | self.has_merged_upstream_revisions(self.branch.last_revision(), upstream_branch.repository, upstream_revisions)): |
435 | 1351 | if not force and graph.is_ancestor(upstream_revision, | ||
436 | 1352 | self.branch.last_revision()): | ||
441 | 1353 | raise UpstreamBranchAlreadyMerged | 1386 | raise UpstreamBranchAlreadyMerged |
442 | 1354 | upstream_tarballs = [ | 1387 | upstream_tarballs = [ |
443 | 1355 | (os.path.abspath(fn), component, md5sum_filename(fn)) for | 1388 | (os.path.abspath(fn), component, md5sum_filename(fn)) for |
444 | @@ -1358,13 +1391,14 @@ | |||
445 | 1358 | tarball_dir = self._extract_tarballs_to_tempdir(upstream_tarballs) | 1391 | tarball_dir = self._extract_tarballs_to_tempdir(upstream_tarballs) |
446 | 1359 | try: | 1392 | try: |
447 | 1360 | # FIXME: should use upstream_parents()? | 1393 | # FIXME: should use upstream_parents()? |
449 | 1361 | parents = [] | 1394 | parents = { None: [] } |
450 | 1362 | if self.pristine_upstream_branch.last_revision() != NULL_REVISION: | 1395 | if self.pristine_upstream_branch.last_revision() != NULL_REVISION: |
452 | 1363 | parents = [self.pristine_upstream_branch.last_revision()] | 1396 | parents = { None: [self.pristine_upstream_branch.last_revision()] } |
453 | 1364 | for (component, tag, revid) in self.import_upstream(tarball_dir, | 1397 | for (component, tag, revid) in self.import_upstream(tarball_dir, |
455 | 1365 | package, version, parents, upstream_tarballs=upstream_tarballs, | 1398 | package, version, parents, |
456 | 1399 | upstream_tarballs=upstream_tarballs, | ||
457 | 1366 | upstream_branch=upstream_branch, | 1400 | upstream_branch=upstream_branch, |
459 | 1367 | upstream_revision=upstream_revision): | 1401 | upstream_revisions=upstream_revisions): |
460 | 1368 | self._fetch_upstream_to_branch(revid) | 1402 | self._fetch_upstream_to_branch(revid) |
461 | 1369 | finally: | 1403 | finally: |
462 | 1370 | shutil.rmtree(tarball_dir) | 1404 | shutil.rmtree(tarball_dir) |
463 | @@ -1377,10 +1411,10 @@ | |||
464 | 1377 | # missing a proper history link and a criss-cross merge | 1411 | # missing a proper history link and a criss-cross merge |
465 | 1378 | # then recurses and finds no deeper ancestor. | 1412 | # then recurses and finds no deeper ancestor. |
466 | 1379 | # Use the previous upstream import as the from revision | 1413 | # Use the previous upstream import as the from revision |
468 | 1380 | if len(parents) == 0: | 1414 | if len(parents[None]) == 0: |
469 | 1381 | from_revision = NULL_REVISION | 1415 | from_revision = NULL_REVISION |
470 | 1382 | else: | 1416 | else: |
472 | 1383 | from_revision = parents[0] | 1417 | from_revision = parents[None][0] |
473 | 1384 | conflicts = self.tree.merge_from_branch( | 1418 | conflicts = self.tree.merge_from_branch( |
474 | 1385 | self.pristine_upstream_branch, merge_type=merge_type, | 1419 | self.pristine_upstream_branch, merge_type=merge_type, |
475 | 1386 | from_revision=from_revision) | 1420 | from_revision=from_revision) |
476 | 1387 | 1421 | ||
477 | === modified file 'merge_package.py' | |||
478 | --- merge_package.py 2011-06-15 13:21:22 +0000 | |||
479 | +++ merge_package.py 2011-09-27 00:50:26 +0000 | |||
480 | @@ -31,7 +31,9 @@ | |||
481 | 31 | from debian_bundle.changelog import Version | 31 | from debian_bundle.changelog import Version |
482 | 32 | 32 | ||
483 | 33 | from bzrlib.plugins.builddeb.errors import ( | 33 | from bzrlib.plugins.builddeb.errors import ( |
485 | 34 | SharedUpstreamConflictsWithTargetPackaging) | 34 | MultipleUpstreamTarballsNotSupported, |
486 | 35 | SharedUpstreamConflictsWithTargetPackaging, | ||
487 | 36 | ) | ||
488 | 35 | from bzrlib.plugins.builddeb.import_dsc import DistributionBranch | 37 | from bzrlib.plugins.builddeb.import_dsc import DistributionBranch |
489 | 36 | from bzrlib.plugins.builddeb.util import find_changelog | 38 | from bzrlib.plugins.builddeb.util import find_changelog |
490 | 37 | 39 | ||
491 | @@ -59,8 +61,11 @@ | |||
492 | 59 | for branch in (source, target): | 61 | for branch in (source, target): |
493 | 60 | db = DistributionBranch(branch, branch) | 62 | db = DistributionBranch(branch, branch) |
494 | 61 | uver = _latest_version(branch).upstream_version | 63 | uver = _latest_version(branch).upstream_version |
497 | 62 | results.append((Version(uver), | 64 | upstream_revids = db.pristine_upstream_source.version_as_revisions(None, uver) |
498 | 63 | db.pristine_upstream_source.version_as_revision(None, uver))) | 65 | if upstream_revids.keys() != [None]: |
499 | 66 | raise MultipleUpstreamTarballsNotSupported() | ||
500 | 67 | upstream_revid = upstream_revids[None] | ||
501 | 68 | results.append((Version(uver), upstream_revid)) | ||
502 | 64 | 69 | ||
503 | 65 | return results | 70 | return results |
504 | 66 | 71 | ||
505 | @@ -136,7 +141,7 @@ | |||
506 | 136 | try: | 141 | try: |
507 | 137 | # Extract the merge target's upstream tree into a temporary | 142 | # Extract the merge target's upstream tree into a temporary |
508 | 138 | # directory. | 143 | # directory. |
510 | 139 | db.extract_upstream_tree(ut_revid, tempdir) | 144 | db.extract_upstream_tree({None: ut_revid}, tempdir) |
511 | 140 | tmp_target_utree = db.pristine_upstream_tree | 145 | tmp_target_utree = db.pristine_upstream_tree |
512 | 141 | 146 | ||
513 | 142 | # Merge upstream branch tips to obtain a shared upstream parent. | 147 | # Merge upstream branch tips to obtain a shared upstream parent. |
514 | 143 | 148 | ||
515 | === modified file 'tests/blackbox/test_merge_upstream.py' | |||
516 | --- tests/blackbox/test_merge_upstream.py 2011-07-20 19:14:43 +0000 | |||
517 | +++ tests/blackbox/test_merge_upstream.py 2011-09-27 00:50:26 +0000 | |||
518 | @@ -98,7 +98,7 @@ | |||
519 | 98 | [(self.tar.tarball, None, md5sum_filename(self.tar.tarball))], | 98 | [(self.tar.tarball, None, md5sum_filename(self.tar.tarball))], |
520 | 99 | "foo", | 99 | "foo", |
521 | 100 | str(self.tar.version), | 100 | str(self.tar.version), |
523 | 101 | [tree.branch.last_revision()]) | 101 | { None: [tree.branch.last_revision()]} ) |
524 | 102 | package_builder = SourcePackageBuilder("foo", | 102 | package_builder = SourcePackageBuilder("foo", |
525 | 103 | str(self.tar.version)+"-1") | 103 | str(self.tar.version)+"-1") |
526 | 104 | package_builder.add_default_control() | 104 | package_builder.add_default_control() |
527 | 105 | 105 | ||
528 | === modified file 'tests/test_import_dsc.py' | |||
529 | --- tests/test_import_dsc.py 2011-09-09 13:20:42 +0000 | |||
530 | +++ tests/test_import_dsc.py 2011-09-27 00:50:26 +0000 | |||
531 | @@ -213,14 +213,15 @@ | |||
532 | 213 | db.tag_version(version) | 213 | db.tag_version(version) |
533 | 214 | self.assertEqual(db.revid_of_version(version), revid) | 214 | self.assertEqual(db.revid_of_version(version), revid) |
534 | 215 | 215 | ||
536 | 216 | def test_upstream_version_as_revid(self): | 216 | def test_upstream_versions_as_revid(self): |
537 | 217 | db = self.db1 | 217 | db = self.db1 |
538 | 218 | tree = self.up_tree1 | 218 | tree = self.up_tree1 |
539 | 219 | version = "0.1" | 219 | version = "0.1" |
540 | 220 | revid = tree.commit("one") | 220 | revid = tree.commit("one") |
541 | 221 | db.tag_upstream_version(version) | 221 | db.tag_upstream_version(version) |
542 | 222 | self.assertEqual( | 222 | self.assertEqual( |
544 | 223 | db.pristine_upstream_source.version_as_revision("package", version), revid) | 223 | db.pristine_upstream_source.version_as_revisions("package", version), |
545 | 224 | { None: revid }) | ||
546 | 224 | 225 | ||
547 | 225 | def test_contained_versions(self): | 226 | def test_contained_versions(self): |
548 | 226 | db = self.db1 | 227 | db = self.db1 |
549 | @@ -710,8 +711,8 @@ | |||
550 | 710 | self.assertEqual(self.tree2.branch.last_revision(), revid) | 711 | self.assertEqual(self.tree2.branch.last_revision(), revid) |
551 | 711 | self.assertEqual(self.up_tree2.branch.last_revision(), up_revid) | 712 | self.assertEqual(self.up_tree2.branch.last_revision(), up_revid) |
552 | 712 | self.assertEqual(self.db2.revid_of_version(version), revid) | 713 | self.assertEqual(self.db2.revid_of_version(version), revid) |
555 | 713 | self.assertEqual(self.db2.pristine_upstream_source.version_as_revision( | 714 | self.assertEqual(self.db2.pristine_upstream_source.version_as_revisions( |
556 | 714 | "package", version.upstream_version), up_revid) | 715 | "package", version.upstream_version), {None: up_revid}) |
557 | 715 | 716 | ||
558 | 716 | def test_pull_from_lesser_branch_with_upstream(self): | 717 | def test_pull_from_lesser_branch_with_upstream(self): |
559 | 717 | version = Version("0.1-1") | 718 | version = Version("0.1-1") |
560 | @@ -726,8 +727,8 @@ | |||
561 | 726 | self.assertEqual(self.tree2.branch.last_revision(), revid) | 727 | self.assertEqual(self.tree2.branch.last_revision(), revid) |
562 | 727 | self.assertEqual(self.up_tree2.branch.last_revision(), up_revid) | 728 | self.assertEqual(self.up_tree2.branch.last_revision(), up_revid) |
563 | 728 | self.assertEqual(self.db2.revid_of_version(version), revid) | 729 | self.assertEqual(self.db2.revid_of_version(version), revid) |
566 | 729 | self.assertEqual(self.db2.pristine_upstream_source.version_as_revision( | 730 | self.assertEqual(self.db2.pristine_upstream_source.version_as_revisions( |
567 | 730 | "package", version.upstream_version), up_revid) | 731 | "package", version.upstream_version), {None: up_revid}) |
568 | 731 | 732 | ||
569 | 732 | def test_pull_upstream_from_branch(self): | 733 | def test_pull_upstream_from_branch(self): |
570 | 733 | version = "0.1" | 734 | version = "0.1" |
571 | @@ -737,8 +738,9 @@ | |||
572 | 737 | self.assertNotEqual(self.up_tree2.branch.last_revision(), up_revid) | 738 | self.assertNotEqual(self.up_tree2.branch.last_revision(), up_revid) |
573 | 738 | self.db2.pull_upstream_from_branch(self.db1, "package", version) | 739 | self.db2.pull_upstream_from_branch(self.db1, "package", version) |
574 | 739 | self.assertEqual(self.up_tree2.branch.last_revision(), up_revid) | 740 | self.assertEqual(self.up_tree2.branch.last_revision(), up_revid) |
577 | 740 | self.assertEqual(self.db2.pristine_upstream_source.version_as_revision("package", version), | 741 | self.assertEqual( |
578 | 741 | up_revid) | 742 | self.db2.pristine_upstream_source.version_as_revisions("package", version), |
579 | 743 | {None: up_revid}) | ||
580 | 742 | 744 | ||
581 | 743 | def check_changes(self, changes, added=[], removed=[], modified=[], | 745 | def check_changes(self, changes, added=[], removed=[], modified=[], |
582 | 744 | renamed=[]): | 746 | renamed=[]): |
583 | @@ -785,7 +787,7 @@ | |||
584 | 785 | element in contents] | 787 | element in contents] |
585 | 786 | self.build_tree_contents(contents) | 788 | self.build_tree_contents(contents) |
586 | 787 | self.db1.import_upstream(basedir, "package", version.upstream_version, | 789 | self.db1.import_upstream(basedir, "package", version.upstream_version, |
588 | 788 | [], [(None, None, None)]) | 790 | {}, [(None, None, None)]) |
589 | 789 | return version | 791 | return version |
590 | 790 | 792 | ||
591 | 791 | def test_import_upstream(self): | 793 | def test_import_upstream(self): |
592 | @@ -794,8 +796,8 @@ | |||
593 | 794 | branch = tree.branch | 796 | branch = tree.branch |
594 | 795 | rh = branch.revision_history() | 797 | rh = branch.revision_history() |
595 | 796 | self.assertEqual(len(rh), 1) | 798 | self.assertEqual(len(rh), 1) |
598 | 797 | self.assertEqual(self.db1.pristine_upstream_source.version_as_revision( | 799 | self.assertEqual(self.db1.pristine_upstream_source.version_as_revisions( |
599 | 798 | "package", version.upstream_version), rh[0]) | 800 | "package", version.upstream_version), {None: rh[0]}) |
600 | 799 | rev = branch.repository.get_revision(rh[0]) | 801 | rev = branch.repository.get_revision(rh[0]) |
601 | 800 | self.assertEqual(rev.message, | 802 | self.assertEqual(rev.message, |
602 | 801 | "Import upstream version %s" % str(version.upstream_version)) | 803 | "Import upstream version %s" % str(version.upstream_version)) |
603 | @@ -819,7 +821,7 @@ | |||
604 | 819 | write_to_file(os.path.join(basedir, "README"), "Hi\n") | 821 | write_to_file(os.path.join(basedir, "README"), "Hi\n") |
605 | 820 | write_to_file(os.path.join(basedir, "BUGS"), "") | 822 | write_to_file(os.path.join(basedir, "BUGS"), "") |
606 | 821 | write_to_file(os.path.join(basedir, "COPYING"), "") | 823 | write_to_file(os.path.join(basedir, "COPYING"), "") |
608 | 822 | self.db1.import_upstream(basedir, "package", version1.upstream_version, [], | 824 | self.db1.import_upstream(basedir, "package", version1.upstream_version, {}, |
609 | 823 | [(None, None, None)]) | 825 | [(None, None, None)]) |
610 | 824 | basedir = name + "-" + str(version2.upstream_version) | 826 | basedir = name + "-" + str(version2.upstream_version) |
611 | 825 | os.mkdir(basedir) | 827 | os.mkdir(basedir) |
612 | @@ -827,13 +829,15 @@ | |||
613 | 827 | write_to_file(os.path.join(basedir, "BUGS"), "") | 829 | write_to_file(os.path.join(basedir, "BUGS"), "") |
614 | 828 | write_to_file(os.path.join(basedir, "NEWS"), "") | 830 | write_to_file(os.path.join(basedir, "NEWS"), "") |
615 | 829 | self.db1.import_upstream(basedir, "package", version2.upstream_version, | 831 | self.db1.import_upstream(basedir, "package", version2.upstream_version, |
617 | 830 | [self.up_tree1.branch.last_revision()], [(None, None, None)]) | 832 | { None: [self.up_tree1.branch.last_revision()] }, [(None, None, None)]) |
618 | 831 | tree = self.up_tree1 | 833 | tree = self.up_tree1 |
619 | 832 | branch = tree.branch | 834 | branch = tree.branch |
620 | 833 | rh = branch.revision_history() | 835 | rh = branch.revision_history() |
621 | 834 | self.assertEqual(len(rh), 2) | 836 | self.assertEqual(len(rh), 2) |
622 | 835 | self.assertEqual( | 837 | self.assertEqual( |
624 | 836 | self.db1.pristine_upstream_source.version_as_revision("package", version2.upstream_version), rh[1]) | 838 | self.db1.pristine_upstream_source.version_as_revisions( |
625 | 839 | "package", version2.upstream_version), | ||
626 | 840 | {None: rh[1]}) | ||
627 | 837 | rev = branch.repository.get_revision(rh[1]) | 841 | rev = branch.repository.get_revision(rh[1]) |
628 | 838 | self.assertEqual(rev.message, | 842 | self.assertEqual(rev.message, |
629 | 839 | "Import upstream version %s" % str(version2.upstream_version)) | 843 | "Import upstream version %s" % str(version2.upstream_version)) |
630 | @@ -858,14 +862,14 @@ | |||
631 | 858 | tf.add(basedir) | 862 | tf.add(basedir) |
632 | 859 | finally: | 863 | finally: |
633 | 860 | tf.close() | 864 | tf.close() |
635 | 861 | self.db1.import_upstream(basedir, "package", version.upstream_version, [], | 865 | self.db1.import_upstream(basedir, "package", version.upstream_version, {}, |
636 | 862 | upstream_tarballs=[(os.path.abspath(tar_path), None, self.fake_md5_1)]) | 866 | upstream_tarballs=[(os.path.abspath(tar_path), None, self.fake_md5_1)]) |
637 | 863 | tree = self.up_tree1 | 867 | tree = self.up_tree1 |
638 | 864 | branch = tree.branch | 868 | branch = tree.branch |
639 | 865 | rh = branch.revision_history() | 869 | rh = branch.revision_history() |
640 | 866 | self.assertEqual(len(rh), 1) | 870 | self.assertEqual(len(rh), 1) |
643 | 867 | self.assertEqual(self.db1.pristine_upstream_source.version_as_revision( | 871 | self.assertEqual(self.db1.pristine_upstream_source.version_as_revisions( |
644 | 868 | "package", version.upstream_version), rh[0]) | 872 | "package", version.upstream_version), {None: rh[0]}) |
645 | 869 | rev = branch.repository.get_revision(rh[0]) | 873 | rev = branch.repository.get_revision(rh[0]) |
646 | 870 | self.assertEqual(rev.message, | 874 | self.assertEqual(rev.message, |
647 | 871 | "Import upstream version %s" % str(version.upstream_version)) | 875 | "Import upstream version %s" % str(version.upstream_version)) |
648 | @@ -887,13 +891,13 @@ | |||
649 | 887 | finally: | 891 | finally: |
650 | 888 | tf.close() | 892 | tf.close() |
651 | 889 | self.db1.import_upstream(basedir, "package", version.upstream_version, | 893 | self.db1.import_upstream(basedir, "package", version.upstream_version, |
653 | 890 | [], upstream_tarballs=[(os.path.abspath(tar_path), None, self.fake_md5_1)]) | 894 | {}, upstream_tarballs=[(os.path.abspath(tar_path), None, self.fake_md5_1)]) |
654 | 891 | tree = self.up_tree1 | 895 | tree = self.up_tree1 |
655 | 892 | branch = tree.branch | 896 | branch = tree.branch |
656 | 893 | rh = branch.revision_history() | 897 | rh = branch.revision_history() |
657 | 894 | self.assertEqual(len(rh), 1) | 898 | self.assertEqual(len(rh), 1) |
660 | 895 | self.assertEqual(self.db1.pristine_upstream_source.version_as_revision( | 899 | self.assertEqual(self.db1.pristine_upstream_source.version_as_revisions( |
661 | 896 | "package", version.upstream_version), rh[0]) | 900 | "package", version.upstream_version), {None: rh[0]}) |
662 | 897 | rev = branch.repository.get_revision(rh[0]) | 901 | rev = branch.repository.get_revision(rh[0]) |
663 | 898 | self.assertEqual(rev.message, | 902 | self.assertEqual(rev.message, |
664 | 899 | "Import upstream version %s" % str(version.upstream_version)) | 903 | "Import upstream version %s" % str(version.upstream_version)) |
665 | @@ -936,13 +940,13 @@ | |||
666 | 936 | finally: | 940 | finally: |
667 | 937 | f.close() | 941 | f.close() |
668 | 938 | self.db1.import_upstream(basedir, "package", version.upstream_version, | 942 | self.db1.import_upstream(basedir, "package", version.upstream_version, |
670 | 939 | [], upstream_tarballs=[(os.path.abspath(tar_path), None, self.fake_md5_1)]) | 943 | {}, upstream_tarballs=[(os.path.abspath(tar_path), None, self.fake_md5_1)]) |
671 | 940 | tree = self.up_tree1 | 944 | tree = self.up_tree1 |
672 | 941 | branch = tree.branch | 945 | branch = tree.branch |
673 | 942 | rh = branch.revision_history() | 946 | rh = branch.revision_history() |
674 | 943 | self.assertEqual(len(rh), 1) | 947 | self.assertEqual(len(rh), 1) |
677 | 944 | self.assertEqual(self.db1.pristine_upstream_source.version_as_revision( | 948 | self.assertEqual(self.db1.pristine_upstream_source.version_as_revisions( |
678 | 945 | "package", version.upstream_version), rh[0]) | 949 | "package", version.upstream_version), {None: rh[0]}) |
679 | 946 | rev = branch.repository.get_revision(rh[0]) | 950 | rev = branch.repository.get_revision(rh[0]) |
680 | 947 | self.assertEqual(rev.message, | 951 | self.assertEqual(rev.message, |
681 | 948 | "Import upstream version %s" % str(version.upstream_version)) | 952 | "Import upstream version %s" % str(version.upstream_version)) |
682 | @@ -1381,8 +1385,9 @@ | |||
683 | 1381 | self.assertEqual(self.db1.revid_of_version(version2), rh1[2]) | 1385 | self.assertEqual(self.db1.revid_of_version(version2), rh1[2]) |
684 | 1382 | self.assertEqual(self.db1.revid_of_version(version3), rh1[3]) | 1386 | self.assertEqual(self.db1.revid_of_version(version3), rh1[3]) |
685 | 1383 | self.assertEqual( | 1387 | self.assertEqual( |
688 | 1384 | self.db1.pristine_upstream_source.version_as_revision("package", version1.upstream_version), | 1388 | self.db1.pristine_upstream_source.version_as_revisions( |
689 | 1385 | up_rh1[0]) | 1389 | "package", version1.upstream_version), |
690 | 1390 | {None: up_rh1[0]}) | ||
691 | 1386 | self.tree1.lock_read() | 1391 | self.tree1.lock_read() |
692 | 1387 | self.addCleanup(self.tree1.unlock) | 1392 | self.addCleanup(self.tree1.unlock) |
693 | 1388 | self.assertFalse(self.db1.is_version_native(version1)) | 1393 | self.assertFalse(self.db1.is_version_native(version1)) |
694 | @@ -1434,11 +1439,13 @@ | |||
695 | 1434 | self.assertEqual(self.db1.revid_of_version(version2), rh1[2]) | 1439 | self.assertEqual(self.db1.revid_of_version(version2), rh1[2]) |
696 | 1435 | self.assertEqual(self.db1.revid_of_version(version3), rh1[3]) | 1440 | self.assertEqual(self.db1.revid_of_version(version3), rh1[3]) |
697 | 1436 | self.assertEqual( | 1441 | self.assertEqual( |
700 | 1437 | self.db1.pristine_upstream_source.version_as_revision("package", version1.upstream_version), | 1442 | self.db1.pristine_upstream_source.version_as_revisions("package", |
701 | 1438 | up_rh1[0]) | 1443 | version1.upstream_version), |
702 | 1444 | {None: up_rh1[0]}) | ||
703 | 1439 | self.assertEqual( | 1445 | self.assertEqual( |
706 | 1440 | self.db1.pristine_upstream_source.version_as_revision("package", version3.upstream_version), | 1446 | self.db1.pristine_upstream_source.version_as_revisions("package", |
707 | 1441 | up_rh1[1]) | 1447 | version3.upstream_version), |
708 | 1448 | {None: up_rh1[1]}) | ||
709 | 1442 | self.tree1.lock_read() | 1449 | self.tree1.lock_read() |
710 | 1443 | self.addCleanup(self.tree1.unlock) | 1450 | self.addCleanup(self.tree1.unlock) |
711 | 1444 | self.assertFalse(self.db1.is_version_native(version1)) | 1451 | self.assertFalse(self.db1.is_version_native(version1)) |
712 | @@ -1489,11 +1496,13 @@ | |||
713 | 1489 | self.assertEqual(self.db1.revid_of_version(version2), rh1[2]) | 1496 | self.assertEqual(self.db1.revid_of_version(version2), rh1[2]) |
714 | 1490 | self.assertEqual(self.db1.revid_of_version(version3), rh1[3]) | 1497 | self.assertEqual(self.db1.revid_of_version(version3), rh1[3]) |
715 | 1491 | self.assertEqual( | 1498 | self.assertEqual( |
718 | 1492 | self.db1.pristine_upstream_source.version_as_revision("package", version1.upstream_version), | 1499 | self.db1.pristine_upstream_source.version_as_revisions("package", |
719 | 1493 | up_rh1[0]) | 1500 | version1.upstream_version), |
720 | 1501 | { None: up_rh1[0] }) | ||
721 | 1494 | self.assertEqual( | 1502 | self.assertEqual( |
724 | 1495 | self.db1.pristine_upstream_source.version_as_revision("package", version3.upstream_version), | 1503 | self.db1.pristine_upstream_source.version_as_revisions("package", |
725 | 1496 | up_rh1[1]) | 1504 | version3.upstream_version), |
726 | 1505 | { None: up_rh1[1] }) | ||
727 | 1497 | self.tree1.lock_read() | 1506 | self.tree1.lock_read() |
728 | 1498 | self.addCleanup(self.tree1.unlock) | 1507 | self.addCleanup(self.tree1.unlock) |
729 | 1499 | self.assertFalse(self.db1.is_version_native(version1)) | 1508 | self.assertFalse(self.db1.is_version_native(version1)) |
730 | @@ -1604,7 +1613,7 @@ | |||
731 | 1604 | tf.close() | 1613 | tf.close() |
732 | 1605 | conflicts = db.merge_upstream([(tarball_filename, None)], "foo", "0.2", "0.1", | 1614 | conflicts = db.merge_upstream([(tarball_filename, None)], "foo", "0.2", "0.1", |
733 | 1606 | upstream_branch=upstream_tree.branch, | 1615 | upstream_branch=upstream_tree.branch, |
735 | 1607 | upstream_revision=upstream_rev) | 1616 | upstream_revisions={None: upstream_rev}) |
736 | 1608 | self.assertEqual(0, conflicts) | 1617 | self.assertEqual(0, conflicts) |
737 | 1609 | 1618 | ||
738 | 1610 | def test_merge_upstream_initial_with_removed_debian(self): | 1619 | def test_merge_upstream_initial_with_removed_debian(self): |
739 | @@ -1644,7 +1653,7 @@ | |||
740 | 1644 | tf.close() | 1653 | tf.close() |
741 | 1645 | conflicts = db.merge_upstream([(tarball_filename, None)], "foo", "0.2", "0.1", | 1654 | conflicts = db.merge_upstream([(tarball_filename, None)], "foo", "0.2", "0.1", |
742 | 1646 | upstream_branch=upstream_tree.branch, | 1655 | upstream_branch=upstream_tree.branch, |
744 | 1647 | upstream_revision=upstream_rev) | 1656 | upstream_revisions={None: upstream_rev}) |
745 | 1648 | # ./debian conflicts. | 1657 | # ./debian conflicts. |
746 | 1649 | self.assertEqual(3, conflicts) | 1658 | self.assertEqual(3, conflicts) |
747 | 1650 | 1659 | ||
748 | @@ -1686,7 +1695,7 @@ | |||
749 | 1686 | db.merge_upstream([(builder.tar_name(), None)], "package", str(version2), | 1695 | db.merge_upstream([(builder.tar_name(), None)], "package", str(version2), |
750 | 1687 | version1.upstream_version, | 1696 | version1.upstream_version, |
751 | 1688 | upstream_branch=upstream_tree.branch, | 1697 | upstream_branch=upstream_tree.branch, |
753 | 1689 | upstream_revision=upstream_rev) | 1698 | upstream_revisions={None: upstream_rev}) |
754 | 1690 | rh1 = tree.branch.revision_history() | 1699 | rh1 = tree.branch.revision_history() |
755 | 1691 | self.assertEqual(2, len(rh1)) | 1700 | self.assertEqual(2, len(rh1)) |
756 | 1692 | packaging_upstream_tip = tree.get_parent_ids()[1] | 1701 | packaging_upstream_tip = tree.get_parent_ids()[1] |
757 | @@ -1765,7 +1774,7 @@ | |||
758 | 1765 | version2.upstream_version, | 1774 | version2.upstream_version, |
759 | 1766 | version1.upstream_version, | 1775 | version1.upstream_version, |
760 | 1767 | upstream_branch=upstream_tree.branch, | 1776 | upstream_branch=upstream_tree.branch, |
762 | 1768 | upstream_revision=upstream_rev2) | 1777 | upstream_revisions={None: upstream_rev2}) |
763 | 1769 | self.assertEqual("a-id", tree.path2id("b")) | 1778 | self.assertEqual("a-id", tree.path2id("b")) |
764 | 1770 | 1779 | ||
765 | 1771 | def test_merge_upstream_rename_on_top(self): | 1780 | def test_merge_upstream_rename_on_top(self): |
766 | @@ -1802,7 +1811,7 @@ | |||
767 | 1802 | version2.upstream_version, | 1811 | version2.upstream_version, |
768 | 1803 | version1.upstream_version, | 1812 | version1.upstream_version, |
769 | 1804 | upstream_branch=upstream_tree.branch, | 1813 | upstream_branch=upstream_tree.branch, |
771 | 1805 | upstream_revision=upstream_rev2) | 1814 | upstream_revisions={None:upstream_rev2}) |
772 | 1806 | self.assertEqual("a-id", tree.path2id("b")) | 1815 | self.assertEqual("a-id", tree.path2id("b")) |
773 | 1807 | 1816 | ||
774 | 1808 | def test_merge_upstream_rename_in_packaging_branch(self): | 1817 | def test_merge_upstream_rename_in_packaging_branch(self): |
775 | 1809 | 1818 | ||
776 | === modified file 'tests/test_upstream.py' | |||
777 | --- tests/test_upstream.py 2011-09-09 13:20:42 +0000 | |||
778 | +++ tests/test_upstream.py 2011-09-27 00:50:26 +0000 | |||
779 | @@ -25,7 +25,6 @@ | |||
780 | 25 | from base64 import standard_b64encode | 25 | from base64 import standard_b64encode |
781 | 26 | 26 | ||
782 | 27 | import bz2 | 27 | import bz2 |
783 | 28 | import gzip | ||
784 | 29 | import os | 28 | import os |
785 | 30 | import tarfile | 29 | import tarfile |
786 | 31 | import zipfile | 30 | import zipfile |
787 | @@ -432,6 +431,20 @@ | |||
788 | 432 | self.tree.commit("msg") | 431 | self.tree.commit("msg") |
789 | 433 | self.assertEquals("2.1+bzr2", source.get_latest_version("foo", "1.0")) | 432 | self.assertEquals("2.1+bzr2", source.get_latest_version("foo", "1.0")) |
790 | 434 | 433 | ||
791 | 434 | def test_version_as_revisions(self): | ||
792 | 435 | revid1 = self.tree.commit("msg") | ||
793 | 436 | self.tree.branch.tags.set_tag("2.1", self.tree.branch.last_revision()) | ||
794 | 437 | config = DebBuildConfig( | ||
795 | 438 | [('user.conf', True), ('default.conf', False)], | ||
796 | 439 | branch=self.tree.branch) | ||
797 | 440 | source = UpstreamBranchSource(self.tree.branch, | ||
798 | 441 | {"2.1": self.tree.branch.last_revision()}, | ||
799 | 442 | config=config) | ||
800 | 443 | revid2 = self.tree.commit("msg") | ||
801 | 444 | self.assertEquals(revid2, | ||
802 | 445 | source.version_as_revision("foo", "2.1+bzr2")) | ||
803 | 446 | self.assertEquals({None: revid1}, source.version_as_revisions("foo", "2.1")) | ||
804 | 447 | |||
805 | 435 | def test_version_as_revision(self): | 448 | def test_version_as_revision(self): |
806 | 436 | revid1 = self.tree.commit("msg") | 449 | revid1 = self.tree.commit("msg") |
807 | 437 | self.tree.branch.tags.set_tag("2.1", self.tree.branch.last_revision()) | 450 | self.tree.branch.tags.set_tag("2.1", self.tree.branch.last_revision()) |
808 | @@ -699,14 +712,24 @@ | |||
809 | 699 | class TestUpstreamTagVersion(TestCase): | 712 | class TestUpstreamTagVersion(TestCase): |
810 | 700 | 713 | ||
811 | 701 | def test_simple_upstream(self): | 714 | def test_simple_upstream(self): |
813 | 702 | self.assertEqual('2.1', upstream_tag_version('upstream-2.1')) | 715 | self.assertEqual((None, '2.1'), upstream_tag_version('upstream-2.1')) |
814 | 703 | 716 | ||
815 | 704 | def test_distro_upstream(self): | 717 | def test_distro_upstream(self): |
817 | 705 | self.assertEqual('2.1', | 718 | self.assertEqual((None, '2.1'), |
818 | 706 | upstream_tag_version('upstream-debian-2.1')) | 719 | upstream_tag_version('upstream-debian-2.1')) |
819 | 707 | 720 | ||
820 | 708 | def test_git_upstream(self): | 721 | def test_git_upstream(self): |
822 | 709 | self.assertEqual('2.1', upstream_tag_version('upstream/2.1')) | 722 | self.assertEqual((None, '2.1'), upstream_tag_version('upstream/2.1')) |
823 | 723 | |||
824 | 724 | def test_git_upstream_component(self): | ||
825 | 725 | self.assertEqual(("lib", '2.1'), upstream_tag_version('upstream/2.1/lib')) | ||
826 | 726 | |||
827 | 727 | def test_simple_upstream_component(self): | ||
828 | 728 | self.assertEqual(("lib", '2.1'), upstream_tag_version('upstream-2.1/lib')) | ||
829 | 729 | |||
830 | 730 | def test_distro_upstream_component(self): | ||
831 | 731 | self.assertEqual(("lib", '2.1'), | ||
832 | 732 | upstream_tag_version('upstream-debian-2.1/lib')) | ||
833 | 710 | 733 | ||
834 | 711 | 734 | ||
835 | 712 | class PristineTarSourceTests(TestCaseWithTransport): | 735 | class PristineTarSourceTests(TestCaseWithTransport): |
836 | @@ -766,14 +789,31 @@ | |||
837 | 766 | rev.properties["deb-pristine-delta"] = standard_b64encode("bla") | 789 | rev.properties["deb-pristine-delta"] = standard_b64encode("bla") |
838 | 767 | self.assertEquals("bla", self.source.pristine_tar_delta(rev)) | 790 | self.assertEquals("bla", self.source.pristine_tar_delta(rev)) |
839 | 768 | 791 | ||
841 | 769 | def test_version_as_revision_missing(self): | 792 | def test_version_as_revisions_missing(self): |
842 | 770 | self.assertRaises(PackageVersionNotPresent, | 793 | self.assertRaises(PackageVersionNotPresent, |
849 | 771 | self.source.version_as_revision, None, "1.2") | 794 | self.source.version_as_revisions, None, "1.2") |
850 | 772 | 795 | ||
851 | 773 | def test_version_as_revision(self): | 796 | def test_version_as_revisions_single(self): |
852 | 774 | revid1 = self.tree.commit("msg") | 797 | revid1 = self.tree.commit("msg") |
853 | 775 | self.tree.branch.tags.set_tag("upstream-2.1", revid1) | 798 | self.tree.branch.tags.set_tag("upstream-2.1", revid1) |
854 | 776 | self.assertEquals(revid1, self.source.version_as_revision(None, "2.1")) | 799 | self.assertEquals({None: revid1}, |
855 | 800 | self.source.version_as_revisions(None, "2.1")) | ||
856 | 801 | |||
857 | 802 | def test_version_component_as_revision(self): | ||
858 | 803 | revid1 = self.tree.commit("msg") | ||
859 | 804 | self.tree.branch.tags.set_tag("upstream-2.1/lib", revid1) | ||
860 | 805 | self.assertEquals(revid1, | ||
861 | 806 | self.source.version_component_as_revision(None, "2.1", "lib")) | ||
862 | 807 | |||
863 | 808 | def test_version_as_revisions(self): | ||
864 | 809 | revid1 = self.tree.commit("msg") | ||
865 | 810 | revid2 = self.tree.commit("msg") | ||
866 | 811 | self.tree.branch.tags.set_tag("upstream-2.1", revid1) | ||
867 | 812 | self.tree.branch.tags.set_tag("upstream-2.1/lib", revid2) | ||
868 | 813 | self.assertEquals({ None: revid1, "lib": revid2 }, | ||
869 | 814 | self.source.version_as_revisions(None, "2.1", [ | ||
870 | 815 | ("upstream_2.1.orig.tar.gz", None, "somemd5sum"), | ||
871 | 816 | ("upstream_2.1.orig-lib.tar.gz", "lib", "othermd5sum")])) | ||
872 | 777 | 817 | ||
873 | 778 | 818 | ||
874 | 779 | class TarfileSourceTests(TestCaseWithTransport): | 819 | class TarfileSourceTests(TestCaseWithTransport): |
875 | 780 | 820 | ||
876 | === modified file 'upstream/__init__.py' | |||
877 | --- upstream/__init__.py 2011-09-07 20:11:50 +0000 | |||
878 | +++ upstream/__init__.py 2011-09-27 00:50:26 +0000 | |||
879 | @@ -75,15 +75,16 @@ | |||
880 | 75 | """ | 75 | """ |
881 | 76 | raise NotImplementedError(self.get_latest_version) | 76 | raise NotImplementedError(self.get_latest_version) |
882 | 77 | 77 | ||
885 | 78 | def version_as_revision(self, package, version): | 78 | def version_as_revisions(self, package, version, tarballs=None): |
886 | 79 | """Lookup the revision id for a particular version. | 79 | """Lookup the revision ids for a particular version. |
887 | 80 | 80 | ||
888 | 81 | :param package: Package name | 81 | :param package: Package name |
890 | 82 | :package version: Version string | 82 | :param version: Version string |
891 | 83 | :raise PackageVersionNotPresent: When the specified version was not | 83 | :raise PackageVersionNotPresent: When the specified version was not |
892 | 84 | found | 84 | found |
893 | 85 | :return: dictionary mapping component names to revision ids | ||
894 | 85 | """ | 86 | """ |
896 | 86 | raise NotImplementedError(self.version_as_revision) | 87 | raise NotImplementedError(self.version_as_revisions) |
897 | 87 | 88 | ||
898 | 88 | def has_version(self, package, version, md5=None): | 89 | def has_version(self, package, version, md5=None): |
899 | 89 | """Check whether this upstream source contains a particular package. | 90 | """Check whether this upstream source contains a particular package. |
900 | @@ -94,12 +95,14 @@ | |||
901 | 94 | """ | 95 | """ |
902 | 95 | raise NotImplementedError(self.has_version) | 96 | raise NotImplementedError(self.has_version) |
903 | 96 | 97 | ||
905 | 97 | def fetch_tarballs(self, package, version, target_dir): | 98 | def fetch_tarballs(self, package, version, target_dir, components=None): |
906 | 98 | """Fetch the source tarball for a particular version. | 99 | """Fetch the source tarball for a particular version. |
907 | 99 | 100 | ||
908 | 100 | :param package: Name of the package | 101 | :param package: Name of the package |
909 | 101 | :param version: Version string of the version to fetch | 102 | :param version: Version string of the version to fetch |
910 | 102 | :param target_dir: Directory in which to store the tarball | 103 | :param target_dir: Directory in which to store the tarball |
911 | 104 | :param components: List of component names to fetch; may be None, | ||
912 | 105 | in which case the backend will have to find out. | ||
913 | 103 | :return: Paths of the fetched tarballs | 106 | :return: Paths of the fetched tarballs |
914 | 104 | """ | 107 | """ |
915 | 105 | raise NotImplementedError(self.fetch_tarballs) | 108 | raise NotImplementedError(self.fetch_tarballs) |
916 | @@ -113,7 +116,7 @@ | |||
917 | 113 | """Upstream source that uses apt-source.""" | 116 | """Upstream source that uses apt-source.""" |
918 | 114 | 117 | ||
919 | 115 | def fetch_tarballs(self, package, upstream_version, target_dir, | 118 | def fetch_tarballs(self, package, upstream_version, target_dir, |
921 | 116 | _apt_pkg=None): | 119 | _apt_pkg=None, components=None): |
922 | 117 | if _apt_pkg is None: | 120 | if _apt_pkg is None: |
923 | 118 | import apt_pkg | 121 | import apt_pkg |
924 | 119 | else: | 122 | else: |
925 | @@ -197,7 +200,7 @@ | |||
926 | 197 | note("get-orig-source did not create file with prefix %s", prefix) | 200 | note("get-orig-source did not create file with prefix %s", prefix) |
927 | 198 | return None | 201 | return None |
928 | 199 | 202 | ||
930 | 200 | def fetch_tarballs(self, package, version, target_dir): | 203 | def fetch_tarballs(self, package, version, target_dir, components=None): |
931 | 201 | if self.larstiq: | 204 | if self.larstiq: |
932 | 202 | rules_name = 'rules' | 205 | rules_name = 'rules' |
933 | 203 | else: | 206 | else: |
934 | @@ -279,7 +282,7 @@ | |||
935 | 279 | os.unlink(tempfilename) | 282 | os.unlink(tempfilename) |
936 | 280 | return self._xml_report_extract_upstream_version(stdout) | 283 | return self._xml_report_extract_upstream_version(stdout) |
937 | 281 | 284 | ||
939 | 282 | def fetch_tarballs(self, package, version, target_dir): | 285 | def fetch_tarballs(self, package, version, target_dir, components=None): |
940 | 283 | note("Using uscan to look for the upstream tarball.") | 286 | note("Using uscan to look for the upstream tarball.") |
941 | 284 | try: | 287 | try: |
942 | 285 | tempfilename = self._export_watchfile() | 288 | tempfilename = self._export_watchfile() |
943 | @@ -326,7 +329,7 @@ | |||
944 | 326 | finally: | 329 | finally: |
945 | 327 | shutil.rmtree(tmpdir) | 330 | shutil.rmtree(tmpdir) |
946 | 328 | 331 | ||
948 | 329 | def fetch_tarballs(self, package, version, target_dir): | 332 | def fetch_tarballs(self, package, version, target_dir, components=None): |
949 | 330 | note("Using the current branch without the 'debian' directory " | 333 | note("Using the current branch without the 'debian' directory " |
950 | 331 | "to create the tarball") | 334 | "to create the tarball") |
951 | 332 | tarball_path = self._tarball_path(package, version, None, target_dir) | 335 | tarball_path = self._tarball_path(package, version, None, target_dir) |
952 | @@ -346,10 +349,10 @@ | |||
953 | 346 | def __repr__(self): | 349 | def __repr__(self): |
954 | 347 | return "%s(%r)" % (self.__class__.__name__, self._sources) | 350 | return "%s(%r)" % (self.__class__.__name__, self._sources) |
955 | 348 | 351 | ||
957 | 349 | def fetch_tarballs(self, package, version, target_dir): | 352 | def fetch_tarballs(self, package, version, target_dir, components=None): |
958 | 350 | for source in self._sources: | 353 | for source in self._sources: |
959 | 351 | try: | 354 | try: |
961 | 352 | paths = source.fetch_tarballs(package, version, target_dir) | 355 | paths = source.fetch_tarballs(package, version, target_dir, components) |
962 | 353 | except PackageVersionNotPresent: | 356 | except PackageVersionNotPresent: |
963 | 354 | pass | 357 | pass |
964 | 355 | else: | 358 | else: |
965 | @@ -496,7 +499,7 @@ | |||
966 | 496 | self.path = path | 499 | self.path = path |
967 | 497 | self.version = version | 500 | self.version = version |
968 | 498 | 501 | ||
970 | 499 | def fetch_tarballs(self, package, version, target_dir): | 502 | def fetch_tarballs(self, package, version, target_dir, components=None): |
971 | 500 | if version != self.version: | 503 | if version != self.version: |
972 | 501 | raise PackageVersionNotPresent(package, version, self) | 504 | raise PackageVersionNotPresent(package, version, self) |
973 | 502 | dest_name = new_tarball_name(package, version, self.path) | 505 | dest_name = new_tarball_name(package, version, self.path) |
974 | @@ -541,7 +544,7 @@ | |||
975 | 541 | else: | 544 | else: |
976 | 542 | self.project = project | 545 | self.project = project |
977 | 543 | 546 | ||
979 | 544 | def fetch_tarballs(self, package, version, target_dir): | 547 | def fetch_tarballs(self, package, version, target_dir, components=None): |
980 | 545 | release = self.project.getRelease(version=version) | 548 | release = self.project.getRelease(version=version) |
981 | 546 | if release is None: | 549 | if release is None: |
982 | 547 | raise PackageVersionNotPresent(package, version, self) | 550 | raise PackageVersionNotPresent(package, version, self) |
983 | 548 | 551 | ||
984 | === modified file 'upstream/branch.py' | |||
985 | --- upstream/branch.py 2011-06-26 21:02:48 +0000 | |||
986 | +++ upstream/branch.py 2011-09-27 00:50:26 +0000 | |||
987 | @@ -28,7 +28,10 @@ | |||
988 | 28 | from bzrlib.revisionspec import RevisionSpec | 28 | from bzrlib.revisionspec import RevisionSpec |
989 | 29 | from bzrlib.trace import note | 29 | from bzrlib.trace import note |
990 | 30 | 30 | ||
992 | 31 | from bzrlib.plugins.builddeb.errors import PackageVersionNotPresent | 31 | from bzrlib.plugins.builddeb.errors import ( |
993 | 32 | MultipleUpstreamTarballsNotSupported, | ||
994 | 33 | PackageVersionNotPresent, | ||
995 | 34 | ) | ||
996 | 32 | from bzrlib.plugins.builddeb.upstream import UpstreamSource | 35 | from bzrlib.plugins.builddeb.upstream import UpstreamSource |
997 | 33 | from bzrlib.plugins.builddeb.util import ( | 36 | from bzrlib.plugins.builddeb.util import ( |
998 | 34 | export, | 37 | export, |
999 | @@ -228,7 +231,7 @@ | |||
1000 | 228 | else: | 231 | else: |
1001 | 229 | self.upstream_revision_map = upstream_revision_map | 232 | self.upstream_revision_map = upstream_revision_map |
1002 | 230 | 233 | ||
1004 | 231 | def version_as_revision(self, package, version): | 234 | def version_as_revision(self, package, version, tarballs=None): |
1005 | 232 | assert isinstance(version, str) | 235 | assert isinstance(version, str) |
1006 | 233 | if version in self.upstream_revision_map: | 236 | if version in self.upstream_revision_map: |
1007 | 234 | revspec = self.upstream_revision_map[version] | 237 | revspec = self.upstream_revision_map[version] |
1008 | @@ -242,6 +245,13 @@ | |||
1009 | 242 | raise PackageVersionNotPresent(package, version, self) | 245 | raise PackageVersionNotPresent(package, version, self) |
1010 | 243 | raise PackageVersionNotPresent(package, version, self) | 246 | raise PackageVersionNotPresent(package, version, self) |
1011 | 244 | 247 | ||
1012 | 248 | def version_as_revisions(self, package, version, tarballs=None): | ||
1013 | 249 | # FIXME: Support multiple upstream locations if there are multiple | ||
1014 | 250 | # components | ||
1015 | 251 | if tarballs is not None and tarballs.keys() != [None]: | ||
1016 | 252 | raise MultipleUpstreamTarballsNotSupported() | ||
1017 | 253 | return { None: self.version_as_revision(package, version, tarballs) } | ||
1018 | 254 | |||
1019 | 245 | def get_latest_version(self, package, current_version): | 255 | def get_latest_version(self, package, current_version): |
1020 | 246 | return self.get_version(package, current_version, | 256 | return self.get_version(package, current_version, |
1021 | 247 | self.upstream_branch.last_revision()) | 257 | self.upstream_branch.last_revision()) |
1022 | @@ -254,7 +264,7 @@ | |||
1023 | 254 | finally: | 264 | finally: |
1024 | 255 | self.upstream_branch.unlock() | 265 | self.upstream_branch.unlock() |
1025 | 256 | 266 | ||
1027 | 257 | def fetch_tarballs(self, package, version, target_dir): | 267 | def fetch_tarballs(self, package, version, target_dir, components=None): |
1028 | 258 | self.upstream_branch.lock_read() | 268 | self.upstream_branch.lock_read() |
1029 | 259 | try: | 269 | try: |
1030 | 260 | revid = self.version_as_revision(package, version) | 270 | revid = self.version_as_revision(package, version) |
1031 | 261 | 271 | ||
1032 | === modified file 'upstream/pristinetar.py' | |||
1033 | --- upstream/pristinetar.py 2011-09-09 13:20:42 +0000 | |||
1034 | +++ upstream/pristinetar.py 2011-09-27 00:50:26 +0000 | |||
1035 | @@ -39,13 +39,17 @@ | |||
1036 | 39 | subprocess_setup, | 39 | subprocess_setup, |
1037 | 40 | ) | 40 | ) |
1038 | 41 | 41 | ||
1040 | 42 | from bzrlib import osutils | 42 | from bzrlib import ( |
1041 | 43 | osutils, | ||
1042 | 44 | revision as _mod_revision, | ||
1043 | 45 | ) | ||
1044 | 43 | from bzrlib.errors import ( | 46 | from bzrlib.errors import ( |
1045 | 44 | BzrError, | 47 | BzrError, |
1046 | 45 | NoSuchRevision, | 48 | NoSuchRevision, |
1047 | 46 | NoSuchTag, | 49 | NoSuchTag, |
1048 | 47 | ) | 50 | ) |
1049 | 48 | from bzrlib.trace import ( | 51 | from bzrlib.trace import ( |
1050 | 52 | mutter, | ||
1051 | 49 | note, | 53 | note, |
1052 | 50 | warning, | 54 | warning, |
1053 | 51 | ) | 55 | ) |
1054 | @@ -156,42 +160,35 @@ | |||
1055 | 156 | self.branch.tags.set_tag(tag_name, revid) | 160 | self.branch.tags.set_tag(tag_name, revid) |
1056 | 157 | return tag_name, revid | 161 | return tag_name, revid |
1057 | 158 | 162 | ||
1058 | 159 | def import_tarballs(self, package, version, tree, parent_ids, tarballs, | ||
1059 | 160 | timestamp=None, author=None): | ||
1060 | 161 | """Import the upstream tarballs. | ||
1061 | 162 | |||
1062 | 163 | :param package: Package name | ||
1063 | 164 | :param version: Package version | ||
1064 | 165 | :param path: Path with tree to import | ||
1065 | 166 | :param parent_ids: Parent revisions | ||
1066 | 167 | :param tarballs: List of (path, component, md5) | ||
1067 | 168 | :param timestamp: Optional timestamp for new commits | ||
1068 | 169 | :param author: Optional author for new commits | ||
1069 | 170 | :return: List of tuples with (component, tag, revid) | ||
1070 | 171 | """ | ||
1071 | 172 | ret = [] | ||
1072 | 173 | for (tarball, component, md5) in tarballs: | ||
1073 | 174 | (tag, revid) = self.import_component_tarball( | ||
1074 | 175 | package, version, tree, parent_ids, component, | ||
1075 | 176 | md5, tarball, author=author, timestamp=timestamp) | ||
1076 | 177 | ret.append((component, tag, revid)) | ||
1077 | 178 | return ret | ||
1078 | 179 | |||
1079 | 180 | def import_component_tarball(self, package, version, tree, parent_ids, | 163 | def import_component_tarball(self, package, version, tree, parent_ids, |
1081 | 181 | component=None, md5=None, tarball=None, author=None, timestamp=None): | 164 | component=None, md5=None, tarball=None, author=None, timestamp=None, |
1082 | 165 | subdir=None, exclude=None): | ||
1083 | 182 | """Import a tarball. | 166 | """Import a tarball. |
1084 | 183 | 167 | ||
1085 | 184 | :param package: Package name | 168 | :param package: Package name |
1086 | 185 | :param version: Upstream version | 169 | :param version: Upstream version |
1087 | 170 | :param parent_ids: Dictionary mapping component names to revision ids | ||
1088 | 186 | :param component: Component name (None for base) | 171 | :param component: Component name (None for base) |
1089 | 172 | :param exclude: Exclude directories | ||
1090 | 187 | """ | 173 | """ |
1094 | 188 | if component is not None: | 174 | if exclude is None: |
1095 | 189 | raise BzrError("Importing non-base tarballs not yet supported") | 175 | exclude = [] |
1096 | 190 | tree.set_parent_ids(parent_ids) | 176 | def include_change(c): |
1097 | 177 | if not exclude: | ||
1098 | 178 | return True | ||
1099 | 179 | path = c[1][1] | ||
1100 | 180 | if path is None: | ||
1101 | 181 | return True | ||
1102 | 182 | for e in exclude: | ||
1103 | 183 | if path == e or path.startswith(e+"/"): | ||
1104 | 184 | return False | ||
1105 | 185 | else: | ||
1106 | 186 | return True | ||
1107 | 191 | revprops = {} | 187 | revprops = {} |
1108 | 192 | if md5 is not None: | 188 | if md5 is not None: |
1109 | 193 | revprops["deb-md5"] = md5 | 189 | revprops["deb-md5"] = md5 |
1111 | 194 | delta = self.make_pristine_tar_delta(tree, tarball) | 190 | delta = self.make_pristine_tar_delta(tree, tarball, subdir=subdir, |
1112 | 191 | exclude=exclude) | ||
1113 | 195 | uuencoded = standard_b64encode(delta) | 192 | uuencoded = standard_b64encode(delta) |
1114 | 196 | if tarball.endswith(".tar.bz2"): | 193 | if tarball.endswith(".tar.bz2"): |
1115 | 197 | revprops["deb-pristine-delta-bz2"] = uuencoded | 194 | revprops["deb-pristine-delta-bz2"] = uuencoded |
1116 | @@ -208,9 +205,32 @@ | |||
1117 | 208 | message = "Import upstream version %s" % (version,) | 205 | message = "Import upstream version %s" % (version,) |
1118 | 209 | if component is not None: | 206 | if component is not None: |
1119 | 210 | message += ", component %s" % component | 207 | message += ", component %s" % component |
1123 | 211 | revid = tree.commit(message, revprops=revprops, timestamp=timestamp, | 208 | if len(parent_ids) == 0: |
1124 | 212 | timezone=timezone) | 209 | base_revid = _mod_revision.NULL_REVISION |
1125 | 213 | tag_name, _ = self.tag_version(version, revid=revid) | 210 | else: |
1126 | 211 | base_revid = parent_ids[0] | ||
1127 | 212 | basis_tree = tree.branch.repository.revision_tree(base_revid) | ||
1128 | 213 | tree.lock_write() | ||
1129 | 214 | try: | ||
1130 | 215 | builder = tree.branch.get_commit_builder(parents=parent_ids, | ||
1131 | 216 | revprops=revprops, timestamp=timestamp, timezone=timezone) | ||
1132 | 217 | builder.will_record_deletes() | ||
1133 | 218 | try: | ||
1134 | 219 | changes = [c for c in tree.iter_changes(basis_tree) if | ||
1135 | 220 | include_change(c)] | ||
1136 | 221 | list(builder.record_iter_changes(tree, base_revid, changes)) | ||
1137 | 222 | builder.finish_inventory() | ||
1138 | 223 | except: | ||
1139 | 224 | builder.abort() | ||
1140 | 225 | raise | ||
1141 | 226 | revid = builder.commit(message) | ||
1142 | 227 | tag_name, _ = self.tag_version(version, revid=revid, component=component) | ||
1143 | 228 | tree.update_basis_by_delta(revid, builder.get_basis_delta()) | ||
1144 | 229 | finally: | ||
1145 | 230 | tree.unlock() | ||
1146 | 231 | mutter( | ||
1147 | 232 | 'imported %s version %s component %r as revid %s, tagged %s', | ||
1148 | 233 | package, version, component, revid, tag_name) | ||
1149 | 214 | return tag_name, revid | 234 | return tag_name, revid |
1150 | 215 | 235 | ||
1151 | 216 | def fetch_component_tarball(self, package, version, component, target_dir): | 236 | def fetch_component_tarball(self, package, version, component, target_dir): |
1152 | @@ -219,13 +239,13 @@ | |||
1153 | 219 | rev = self.branch.repository.get_revision(revid) | 239 | rev = self.branch.repository.get_revision(revid) |
1154 | 220 | except NoSuchRevision: | 240 | except NoSuchRevision: |
1155 | 221 | raise PackageVersionNotPresent(package, version, self) | 241 | raise PackageVersionNotPresent(package, version, self) |
1156 | 222 | note("Using pristine-tar to reconstruct the needed tarball.") | ||
1157 | 223 | if self.has_pristine_tar_delta(rev): | 242 | if self.has_pristine_tar_delta(rev): |
1158 | 224 | format = self.pristine_tar_format(rev) | 243 | format = self.pristine_tar_format(rev) |
1159 | 225 | else: | 244 | else: |
1160 | 226 | format = 'gz' | 245 | format = 'gz' |
1161 | 227 | target_filename = self._tarball_path(package, version, component, | 246 | target_filename = self._tarball_path(package, version, component, |
1162 | 228 | target_dir, format=format) | 247 | target_dir, format=format) |
1163 | 248 | note("Using pristine-tar to reconstruct %s.", os.path.basename(target_filename)) | ||
1164 | 229 | try: | 249 | try: |
1165 | 230 | self.reconstruct_pristine_tar(revid, package, version, target_filename) | 250 | self.reconstruct_pristine_tar(revid, package, version, target_filename) |
1166 | 231 | except PristineTarError: | 251 | except PristineTarError: |
1167 | @@ -234,8 +254,15 @@ | |||
1168 | 234 | raise PackageVersionNotPresent(package, version, self) | 254 | raise PackageVersionNotPresent(package, version, self) |
1169 | 235 | return target_filename | 255 | return target_filename |
1170 | 236 | 256 | ||
1173 | 237 | def fetch_tarballs(self, package, version, target_dir): | 257 | def fetch_tarballs(self, package, version, target_dir, components=None): |
1174 | 238 | return [self.fetch_component_tarball(package, version, None, target_dir)] | 258 | if components is None: |
1175 | 259 | # Scan tags for components | ||
1176 | 260 | try: | ||
1177 | 261 | components = self._components_by_version()[version].keys() | ||
1178 | 262 | except KeyError: | ||
1179 | 263 | raise PackageVersionNotPresent(package, version, self) | ||
1180 | 264 | return [self.fetch_component_tarball(package, version, component, target_dir) | ||
1181 | 265 | for component in components] | ||
1182 | 239 | 266 | ||
1183 | 240 | def _has_revision(self, revid, md5=None): | 267 | def _has_revision(self, revid, md5=None): |
1184 | 241 | self.branch.lock_read() | 268 | self.branch.lock_read() |
1185 | @@ -256,14 +283,16 @@ | |||
1186 | 256 | "revision %s", revid) | 283 | "revision %s", revid) |
1187 | 257 | return True | 284 | return True |
1188 | 258 | 285 | ||
1190 | 259 | def version_as_revision(self, package, version, tarballs=None): | 286 | def version_as_revisions(self, package, version, tarballs=None): |
1191 | 260 | if tarballs is None: | 287 | if tarballs is None: |
1198 | 261 | return self.version_component_as_revision(package, version, component=None) | 288 | # FIXME: What if there are multiple tarballs? |
1199 | 262 | elif len(tarballs) > 1: | 289 | return { |
1200 | 263 | raise MultipleUpstreamTarballsNotSupported() | 290 | None: self.version_component_as_revision(package, version, component=None) } |
1201 | 264 | else: | 291 | ret = {} |
1202 | 265 | return self.version_component_as_revision(package, version, tarballs[0][1], | 292 | for (tarball, component, md5) in tarballs: |
1203 | 266 | tarballs[0][2]) | 293 | ret[component] = self.version_component_as_revision( |
1204 | 294 | package, version, component, md5) | ||
1205 | 295 | return ret | ||
1206 | 267 | 296 | ||
1207 | 268 | def version_component_as_revision(self, package, version, component, md5=None): | 297 | def version_component_as_revision(self, package, version, component, md5=None): |
1208 | 269 | assert isinstance(version, str) | 298 | assert isinstance(version, str) |
1209 | @@ -359,7 +388,7 @@ | |||
1210 | 359 | finally: | 388 | finally: |
1211 | 360 | shutil.rmtree(tmpdir) | 389 | shutil.rmtree(tmpdir) |
1212 | 361 | 390 | ||
1214 | 362 | def make_pristine_tar_delta(self, tree, tarball_path): | 391 | def make_pristine_tar_delta(self, tree, tarball_path, subdir=None, exclude=None): |
1215 | 363 | tmpdir = tempfile.mkdtemp(prefix="builddeb-pristine-") | 392 | tmpdir = tempfile.mkdtemp(prefix="builddeb-pristine-") |
1216 | 364 | try: | 393 | try: |
1217 | 365 | dest = os.path.join(tmpdir, "orig") | 394 | dest = os.path.join(tmpdir, "orig") |
1218 | @@ -367,22 +396,29 @@ | |||
1219 | 367 | try: | 396 | try: |
1220 | 368 | for (dp, ie) in tree.inventory.iter_entries(): | 397 | for (dp, ie) in tree.inventory.iter_entries(): |
1221 | 369 | ie._read_tree_state(dp, tree) | 398 | ie._read_tree_state(dp, tree) |
1223 | 370 | export(tree, dest, format='dir') | 399 | export(tree, dest, format='dir', subdir=subdir) |
1224 | 371 | finally: | 400 | finally: |
1225 | 372 | tree.unlock() | 401 | tree.unlock() |
1226 | 373 | return make_pristine_tar_delta(dest, tarball_path) | 402 | return make_pristine_tar_delta(dest, tarball_path) |
1227 | 374 | finally: | 403 | finally: |
1228 | 375 | shutil.rmtree(tmpdir) | 404 | shutil.rmtree(tmpdir) |
1229 | 376 | 405 | ||
1230 | 406 | def _components_by_version(self): | ||
1231 | 407 | ret = {} | ||
1232 | 408 | for tag_name, tag_revid in self.branch.tags.get_tag_dict().iteritems(): | ||
1233 | 409 | if not is_upstream_tag(tag_name): | ||
1234 | 410 | continue | ||
1235 | 411 | (component, version) = upstream_tag_version(tag_name) | ||
1236 | 412 | ret.setdefault(version, {})[component] = tag_revid | ||
1237 | 413 | return ret | ||
1238 | 414 | |||
1239 | 377 | def iter_versions(self): | 415 | def iter_versions(self): |
1240 | 378 | """Iterate over all upstream versions. | 416 | """Iterate over all upstream versions. |
1241 | 379 | 417 | ||
1242 | 380 | :return: Iterator over (tag_name, version, revid) tuples | 418 | :return: Iterator over (tag_name, version, revid) tuples |
1243 | 381 | """ | 419 | """ |
1248 | 382 | for tag_name, tag_revid in self.branch.tags.get_tag_dict().iteritems(): | 420 | ret = self._components_by_version() |
1249 | 383 | if not is_upstream_tag(tag_name): | 421 | return ret.iteritems() |
1246 | 384 | continue | ||
1247 | 385 | yield (tag_name, upstream_tag_version(tag_name), tag_revid) | ||
1250 | 386 | 422 | ||
1251 | 387 | 423 | ||
1252 | 388 | def is_upstream_tag(tag): | 424 | def is_upstream_tag(tag): |
1253 | @@ -398,7 +434,7 @@ | |||
1254 | 398 | """Return the upstream version portion of an upstream tag name. | 434 | """Return the upstream version portion of an upstream tag name. |
1255 | 399 | 435 | ||
1256 | 400 | :param tag: The string name of the tag. | 436 | :param tag: The string name of the tag. |
1258 | 401 | :return: The version portion of the tag. | 437 | :return: tuple with version portion of the tag and component name |
1259 | 402 | """ | 438 | """ |
1260 | 403 | assert is_upstream_tag(tag), "Not an upstream tag: %s" % tag | 439 | assert is_upstream_tag(tag), "Not an upstream tag: %s" % tag |
1261 | 404 | if tag.startswith('upstream/'): | 440 | if tag.startswith('upstream/'): |
1262 | @@ -409,4 +445,9 @@ | |||
1263 | 409 | tag = tag[len('debian-'):] | 445 | tag = tag[len('debian-'):] |
1264 | 410 | elif tag.startswith('ubuntu-'): | 446 | elif tag.startswith('ubuntu-'): |
1265 | 411 | tag = tag[len('ubuntu-'):] | 447 | tag = tag[len('ubuntu-'):] |
1267 | 412 | return tag | 448 | if not '/' in tag: |
1268 | 449 | return (None, tag) | ||
1269 | 450 | (version, component) = tag.rsplit('/', 1) | ||
1270 | 451 | if component == "": | ||
1271 | 452 | component = None | ||
1272 | 453 | return (component, version) |