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

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

Description of the change

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

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

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'cmds.py'
--- cmds.py 2011-09-09 13:20:42 +0000
+++ cmds.py 2011-09-26 22:30:28 +0000
@@ -556,7 +556,7 @@
556 'entry yourself, review the merge, and then commit.')556 'entry yourself, review the merge, and then commit.')
557557
558 def _do_merge(self, tree, tarball_filenames, package, version,558 def _do_merge(self, tree, tarball_filenames, package, version,
559 current_version, upstream_branch, upstream_revision, merge_type,559 current_version, upstream_branch, upstream_revisions, merge_type,
560 force):560 force):
561 db = DistributionBranch(tree.branch, tree.branch, tree=tree)561 db = DistributionBranch(tree.branch, tree.branch, tree=tree)
562 dbs = DistributionBranchSet()562 dbs = DistributionBranchSet()
@@ -565,7 +565,7 @@
565 in tarball_filenames]565 in tarball_filenames]
566 conflicts = db.merge_upstream(tarballs, package, version,566 conflicts = db.merge_upstream(tarballs, package, version,
567 current_version, upstream_branch=upstream_branch,567 current_version, upstream_branch=upstream_branch,
568 upstream_revision=upstream_revision,568 upstream_revisions=upstream_revisions,
569 merge_type=merge_type, force=force)569 merge_type=merge_type, force=force)
570 return conflicts570 return conflicts
571571
@@ -712,15 +712,15 @@
712 raise BzrCommandError("merge-upstream takes only a "712 raise BzrCommandError("merge-upstream takes only a "
713 "single --revision")713 "single --revision")
714 upstream_revspec = revision[0]714 upstream_revspec = revision[0]
715 upstream_revision = upstream_revspec.as_revision_id(715 upstream_revisions = { None: upstream_revspec.as_revision_id(
716 upstream_branch)716 upstream_branch) }
717 else:717 else:
718 upstream_revision = None718 upstream_revisions = None
719719
720 if version is None and upstream_revision is not None:720 if version is None and upstream_revisions is not None:
721 # Look up the version from the upstream revision721 # Look up the version from the upstream revision
722 version = upstream_branch_source.get_version(package,722 version = upstream_branch_source.get_version(package,
723 current_version, upstream_revision)723 current_version, upstream_revisions)
724 elif version is None and primary_upstream_source is not None:724 elif version is None and primary_upstream_source is not None:
725 version = primary_upstream_source.get_latest_version(725 version = primary_upstream_source.get_latest_version(
726 package, current_version)726 package, current_version)
@@ -735,9 +735,9 @@
735 assert isinstance(version, str)735 assert isinstance(version, str)
736 note("Using version string %s." % (version))736 note("Using version string %s." % (version))
737 # Look up the revision id from the version string737 # Look up the revision id from the version string
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:
739 try:739 try:
740 upstream_revision = upstream_branch_source.version_as_revision(740 upstream_revisions = upstream_branch_source.version_as_revisions(
741 package, version)741 package, version)
742 except PackageVersionNotPresent:742 except PackageVersionNotPresent:
743 raise BzrCommandError(743 raise BzrCommandError(
@@ -753,10 +753,10 @@
753 v3 = (source_format in [753 v3 = (source_format in [
754 FORMAT_3_0_QUILT, FORMAT_3_0_NATIVE])754 FORMAT_3_0_QUILT, FORMAT_3_0_NATIVE])
755 tarball_filenames = self._get_tarballs(config, tree, package,755 tarball_filenames = self._get_tarballs(config, tree, package,
756 version, upstream_branch, upstream_revision, v3,756 version, upstream_branch, upstream_revisions, v3,
757 locations)757 locations)
758 conflicts = self._do_merge(tree, tarball_filenames, package,758 conflicts = self._do_merge(tree, tarball_filenames, package,
759 version, current_version, upstream_branch, upstream_revision,759 version, current_version, upstream_branch, upstream_revisions,
760 merge_type, force)760 merge_type, force)
761 if (current_version is not None and761 if (current_version is not None and
762 Version(current_version) >= Version(version)):762 Version(current_version) >= Version(version)):
@@ -886,9 +886,9 @@
886 "sure it is tagged as %r." % (last_version,886 "sure it is tagged as %r." % (last_version,
887 db.pristine_upstream_source.tag_name(887 db.pristine_upstream_source.tag_name(
888 last_version.upstream_version)))888 last_version.upstream_version)))
889 upstream_tip = db.pristine_upstream_source.version_as_revision(889 upstream_tips = db.pristine_upstream_source.version_as_revisions(
890 changelog.package, last_version.upstream_version)890 changelog.package, last_version.upstream_version)
891 db.extract_upstream_tree(upstream_tip, tempdir)891 db.extract_upstream_tree(upstream_tips, tempdir)
892 else:892 else:
893 db._create_empty_upstream_tree(tempdir)893 db._create_empty_upstream_tree(tempdir)
894 self.import_many(db, files_list, orig_target)894 self.import_many(db, files_list, orig_target)
@@ -966,7 +966,7 @@
966 if upstream is not None:966 if upstream is not None:
967 # See bug lp:309682967 # See bug lp:309682
968 upstream.repository.fetch(branch.repository, parents[0])968 upstream.repository.fetch(branch.repository, parents[0])
969 db.extract_upstream_tree(parents[0], tempdir)969 db.extract_upstream_tree({ None: parents[0] }, tempdir)
970 else:970 else:
971 db._create_empty_upstream_tree(tempdir)971 db._create_empty_upstream_tree(tempdir)
972 tree = db.branch.basis_tree()972 tree = db.branch.basis_tree()
@@ -983,7 +983,7 @@
983 tarballs = [(location, None, md5sum_filename(location))]983 tarballs = [(location, None, md5sum_filename(location))]
984 for (component, tag_name, revid) in db.import_upstream_tarballs(984 for (component, tag_name, revid) in db.import_upstream_tarballs(
985 tarballs, None, version, parents, upstream_branch=upstream,985 tarballs, None, version, parents, upstream_branch=upstream,
986 upstream_revision=upstream_revid):986 upstream_revisions={ None: upstream_revid }):
987 if component is None:987 if component is None:
988 self.outf.write('Imported %s as tag:%s.\n' % (988 self.outf.write('Imported %s as tag:%s.\n' % (
989 location, tag_name))989 location, tag_name))
990990
=== modified file 'import_dsc.py'
--- import_dsc.py 2011-09-09 13:20:42 +0000
+++ import_dsc.py 2011-09-26 22:30:28 +0000
@@ -60,6 +60,7 @@
6060
61from bzrlib.plugins.builddeb.bzrtools_import import import_dir61from bzrlib.plugins.builddeb.bzrtools_import import import_dir
62from bzrlib.plugins.builddeb.errors import (62from bzrlib.plugins.builddeb.errors import (
63 MultipleUpstreamTarballsNotSupported,
63 PackageVersionNotPresent,64 PackageVersionNotPresent,
64 UpstreamAlreadyImported,65 UpstreamAlreadyImported,
65 UpstreamBranchAlreadyMerged,66 UpstreamBranchAlreadyMerged,
@@ -556,6 +557,7 @@
556 tarballs=upstream_tarballs):557 tarballs=upstream_tarballs):
557 return False558 return False
558559
560
559 up_branch = self.pristine_upstream_branch561 up_branch = self.pristine_upstream_branch
560 up_branch.lock_read()562 up_branch.lock_read()
561 try:563 try:
@@ -563,10 +565,14 @@
563 other_up_branch = branch.pristine_upstream_branch565 other_up_branch = branch.pristine_upstream_branch
564 other_up_branch.lock_read()566 other_up_branch.lock_read()
565 try:567 try:
568 pristine_upstream_revids = branch.pristine_upstream_source.version_as_revisions(package, version)
569 if pristine_upstream_revids.keys() != [None]:
570 raise MultipleUpstreamTarballsNotSupported()
571 pristine_upstream_revid = pristine_upstream_revids[None]
566 graph = other_up_branch.repository.get_graph(572 graph = other_up_branch.repository.get_graph(
567 up_branch.repository)573 up_branch.repository)
568 return graph.is_ancestor(up_branch.last_revision(),574 return graph.is_ancestor(up_branch.last_revision(),
569 branch.pristine_upstream_source.version_as_revision(package, version))575 pristine_upstream_revid)
570 finally:576 finally:
571 other_up_branch.unlock()577 other_up_branch.unlock()
572 finally:578 finally:
@@ -680,7 +686,11 @@
680 :param version: the upstream version string686 :param version: the upstream version string
681 """687 """
682 assert isinstance(version, str)688 assert isinstance(version, str)
683 pull_revision = pull_branch.pristine_upstream_source.version_as_revision(package, version)689 pull_revisions = pull_branch.pristine_upstream_source.version_as_revisions(
690 package, version)
691 if pull_revisions.keys() != [None]:
692 raise MultipleUpstreamTarballsNotSupported()
693 pull_revision = pull_revisions[None]
684 mutter("Pulling upstream part of %s from revision %s" % \694 mutter("Pulling upstream part of %s from revision %s" % \
685 (version, pull_revision))695 (version, pull_revision))
686 assert self.pristine_upstream_tree is not None, \696 assert self.pristine_upstream_tree is not None, \
@@ -774,12 +784,17 @@
774 break784 break
775 real_parents = [p[2] for p in parents]785 real_parents = [p[2] for p in parents]
776 if need_upstream_parent:786 if need_upstream_parent:
777 parent_revid = self.pristine_upstream_source.version_as_revision(package,787 upstream_revids = self.pristine_upstream_source.version_as_revisions(package,
778 version.upstream_version, tarballs)788 version.upstream_version, tarballs)
779 if len(parents) > 0:789 def key(a):
780 real_parents.insert(1, parent_revid)790 if a is None:
781 else:791 return None
782 real_parents = [parent_revid]792 return a
793 for component in sorted(upstream_revids.keys(), key=key):
794 if len(real_parents) > 0:
795 real_parents.insert(1, upstream_revids[component])
796 else:
797 real_parents = [upstream_revids[component]]
783 return real_parents798 return real_parents
784799
785 def _fetch_upstream_to_branch(self, revid):800 def _fetch_upstream_to_branch(self, revid):
@@ -793,7 +808,7 @@
793808
794 def import_upstream(self, upstream_part, package, version, upstream_parents,809 def import_upstream(self, upstream_part, package, version, upstream_parents,
795 upstream_tarballs, upstream_branch=None,810 upstream_tarballs, upstream_branch=None,
796 upstream_revision=None, timestamp=None, author=None,811 upstream_revisions=None, timestamp=None, author=None,
797 file_ids_from=None):812 file_ids_from=None):
798 """Import an upstream part on to the upstream branch.813 """Import an upstream part on to the upstream branch.
799814
@@ -821,18 +836,23 @@
821 other_branches = self.get_other_branches()836 other_branches = self.get_other_branches()
822 ret = []837 ret = []
823 for (tarball, component, md5) in upstream_tarballs:838 for (tarball, component, md5) in upstream_tarballs:
839 if upstream_revisions is not None:
840 revid = upstream_revisions[component]
841 else:
842 revid = None
824 upstream_trees = [o.pristine_upstream_branch.basis_tree()843 upstream_trees = [o.pristine_upstream_branch.basis_tree()
825 for o in other_branches]844 for o in other_branches]
826 target_tree = None845 target_tree = None
827 if upstream_branch is not None:846 if upstream_branch is not None:
828 if upstream_revision is None:847 if revid is None:
829 upstream_revision = upstream_branch.last_revision()848 # FIXME: This is wrong for component tarballs
849 revid = upstream_branch.last_revision()
830 self.pristine_upstream_branch.fetch(upstream_branch,850 self.pristine_upstream_branch.fetch(upstream_branch,
831 last_revision=upstream_revision)851 last_revision=revid)
832 upstream_branch.tags.merge_to(self.pristine_upstream_branch.tags)852 upstream_branch.tags.merge_to(self.pristine_upstream_branch.tags)
833 upstream_parents.append(upstream_revision)853 upstream_parents.append(revid)
834 target_tree = self.pristine_upstream_branch.repository.revision_tree(854 target_tree = self.pristine_upstream_branch.repository.revision_tree(
835 upstream_revision)855 revid)
836 if file_ids_from is not None:856 if file_ids_from is not None:
837 upstream_trees = file_ids_from + upstream_trees857 upstream_trees = file_ids_from + upstream_trees
838 if self.tree:858 if self.tree:
@@ -858,15 +878,16 @@
858 finally:878 finally:
859 self_tree.unlock()879 self_tree.unlock()
860 (tag, revid) = self.pristine_upstream_source.import_component_tarball(880 (tag, revid) = self.pristine_upstream_source.import_component_tarball(
861 package, version, self.pristine_upstream_tree, upstream_parents, component,881 package, version, self.pristine_upstream_tree, upstream_parents,
862 md5, tarball, author=author, timestamp=timestamp)882 component, md5, tarball, author=author, timestamp=timestamp)
883 self.pristine_upstream_branch.generate_revision_history(revid)
863 ret.append((component, tag, revid))884 ret.append((component, tag, revid))
864 self.branch.fetch(self.pristine_upstream_branch)885 self.branch.fetch(self.pristine_upstream_branch)
865 self.branch.tags.set_tag(tag, revid)886 self.branch.tags.set_tag(tag, revid)
866 return ret887 return ret
867888
868 def import_upstream_tarballs(self, tarballs, package, version, parents,889 def import_upstream_tarballs(self, tarballs, package, version, parents,
869 upstream_branch=None, upstream_revision=None):890 upstream_branch=None, upstream_revisions=None):
870 """Import an upstream part to the upstream branch.891 """Import an upstream part to the upstream branch.
871892
872 :param tarballs: List of tarballs / components to extract893 :param tarballs: List of tarballs / components to extract
@@ -876,7 +897,7 @@
876 parents.897 parents.
877 :param upstream_branch: An upstream branch to associate with the898 :param upstream_branch: An upstream branch to associate with the
878 tarball.899 tarball.
879 :param upstream_revision: Upstream revision id900 :param upstream_revisions: Upstream revision ids dictionary
880 :param md5sum: hex digest of the md5sum of the tarball, if known.901 :param md5sum: hex digest of the md5sum of the tarball, if known.
881 :return: list with (component, tag, revid) tuples902 :return: list with (component, tag, revid) tuples
882 """903 """
@@ -885,7 +906,7 @@
885 return self.import_upstream(tarball_dir, package, version, parents,906 return self.import_upstream(tarball_dir, package, version, parents,
886 tarballs,907 tarballs,
887 upstream_branch=upstream_branch,908 upstream_branch=upstream_branch,
888 upstream_revision=upstream_revision)909 upstream_revisions=upstream_revisions)
889 finally:910 finally:
890 shutil.rmtree(tarball_dir)911 shutil.rmtree(tarball_dir)
891912
@@ -1052,8 +1073,11 @@
1052 pull_branch = pull_parents[1][0]1073 pull_branch = pull_parents[1][0]
1053 pull_version = pull_parents[1][1]1074 pull_version = pull_parents[1][1]
1054 if not pull_branch.is_version_native(pull_version):1075 if not pull_branch.is_version_native(pull_version):
1055 pull_revid = pull_branch.pristine_upstream_source.version_as_revision(1076 pull_revids = pull_branch.pristine_upstream_source.version_as_revisions(
1056 package, pull_version.upstream_version)1077 package, pull_version.upstream_version)
1078 if pull_revids.keys() != [None]:
1079 raise MultipleUpstreamTarballsNotSupported()
1080 pull_revid = pull_revids[None]
1057 mutter("Initialising upstream from %s, version %s",1081 mutter("Initialising upstream from %s, version %s",
1058 str(pull_branch), str(pull_version))1082 str(pull_branch), str(pull_version))
1059 parents.append(pull_revid)1083 parents.append(pull_revid)
@@ -1245,16 +1269,16 @@
1245 finally:1269 finally:
1246 extractor.cleanup()1270 extractor.cleanup()
12471271
1248 def extract_upstream_tree(self, upstream_tip, basedir):1272 def extract_upstream_tree(self, upstream_tips, basedir):
1249 """Extract upstream_tip to a tempdir as a working tree."""1273 """Extract upstream_tip to a tempdir as a working tree."""
1250 # TODO: should stack rather than trying to use the repository,1274 # TODO: should stack rather than trying to use the repository,
1251 # as that will be more efficient.1275 # as that will be more efficient.
1252 # TODO: remove the _extract_upstream_tree alias below.
1253 to_location = os.path.join(basedir, "upstream")1276 to_location = os.path.join(basedir, "upstream")
1254 # Use upstream_branch if it has been set, otherwise self.branch.1277 # Use upstream_branch if it has been set, otherwise self.branch.
1255 source_branch = self.pristine_upstream_branch or self.branch1278 source_branch = self.pristine_upstream_branch or self.branch
1279 assert upstream_tips.keys() == [None]
1256 dir_to = source_branch.bzrdir.sprout(to_location,1280 dir_to = source_branch.bzrdir.sprout(to_location,
1257 revision_id=upstream_tip,1281 revision_id=upstream_tips[None],
1258 accelerator_tree=self.tree)1282 accelerator_tree=self.tree)
1259 try:1283 try:
1260 self.pristine_upstream_tree = dir_to.open_workingtree()1284 self.pristine_upstream_tree = dir_to.open_workingtree()
@@ -1263,8 +1287,6 @@
1263 self.pristine_upstream_tree = dir_to.create_workingtree()1287 self.pristine_upstream_tree = dir_to.create_workingtree()
1264 self.pristine_upstream_branch = self.pristine_upstream_tree.branch1288 self.pristine_upstream_branch = self.pristine_upstream_tree.branch
12651289
1266 _extract_upstream_tree = extract_upstream_tree
1267
1268 def _create_empty_upstream_tree(self, basedir):1290 def _create_empty_upstream_tree(self, basedir):
1269 to_location = os.path.join(basedir, "upstream")1291 to_location = os.path.join(basedir, "upstream")
1270 to_transport = get_transport(to_location)1292 to_transport = get_transport(to_location)
@@ -1314,7 +1336,7 @@
1314 assert isinstance(previous_version, str), \1336 assert isinstance(previous_version, str), \
1315 "Should pass upstream version as str, not Version."1337 "Should pass upstream version as str, not Version."
1316 try:1338 try:
1317 upstream_tip = self.pristine_upstream_source.version_as_revision(1339 upstream_tips = self.pristine_upstream_source.version_as_revisions(
1318 package, previous_version)1340 package, previous_version)
1319 except PackageVersionNotPresent:1341 except PackageVersionNotPresent:
1320 raise BzrCommandError("Unable to find the tag for the "1342 raise BzrCommandError("Unable to find the tag for the "
@@ -1322,10 +1344,16 @@
1322 "%s" % (1344 "%s" % (
1323 previous_version,1345 previous_version,
1324 self.pristine_upstream_source.tag_name(previous_version)))1346 self.pristine_upstream_source.tag_name(previous_version)))
1325 self.extract_upstream_tree(upstream_tip, tempdir)1347 self.extract_upstream_tree(upstream_tips, tempdir)
1348
1349 def has_merged_upstream_revisions(self, this_revision, upstream_repository, upstream_revisions):
1350 graph = self.branch.repository.get_graph(
1351 other_repository=upstream_repository)
1352 return all(graph.is_ancestor(upstream_revision, this_revision)
1353 for upstream_revision in upstream_revisions.values())
13261354
1327 def merge_upstream(self, tarball_filenames, package, version, previous_version,1355 def merge_upstream(self, tarball_filenames, package, version, previous_version,
1328 upstream_branch=None, upstream_revision=None, merge_type=None,1356 upstream_branch=None, upstream_revisions=None, merge_type=None,
1329 force=False):1357 force=False):
1330 assert isinstance(version, str), \1358 assert isinstance(version, str), \
1331 "Should pass version as str not %s" % str(type(version))1359 "Should pass version as str not %s" % str(type(version))
@@ -1344,12 +1372,10 @@
1344 upstream_branch.lock_read()1372 upstream_branch.lock_read()
1345 try:1373 try:
1346 if upstream_branch is not None:1374 if upstream_branch is not None:
1347 if upstream_revision is None:1375 if upstream_revisions is None:
1348 upstream_revision = upstream_branch.last_revision()1376 upstream_revisions = { None: upstream_branch.last_revision() }
1349 graph = self.branch.repository.get_graph(1377 if (not force and
1350 other_repository=upstream_branch.repository)1378 self.has_merged_upstream_revisions(self.branch.last_revision(), upstream_branch.repository, upstream_revisions)):
1351 if not force and graph.is_ancestor(upstream_revision,
1352 self.branch.last_revision()):
1353 raise UpstreamBranchAlreadyMerged1379 raise UpstreamBranchAlreadyMerged
1354 upstream_tarballs = [1380 upstream_tarballs = [
1355 (os.path.abspath(fn), component, md5sum_filename(fn)) for1381 (os.path.abspath(fn), component, md5sum_filename(fn)) for
@@ -1364,7 +1390,7 @@
1364 for (component, tag, revid) in self.import_upstream(tarball_dir,1390 for (component, tag, revid) in self.import_upstream(tarball_dir,
1365 package, version, parents, upstream_tarballs=upstream_tarballs,1391 package, version, parents, upstream_tarballs=upstream_tarballs,
1366 upstream_branch=upstream_branch,1392 upstream_branch=upstream_branch,
1367 upstream_revision=upstream_revision):1393 upstream_revisions=upstream_revisions):
1368 self._fetch_upstream_to_branch(revid)1394 self._fetch_upstream_to_branch(revid)
1369 finally:1395 finally:
1370 shutil.rmtree(tarball_dir)1396 shutil.rmtree(tarball_dir)
13711397
=== modified file 'merge_package.py'
--- merge_package.py 2011-06-15 13:21:22 +0000
+++ merge_package.py 2011-09-26 22:30:28 +0000
@@ -31,7 +31,9 @@
31 from debian_bundle.changelog import Version31 from debian_bundle.changelog import Version
3232
33from bzrlib.plugins.builddeb.errors import (33from bzrlib.plugins.builddeb.errors import (
34 SharedUpstreamConflictsWithTargetPackaging)34 MultipleUpstreamTarballsNotSupported,
35 SharedUpstreamConflictsWithTargetPackaging,
36 )
35from bzrlib.plugins.builddeb.import_dsc import DistributionBranch37from bzrlib.plugins.builddeb.import_dsc import DistributionBranch
36from bzrlib.plugins.builddeb.util import find_changelog38from bzrlib.plugins.builddeb.util import find_changelog
3739
@@ -59,8 +61,11 @@
59 for branch in (source, target):61 for branch in (source, target):
60 db = DistributionBranch(branch, branch)62 db = DistributionBranch(branch, branch)
61 uver = _latest_version(branch).upstream_version63 uver = _latest_version(branch).upstream_version
62 results.append((Version(uver),64 upstream_revids = db.pristine_upstream_source.version_as_revisions(None, uver)
63 db.pristine_upstream_source.version_as_revision(None, uver)))65 if upstream_revids.keys() != [None]:
66 raise MultipleUpstreamTarballsNotSupported()
67 upstream_revid = upstream_revids[None]
68 results.append((Version(uver), upstream_revid))
6469
65 return results70 return results
6671
@@ -136,7 +141,7 @@
136 try:141 try:
137 # Extract the merge target's upstream tree into a temporary142 # Extract the merge target's upstream tree into a temporary
138 # directory.143 # directory.
139 db.extract_upstream_tree(ut_revid, tempdir)144 db.extract_upstream_tree({None: ut_revid}, tempdir)
140 tmp_target_utree = db.pristine_upstream_tree145 tmp_target_utree = db.pristine_upstream_tree
141146
142 # Merge upstream branch tips to obtain a shared upstream parent.147 # Merge upstream branch tips to obtain a shared upstream parent.
143148
=== modified file 'tests/test_import_dsc.py'
--- tests/test_import_dsc.py 2011-09-09 13:20:42 +0000
+++ tests/test_import_dsc.py 2011-09-26 22:30:28 +0000
@@ -213,14 +213,15 @@
213 db.tag_version(version)213 db.tag_version(version)
214 self.assertEqual(db.revid_of_version(version), revid)214 self.assertEqual(db.revid_of_version(version), revid)
215215
216 def test_upstream_version_as_revid(self):216 def test_upstream_versions_as_revid(self):
217 db = self.db1217 db = self.db1
218 tree = self.up_tree1218 tree = self.up_tree1
219 version = "0.1"219 version = "0.1"
220 revid = tree.commit("one")220 revid = tree.commit("one")
221 db.tag_upstream_version(version)221 db.tag_upstream_version(version)
222 self.assertEqual(222 self.assertEqual(
223 db.pristine_upstream_source.version_as_revision("package", version), revid)223 db.pristine_upstream_source.version_as_revisions("package", version),
224 { None: revid })
224225
225 def test_contained_versions(self):226 def test_contained_versions(self):
226 db = self.db1227 db = self.db1
@@ -710,8 +711,8 @@
710 self.assertEqual(self.tree2.branch.last_revision(), revid)711 self.assertEqual(self.tree2.branch.last_revision(), revid)
711 self.assertEqual(self.up_tree2.branch.last_revision(), up_revid)712 self.assertEqual(self.up_tree2.branch.last_revision(), up_revid)
712 self.assertEqual(self.db2.revid_of_version(version), revid)713 self.assertEqual(self.db2.revid_of_version(version), revid)
713 self.assertEqual(self.db2.pristine_upstream_source.version_as_revision(714 self.assertEqual(self.db2.pristine_upstream_source.version_as_revisions(
714 "package", version.upstream_version), up_revid)715 "package", version.upstream_version), {None: up_revid})
715716
716 def test_pull_from_lesser_branch_with_upstream(self):717 def test_pull_from_lesser_branch_with_upstream(self):
717 version = Version("0.1-1")718 version = Version("0.1-1")
@@ -726,8 +727,8 @@
726 self.assertEqual(self.tree2.branch.last_revision(), revid)727 self.assertEqual(self.tree2.branch.last_revision(), revid)
727 self.assertEqual(self.up_tree2.branch.last_revision(), up_revid)728 self.assertEqual(self.up_tree2.branch.last_revision(), up_revid)
728 self.assertEqual(self.db2.revid_of_version(version), revid)729 self.assertEqual(self.db2.revid_of_version(version), revid)
729 self.assertEqual(self.db2.pristine_upstream_source.version_as_revision(730 self.assertEqual(self.db2.pristine_upstream_source.version_as_revisions(
730 "package", version.upstream_version), up_revid)731 "package", version.upstream_version), {None: up_revid})
731732
732 def test_pull_upstream_from_branch(self):733 def test_pull_upstream_from_branch(self):
733 version = "0.1"734 version = "0.1"
@@ -737,8 +738,9 @@
737 self.assertNotEqual(self.up_tree2.branch.last_revision(), up_revid)738 self.assertNotEqual(self.up_tree2.branch.last_revision(), up_revid)
738 self.db2.pull_upstream_from_branch(self.db1, "package", version)739 self.db2.pull_upstream_from_branch(self.db1, "package", version)
739 self.assertEqual(self.up_tree2.branch.last_revision(), up_revid)740 self.assertEqual(self.up_tree2.branch.last_revision(), up_revid)
740 self.assertEqual(self.db2.pristine_upstream_source.version_as_revision("package", version),741 self.assertEqual(
741 up_revid)742 self.db2.pristine_upstream_source.version_as_revisions("package", version),
743 {None: up_revid})
742744
743 def check_changes(self, changes, added=[], removed=[], modified=[],745 def check_changes(self, changes, added=[], removed=[], modified=[],
744 renamed=[]):746 renamed=[]):
@@ -794,8 +796,8 @@
794 branch = tree.branch796 branch = tree.branch
795 rh = branch.revision_history()797 rh = branch.revision_history()
796 self.assertEqual(len(rh), 1)798 self.assertEqual(len(rh), 1)
797 self.assertEqual(self.db1.pristine_upstream_source.version_as_revision(799 self.assertEqual(self.db1.pristine_upstream_source.version_as_revisions(
798 "package", version.upstream_version), rh[0])800 "package", version.upstream_version), {None: rh[0]})
799 rev = branch.repository.get_revision(rh[0])801 rev = branch.repository.get_revision(rh[0])
800 self.assertEqual(rev.message,802 self.assertEqual(rev.message,
801 "Import upstream version %s" % str(version.upstream_version))803 "Import upstream version %s" % str(version.upstream_version))
@@ -833,7 +835,9 @@
833 rh = branch.revision_history()835 rh = branch.revision_history()
834 self.assertEqual(len(rh), 2)836 self.assertEqual(len(rh), 2)
835 self.assertEqual(837 self.assertEqual(
836 self.db1.pristine_upstream_source.version_as_revision("package", version2.upstream_version), rh[1])838 self.db1.pristine_upstream_source.version_as_revisions(
839 "package", version2.upstream_version),
840 {None: rh[1]})
837 rev = branch.repository.get_revision(rh[1])841 rev = branch.repository.get_revision(rh[1])
838 self.assertEqual(rev.message,842 self.assertEqual(rev.message,
839 "Import upstream version %s" % str(version2.upstream_version))843 "Import upstream version %s" % str(version2.upstream_version))
@@ -864,8 +868,8 @@
864 branch = tree.branch868 branch = tree.branch
865 rh = branch.revision_history()869 rh = branch.revision_history()
866 self.assertEqual(len(rh), 1)870 self.assertEqual(len(rh), 1)
867 self.assertEqual(self.db1.pristine_upstream_source.version_as_revision(871 self.assertEqual(self.db1.pristine_upstream_source.version_as_revisions(
868 "package", version.upstream_version), rh[0])872 "package", version.upstream_version), {None: rh[0]})
869 rev = branch.repository.get_revision(rh[0])873 rev = branch.repository.get_revision(rh[0])
870 self.assertEqual(rev.message,874 self.assertEqual(rev.message,
871 "Import upstream version %s" % str(version.upstream_version))875 "Import upstream version %s" % str(version.upstream_version))
@@ -892,8 +896,8 @@
892 branch = tree.branch896 branch = tree.branch
893 rh = branch.revision_history()897 rh = branch.revision_history()
894 self.assertEqual(len(rh), 1)898 self.assertEqual(len(rh), 1)
895 self.assertEqual(self.db1.pristine_upstream_source.version_as_revision(899 self.assertEqual(self.db1.pristine_upstream_source.version_as_revisions(
896 "package", version.upstream_version), rh[0])900 "package", version.upstream_version), {None: rh[0]})
897 rev = branch.repository.get_revision(rh[0])901 rev = branch.repository.get_revision(rh[0])
898 self.assertEqual(rev.message,902 self.assertEqual(rev.message,
899 "Import upstream version %s" % str(version.upstream_version))903 "Import upstream version %s" % str(version.upstream_version))
@@ -941,8 +945,8 @@
941 branch = tree.branch945 branch = tree.branch
942 rh = branch.revision_history()946 rh = branch.revision_history()
943 self.assertEqual(len(rh), 1)947 self.assertEqual(len(rh), 1)
944 self.assertEqual(self.db1.pristine_upstream_source.version_as_revision(948 self.assertEqual(self.db1.pristine_upstream_source.version_as_revisions(
945 "package", version.upstream_version), rh[0])949 "package", version.upstream_version), {None: rh[0]})
946 rev = branch.repository.get_revision(rh[0])950 rev = branch.repository.get_revision(rh[0])
947 self.assertEqual(rev.message,951 self.assertEqual(rev.message,
948 "Import upstream version %s" % str(version.upstream_version))952 "Import upstream version %s" % str(version.upstream_version))
@@ -1381,8 +1385,9 @@
1381 self.assertEqual(self.db1.revid_of_version(version2), rh1[2])1385 self.assertEqual(self.db1.revid_of_version(version2), rh1[2])
1382 self.assertEqual(self.db1.revid_of_version(version3), rh1[3])1386 self.assertEqual(self.db1.revid_of_version(version3), rh1[3])
1383 self.assertEqual(1387 self.assertEqual(
1384 self.db1.pristine_upstream_source.version_as_revision("package", version1.upstream_version),1388 self.db1.pristine_upstream_source.version_as_revisions(
1385 up_rh1[0])1389 "package", version1.upstream_version),
1390 {None: up_rh1[0]})
1386 self.tree1.lock_read()1391 self.tree1.lock_read()
1387 self.addCleanup(self.tree1.unlock)1392 self.addCleanup(self.tree1.unlock)
1388 self.assertFalse(self.db1.is_version_native(version1))1393 self.assertFalse(self.db1.is_version_native(version1))
@@ -1434,11 +1439,13 @@
1434 self.assertEqual(self.db1.revid_of_version(version2), rh1[2])1439 self.assertEqual(self.db1.revid_of_version(version2), rh1[2])
1435 self.assertEqual(self.db1.revid_of_version(version3), rh1[3])1440 self.assertEqual(self.db1.revid_of_version(version3), rh1[3])
1436 self.assertEqual(1441 self.assertEqual(
1437 self.db1.pristine_upstream_source.version_as_revision("package", version1.upstream_version),1442 self.db1.pristine_upstream_source.version_as_revisions("package",
1438 up_rh1[0])1443 version1.upstream_version),
1444 {None: up_rh1[0]})
1439 self.assertEqual(1445 self.assertEqual(
1440 self.db1.pristine_upstream_source.version_as_revision("package", version3.upstream_version),1446 self.db1.pristine_upstream_source.version_as_revisions("package",
1441 up_rh1[1])1447 version3.upstream_version),
1448 {None: up_rh1[1]})
1442 self.tree1.lock_read()1449 self.tree1.lock_read()
1443 self.addCleanup(self.tree1.unlock)1450 self.addCleanup(self.tree1.unlock)
1444 self.assertFalse(self.db1.is_version_native(version1))1451 self.assertFalse(self.db1.is_version_native(version1))
@@ -1489,11 +1496,13 @@
1489 self.assertEqual(self.db1.revid_of_version(version2), rh1[2])1496 self.assertEqual(self.db1.revid_of_version(version2), rh1[2])
1490 self.assertEqual(self.db1.revid_of_version(version3), rh1[3])1497 self.assertEqual(self.db1.revid_of_version(version3), rh1[3])
1491 self.assertEqual(1498 self.assertEqual(
1492 self.db1.pristine_upstream_source.version_as_revision("package", version1.upstream_version),1499 self.db1.pristine_upstream_source.version_as_revisions("package",
1493 up_rh1[0])1500 version1.upstream_version),
1501 { None: up_rh1[0] })
1494 self.assertEqual(1502 self.assertEqual(
1495 self.db1.pristine_upstream_source.version_as_revision("package", version3.upstream_version),1503 self.db1.pristine_upstream_source.version_as_revisions("package",
1496 up_rh1[1])1504 version3.upstream_version),
1505 { None: up_rh1[1] })
1497 self.tree1.lock_read()1506 self.tree1.lock_read()
1498 self.addCleanup(self.tree1.unlock)1507 self.addCleanup(self.tree1.unlock)
1499 self.assertFalse(self.db1.is_version_native(version1))1508 self.assertFalse(self.db1.is_version_native(version1))
@@ -1604,7 +1613,7 @@
1604 tf.close()1613 tf.close()
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",
1606 upstream_branch=upstream_tree.branch,1615 upstream_branch=upstream_tree.branch,
1607 upstream_revision=upstream_rev)1616 upstream_revisions={None: upstream_rev})
1608 self.assertEqual(0, conflicts)1617 self.assertEqual(0, conflicts)
16091618
1610 def test_merge_upstream_initial_with_removed_debian(self):1619 def test_merge_upstream_initial_with_removed_debian(self):
@@ -1644,7 +1653,7 @@
1644 tf.close()1653 tf.close()
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",
1646 upstream_branch=upstream_tree.branch,1655 upstream_branch=upstream_tree.branch,
1647 upstream_revision=upstream_rev)1656 upstream_revisions={None: upstream_rev})
1648 # ./debian conflicts.1657 # ./debian conflicts.
1649 self.assertEqual(3, conflicts)1658 self.assertEqual(3, conflicts)
16501659
@@ -1686,7 +1695,7 @@
1686 db.merge_upstream([(builder.tar_name(), None)], "package", str(version2),1695 db.merge_upstream([(builder.tar_name(), None)], "package", str(version2),
1687 version1.upstream_version,1696 version1.upstream_version,
1688 upstream_branch=upstream_tree.branch,1697 upstream_branch=upstream_tree.branch,
1689 upstream_revision=upstream_rev)1698 upstream_revisions={None: upstream_rev})
1690 rh1 = tree.branch.revision_history()1699 rh1 = tree.branch.revision_history()
1691 self.assertEqual(2, len(rh1))1700 self.assertEqual(2, len(rh1))
1692 packaging_upstream_tip = tree.get_parent_ids()[1]1701 packaging_upstream_tip = tree.get_parent_ids()[1]
@@ -1765,7 +1774,7 @@
1765 version2.upstream_version,1774 version2.upstream_version,
1766 version1.upstream_version,1775 version1.upstream_version,
1767 upstream_branch=upstream_tree.branch,1776 upstream_branch=upstream_tree.branch,
1768 upstream_revision=upstream_rev2)1777 upstream_revisions={None: upstream_rev2})
1769 self.assertEqual("a-id", tree.path2id("b"))1778 self.assertEqual("a-id", tree.path2id("b"))
17701779
1771 def test_merge_upstream_rename_on_top(self):1780 def test_merge_upstream_rename_on_top(self):
@@ -1802,7 +1811,7 @@
1802 version2.upstream_version,1811 version2.upstream_version,
1803 version1.upstream_version,1812 version1.upstream_version,
1804 upstream_branch=upstream_tree.branch,1813 upstream_branch=upstream_tree.branch,
1805 upstream_revision=upstream_rev2)1814 upstream_revisions={None:upstream_rev2})
1806 self.assertEqual("a-id", tree.path2id("b"))1815 self.assertEqual("a-id", tree.path2id("b"))
18071816
1808 def test_merge_upstream_rename_in_packaging_branch(self):1817 def test_merge_upstream_rename_in_packaging_branch(self):
18091818
=== modified file 'tests/test_upstream.py'
--- tests/test_upstream.py 2011-09-09 13:20:42 +0000
+++ tests/test_upstream.py 2011-09-26 22:30:28 +0000
@@ -432,6 +432,20 @@
432 self.tree.commit("msg")432 self.tree.commit("msg")
433 self.assertEquals("2.1+bzr2", source.get_latest_version("foo", "1.0"))433 self.assertEquals("2.1+bzr2", source.get_latest_version("foo", "1.0"))
434434
435 def test_version_as_revisions(self):
436 revid1 = self.tree.commit("msg")
437 self.tree.branch.tags.set_tag("2.1", self.tree.branch.last_revision())
438 config = DebBuildConfig(
439 [('user.conf', True), ('default.conf', False)],
440 branch=self.tree.branch)
441 source = UpstreamBranchSource(self.tree.branch,
442 {"2.1": self.tree.branch.last_revision()},
443 config=config)
444 revid2 = self.tree.commit("msg")
445 self.assertEquals(revid2,
446 source.version_as_revision("foo", "2.1+bzr2"))
447 self.assertEquals({None: revid1}, source.version_as_revisions("foo", "2.1"))
448
435 def test_version_as_revision(self):449 def test_version_as_revision(self):
436 revid1 = self.tree.commit("msg")450 revid1 = self.tree.commit("msg")
437 self.tree.branch.tags.set_tag("2.1", self.tree.branch.last_revision())451 self.tree.branch.tags.set_tag("2.1", self.tree.branch.last_revision())
@@ -766,14 +780,31 @@
766 rev.properties["deb-pristine-delta"] = standard_b64encode("bla")780 rev.properties["deb-pristine-delta"] = standard_b64encode("bla")
767 self.assertEquals("bla", self.source.pristine_tar_delta(rev))781 self.assertEquals("bla", self.source.pristine_tar_delta(rev))
768782
769 def test_version_as_revision_missing(self):783 def test_version_as_revisions_missing(self):
770 self.assertRaises(PackageVersionNotPresent,784 self.assertRaises(PackageVersionNotPresent,
771 self.source.version_as_revision, None, "1.2")785 self.source.version_as_revisions, None, "1.2")
772786
773 def test_version_as_revision(self):787 def test_version_as_revisions_single(self):
774 revid1 = self.tree.commit("msg")788 revid1 = self.tree.commit("msg")
775 self.tree.branch.tags.set_tag("upstream-2.1", revid1)789 self.tree.branch.tags.set_tag("upstream-2.1", revid1)
776 self.assertEquals(revid1, self.source.version_as_revision(None, "2.1"))790 self.assertEquals({None: revid1},
791 self.source.version_as_revisions(None, "2.1"))
792
793 def test_version_component_as_revision(self):
794 revid1 = self.tree.commit("msg")
795 self.tree.branch.tags.set_tag("upstream-2.1/lib", revid1)
796 self.assertEquals(revid1,
797 self.source.version_component_as_revision(None, "2.1", "lib"))
798
799 def test_version_as_revisions(self):
800 revid1 = self.tree.commit("msg")
801 revid2 = self.tree.commit("msg")
802 self.tree.branch.tags.set_tag("upstream-2.1", revid1)
803 self.tree.branch.tags.set_tag("upstream-2.1/lib", revid2)
804 self.assertEquals({ None: revid1, "lib": revid2 },
805 self.source.version_as_revisions(None, "2.1", [
806 ("upstream_2.1.orig.tar.gz", None, "somemd5sum"),
807 ("upstream_2.1.orig-lib.tar.gz", "lib", "othermd5sum")]))
777808
778809
779class TarfileSourceTests(TestCaseWithTransport):810class TarfileSourceTests(TestCaseWithTransport):
780811
=== modified file 'upstream/__init__.py'
--- upstream/__init__.py 2011-09-07 20:11:50 +0000
+++ upstream/__init__.py 2011-09-26 22:30:28 +0000
@@ -75,15 +75,16 @@
75 """75 """
76 raise NotImplementedError(self.get_latest_version)76 raise NotImplementedError(self.get_latest_version)
7777
78 def version_as_revision(self, package, version):78 def version_as_revisions(self, package, version, tarballs=None):
79 """Lookup the revision id for a particular version.79 """Lookup the revision ids for a particular version.
8080
81 :param package: Package name81 :param package: Package name
82 :package version: Version string82 :param version: Version string
83 :raise PackageVersionNotPresent: When the specified version was not83 :raise PackageVersionNotPresent: When the specified version was not
84 found84 found
85 :return: dictionary mapping component names to revision ids
85 """86 """
86 raise NotImplementedError(self.version_as_revision)87 raise NotImplementedError(self.version_as_revisions)
8788
88 def has_version(self, package, version, md5=None):89 def has_version(self, package, version, md5=None):
89 """Check whether this upstream source contains a particular package.90 """Check whether this upstream source contains a particular package.
9091
=== modified file 'upstream/branch.py'
--- upstream/branch.py 2011-06-26 21:02:48 +0000
+++ upstream/branch.py 2011-09-26 22:30:28 +0000
@@ -28,7 +28,10 @@
28from bzrlib.revisionspec import RevisionSpec28from bzrlib.revisionspec import RevisionSpec
29from bzrlib.trace import note29from bzrlib.trace import note
3030
31from bzrlib.plugins.builddeb.errors import PackageVersionNotPresent31from bzrlib.plugins.builddeb.errors import (
32 MultipleUpstreamTarballsNotSupported,
33 PackageVersionNotPresent,
34 )
32from bzrlib.plugins.builddeb.upstream import UpstreamSource35from bzrlib.plugins.builddeb.upstream import UpstreamSource
33from bzrlib.plugins.builddeb.util import (36from bzrlib.plugins.builddeb.util import (
34 export,37 export,
@@ -228,7 +231,7 @@
228 else:231 else:
229 self.upstream_revision_map = upstream_revision_map232 self.upstream_revision_map = upstream_revision_map
230233
231 def version_as_revision(self, package, version):234 def version_as_revision(self, package, version, tarballs=None):
232 assert isinstance(version, str)235 assert isinstance(version, str)
233 if version in self.upstream_revision_map:236 if version in self.upstream_revision_map:
234 revspec = self.upstream_revision_map[version]237 revspec = self.upstream_revision_map[version]
@@ -242,6 +245,13 @@
242 raise PackageVersionNotPresent(package, version, self)245 raise PackageVersionNotPresent(package, version, self)
243 raise PackageVersionNotPresent(package, version, self)246 raise PackageVersionNotPresent(package, version, self)
244247
248 def version_as_revisions(self, package, version, tarballs=None):
249 # FIXME: Support multiple upstream locations if there are multiple
250 # components
251 if tarballs is not None and tarballs.keys() != [None]:
252 raise MultipleUpstreamTarballsNotSupported()
253 return { None: self.version_as_revision(package, version, tarballs) }
254
245 def get_latest_version(self, package, current_version):255 def get_latest_version(self, package, current_version):
246 return self.get_version(package, current_version,256 return self.get_version(package, current_version,
247 self.upstream_branch.last_revision())257 self.upstream_branch.last_revision())
248258
=== modified file 'upstream/pristinetar.py'
--- upstream/pristinetar.py 2011-09-09 13:20:42 +0000
+++ upstream/pristinetar.py 2011-09-26 22:30:28 +0000
@@ -39,13 +39,17 @@
39 subprocess_setup,39 subprocess_setup,
40 )40 )
4141
42from bzrlib import osutils42from bzrlib import (
43 osutils,
44 revision as _mod_revision,
45 )
43from bzrlib.errors import (46from bzrlib.errors import (
44 BzrError,47 BzrError,
45 NoSuchRevision,48 NoSuchRevision,
46 NoSuchTag,49 NoSuchTag,
47 )50 )
48from bzrlib.trace import (51from bzrlib.trace import (
52 mutter,
49 note,53 note,
50 warning,54 warning,
51 )55 )
@@ -166,32 +170,43 @@
166 :param parent_ids: Parent revisions170 :param parent_ids: Parent revisions
167 :param tarballs: List of (path, component, md5)171 :param tarballs: List of (path, component, md5)
168 :param timestamp: Optional timestamp for new commits172 :param timestamp: Optional timestamp for new commits
169 :param author: Optional author for new commits173 :param author: Optional author for new commitscopmone
170 :return: List of tuples with (component, tag, revid)174 :return: List of tuples with (component, tag, revid)
171 """175 """
172 ret = []176 ret = []
177 component_paths = [cp for (_, cp, _) in tarballs if cp is not None]
173 for (tarball, component, md5) in tarballs:178 for (tarball, component, md5) in tarballs:
179 if component is None:
180 exclude = component_paths
181 else:
182 exclude = []
174 (tag, revid) = self.import_component_tarball(183 (tag, revid) = self.import_component_tarball(
175 package, version, tree, parent_ids, component,184 package, version, tree, parent_ids, component,
176 md5, tarball, author=author, timestamp=timestamp)185 md5, tarball, author=author, timestamp=timestamp,
186 exclude=exclude)
177 ret.append((component, tag, revid))187 ret.append((component, tag, revid))
188 # FIXME: Handle multiple components
189 tree.branch.generate_revision_history(revid)
178 return ret190 return ret
179191
180 def import_component_tarball(self, package, version, tree, parent_ids,192 def import_component_tarball(self, package, version, tree, parent_ids,
181 component=None, md5=None, tarball=None, author=None, timestamp=None):193 component=None, md5=None, tarball=None, author=None, timestamp=None,
194 subdir=None, exclude=None):
182 """Import a tarball.195 """Import a tarball.
183196
184 :param package: Package name197 :param package: Package name
185 :param version: Upstream version198 :param version: Upstream version
186 :param component: Component name (None for base)199 :param component: Component name (None for base)
200 :param exclude: Exclude directories
187 """201 """
188 if component is not None:202 if exclude is not None or subdir is not None:
189 raise BzrError("Importing non-base tarballs not yet supported")203 raise NotImplementedError
190 tree.set_parent_ids(parent_ids)204 if exclude is None:
205 exclude = []
191 revprops = {}206 revprops = {}
192 if md5 is not None:207 if md5 is not None:
193 revprops["deb-md5"] = md5208 revprops["deb-md5"] = md5
194 delta = self.make_pristine_tar_delta(tree, tarball)209 delta = self.make_pristine_tar_delta(tree, tarball, subdir=subdir)
195 uuencoded = standard_b64encode(delta)210 uuencoded = standard_b64encode(delta)
196 if tarball.endswith(".tar.bz2"):211 if tarball.endswith(".tar.bz2"):
197 revprops["deb-pristine-delta-bz2"] = uuencoded212 revprops["deb-pristine-delta-bz2"] = uuencoded
@@ -208,9 +223,31 @@
208 message = "Import upstream version %s" % (version,)223 message = "Import upstream version %s" % (version,)
209 if component is not None:224 if component is not None:
210 message += ", component %s" % component225 message += ", component %s" % component
211 revid = tree.commit(message, revprops=revprops, timestamp=timestamp,226 if len(parent_ids) == 0:
212 timezone=timezone)227 base_revid = _mod_revision.NULL_REVISION
213 tag_name, _ = self.tag_version(version, revid=revid)228 else:
229 base_revid = parent_ids[0]
230 basis_tree = tree.branch.repository.revision_tree(base_revid)
231 tree.lock_write()
232 try:
233 builder = tree.branch.get_commit_builder(parents=parent_ids,
234 revprops=revprops, timestamp=timestamp, timezone=timezone)
235 builder.will_record_deletes()
236 try:
237 list(builder.record_iter_changes(tree, base_revid,
238 tree.iter_changes(basis_tree)))
239 builder.finish_inventory()
240 except:
241 builder.abort()
242 raise
243 revid = builder.commit(message)
244 tag_name, _ = self.tag_version(version, revid=revid, component=component)
245 tree.update_basis_by_delta(revid, builder.get_basis_delta())
246 finally:
247 tree.unlock()
248 mutter(
249 'imported %s version %s component %r as revid %s, tagged %s',
250 package, version, component, revid, tag_name)
214 return tag_name, revid251 return tag_name, revid
215252
216 def fetch_component_tarball(self, package, version, component, target_dir):253 def fetch_component_tarball(self, package, version, component, target_dir):
@@ -256,14 +293,16 @@
256 "revision %s", revid)293 "revision %s", revid)
257 return True294 return True
258295
259 def version_as_revision(self, package, version, tarballs=None):296 def version_as_revisions(self, package, version, tarballs=None):
260 if tarballs is None:297 if tarballs is None:
261 return self.version_component_as_revision(package, version, component=None)298 # FIXME: What if there are multiple tarballs?
262 elif len(tarballs) > 1:299 return {
263 raise MultipleUpstreamTarballsNotSupported()300 None: self.version_component_as_revision(package, version, component=None) }
264 else:301 ret = {}
265 return self.version_component_as_revision(package, version, tarballs[0][1],302 for (tarball, component, md5) in tarballs:
266 tarballs[0][2])303 ret[component] = self.version_component_as_revision(
304 package, version, component, md5)
305 return ret
267306
268 def version_component_as_revision(self, package, version, component, md5=None):307 def version_component_as_revision(self, package, version, component, md5=None):
269 assert isinstance(version, str)308 assert isinstance(version, str)
@@ -359,7 +398,7 @@
359 finally:398 finally:
360 shutil.rmtree(tmpdir)399 shutil.rmtree(tmpdir)
361400
362 def make_pristine_tar_delta(self, tree, tarball_path):401 def make_pristine_tar_delta(self, tree, tarball_path, subdir=None):
363 tmpdir = tempfile.mkdtemp(prefix="builddeb-pristine-")402 tmpdir = tempfile.mkdtemp(prefix="builddeb-pristine-")
364 try:403 try:
365 dest = os.path.join(tmpdir, "orig")404 dest = os.path.join(tmpdir, "orig")
@@ -367,7 +406,7 @@
367 try:406 try:
368 for (dp, ie) in tree.inventory.iter_entries():407 for (dp, ie) in tree.inventory.iter_entries():
369 ie._read_tree_state(dp, tree)408 ie._read_tree_state(dp, tree)
370 export(tree, dest, format='dir')409 export(tree, dest, format='dir', subdir=subdir)
371 finally:410 finally:
372 tree.unlock()411 tree.unlock()
373 return make_pristine_tar_delta(dest, tarball_path)412 return make_pristine_tar_delta(dest, tarball_path)

Subscribers

People subscribed via source and target branches