Merge lp:~jelmer/bzr-builddeb/multiple-upstream-tarballs into lp:bzr-builddeb

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
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.

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
=== modified file 'cmds.py'
--- cmds.py 2011-09-09 13:20:42 +0000
+++ cmds.py 2011-09-27 00:50:26 +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(
@@ -748,15 +748,15 @@
748 if need_upstream_tarball:748 if need_upstream_tarball:
749 target_dir = tempfile.mkdtemp() # FIXME: Cleanup?749 target_dir = tempfile.mkdtemp() # FIXME: Cleanup?
750 locations = primary_upstream_source.fetch_tarballs(750 locations = primary_upstream_source.fetch_tarballs(
751 package, version, target_dir)751 package, version, target_dir, components=[None])
752 source_format = get_source_format(tree)752 source_format = get_source_format(tree)
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)
@@ -955,19 +955,24 @@
955 if db.pristine_upstream_source.has_version(None, version):955 if db.pristine_upstream_source.has_version(None, version):
956 raise BzrCommandError("Version %s is already present." % version)956 raise BzrCommandError("Version %s is already present." % version)
957 tagged_versions = {}957 tagged_versions = {}
958 for tag, tag_version, revid in db.pristine_upstream_source.iter_versions():958 for tversion, tcomponents in db.pristine_upstream_source.iter_versions():
959 tagged_versions[Version(tag_version)] = revid959 tagged_versions[Version(version)] = tcomponents
960 tag_order = sorted(tagged_versions.keys())960 tag_order = sorted(tagged_versions.keys())
961 if tag_order:961 if tag_order:
962 parents = [tagged_versions[tag_order[-1]]]962 base_revisions = tagged_versions[tag_order[-1]]
963 else:963 else:
964 parents = []964 base_revisions = {}
965 if parents:965 if base_revisions:
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 for parent in base_revisions.values():
969 db.extract_upstream_tree(parents[0], tempdir)969 upstream.repository.fetch(branch.repository, parent)
970 db.extract_upstream_tree(base_revisions, tempdir)
971 parents = {}
972 for name, base_revid in base_revisions.iteritems():
973 parents[name] = [base_revid]
970 else:974 else:
975 parents = {}
971 db._create_empty_upstream_tree(tempdir)976 db._create_empty_upstream_tree(tempdir)
972 tree = db.branch.basis_tree()977 tree = db.branch.basis_tree()
973 tree.lock_read()978 tree.lock_read()
@@ -983,7 +988,7 @@
983 tarballs = [(location, None, md5sum_filename(location))]988 tarballs = [(location, None, md5sum_filename(location))]
984 for (component, tag_name, revid) in db.import_upstream_tarballs(989 for (component, tag_name, revid) in db.import_upstream_tarballs(
985 tarballs, None, version, parents, upstream_branch=upstream,990 tarballs, None, version, parents, upstream_branch=upstream,
986 upstream_revision=upstream_revid):991 upstream_revisions={ None: upstream_revid }):
987 if component is None:992 if component is None:
988 self.outf.write('Imported %s as tag:%s.\n' % (993 self.outf.write('Imported %s as tag:%s.\n' % (
989 location, tag_name))994 location, tag_name))
@@ -1224,9 +1229,8 @@
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)
1225 finally:1230 finally:
1226 tree.unlock()1231 tree.unlock()
1227 note('Package prepared in %s'1232 note('Package prepared in %s',
1228 % urlutils.unescape_for_display(tree.basedir,1233 urlutils.unescape_for_display(tree.basedir, self.outf.encoding))
1229 self.outf.encoding))
12301234
12311235
1232class cmd_dep3_patch(Command):1236class cmd_dep3_patch(Command):
12331237
=== modified file 'debian/changelog'
--- debian/changelog 2011-09-09 13:21:35 +0000
+++ debian/changelog 2011-09-27 00:50:26 +0000
@@ -1,8 +1,10 @@
1bzr-builddeb (2.7.9) UNRELEASED; urgency=low1bzr-builddeb (2.7.9) UNRELEASED; urgency=low
22
3 * Support .tar.xz Debian files rather than .tar.lzma.3 * Support .tar.xz Debian files rather than .tar.lzma.
4 * Support importing and building packages with multiple upstream
5 tarballs. LP: #653757, LP: #664834
46
5 -- Jelmer Vernooij <jelmer@debian.org> Fri, 09 Sep 2011 15:21:22 +02007 -- Jelmer Vernooij <jelmer@debian.org> Tue, 27 Sep 2011 02:40:03 +0200
68
7bzr-builddeb (2.7.8) unstable; urgency=low9bzr-builddeb (2.7.8) unstable; urgency=low
810
911
=== modified file 'dh_make.py'
--- dh_make.py 2011-09-09 13:20:42 +0000
+++ dh_make.py 2011-09-27 00:50:26 +0000
@@ -79,9 +79,9 @@
79def import_upstream(tarball, package_name, version, use_v3=False):79def import_upstream(tarball, package_name, version, use_v3=False):
80 tree = _get_tree(package_name)80 tree = _get_tree(package_name)
81 if tree.branch.last_revision() != mod_revision.NULL_REVISION:81 if tree.branch.last_revision() != mod_revision.NULL_REVISION:
82 parents = [tree.branch.last_revision()]82 parents = { None: [tree.branch.last_revision()] }
83 else:83 else:
84 parents = []84 parents = {}
85 tarball_filenames = _get_tarballs(tree, tarball,85 tarball_filenames = _get_tarballs(tree, tarball,
86 package_name, version, use_v3=use_v3)86 package_name, version, use_v3=use_v3)
87 db = import_dsc.DistributionBranch(tree.branch, tree.branch, tree=tree,87 db = import_dsc.DistributionBranch(tree.branch, tree.branch, tree=tree,
8888
=== modified file 'import_dsc.py'
--- import_dsc.py 2011-09-09 13:20:42 +0000
+++ import_dsc.py 2011-09-27 00:50:26 +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(
778 version.upstream_version, tarballs)788 package, 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
@@ -814,25 +829,31 @@
814 # TODO: this method needs a lot of work for when we will make829 # TODO: this method needs a lot of work for when we will make
815 # the branches writeable by others.830 # the branches writeable by others.
816 assert isinstance(version, str)831 assert isinstance(version, str)
817 mutter("Importing upstream version %s from %s with parents %s" \832 mutter("Importing upstream version %s from %s with parents %r" \
818 % (version, upstream_part, str(upstream_parents)))833 % (version, upstream_part, upstream_parents))
819 assert self.pristine_upstream_tree is not None, \834 assert self.pristine_upstream_tree is not None, \
820 "Can't import upstream with no tree"835 "Can't import upstream with no tree"
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 parents = upstream_parents.get(component, [])
840 if upstream_revisions is not None:
841 revid = upstream_revisions[component]
842 else:
843 revid = None
824 upstream_trees = [o.pristine_upstream_branch.basis_tree()844 upstream_trees = [o.pristine_upstream_branch.basis_tree()
825 for o in other_branches]845 for o in other_branches]
826 target_tree = None846 target_tree = None
827 if upstream_branch is not None:847 if upstream_branch is not None:
828 if upstream_revision is None:848 if revid is None:
829 upstream_revision = upstream_branch.last_revision()849 # FIXME: This is wrong for component tarballs
850 revid = upstream_branch.last_revision()
830 self.pristine_upstream_branch.fetch(upstream_branch,851 self.pristine_upstream_branch.fetch(upstream_branch,
831 last_revision=upstream_revision)852 last_revision=revid)
832 upstream_branch.tags.merge_to(self.pristine_upstream_branch.tags)853 upstream_branch.tags.merge_to(self.pristine_upstream_branch.tags)
833 upstream_parents.append(upstream_revision)854 parents.append(revid)
834 target_tree = self.pristine_upstream_branch.repository.revision_tree(855 target_tree = self.pristine_upstream_branch.repository.revision_tree(
835 upstream_revision)856 revid)
836 if file_ids_from is not None:857 if file_ids_from is not None:
837 upstream_trees = file_ids_from + upstream_trees858 upstream_trees = file_ids_from + upstream_trees
838 if self.tree:859 if self.tree:
@@ -841,8 +862,8 @@
841 else:862 else:
842 self_tree = self.branch.basis_tree()863 self_tree = self.branch.basis_tree()
843 self_tree.lock_read()864 self_tree.lock_read()
844 if len(upstream_parents) > 0:865 if len(parents) > 0:
845 parent_revid = upstream_parents[0]866 parent_revid = parents[0]
846 else:867 else:
847 parent_revid = NULL_REVISION868 parent_revid = NULL_REVISION
848 self.pristine_upstream_tree.pull(self.pristine_upstream_tree.branch,869 self.pristine_upstream_tree.pull(self.pristine_upstream_tree.branch,
@@ -857,16 +878,22 @@
857 target_tree=target_tree)878 target_tree=target_tree)
858 finally:879 finally:
859 self_tree.unlock()880 self_tree.unlock()
881 if component is None:
882 exclude = [tb[1] for tb in upstream_tarballs if tb[1] is not None]
883 else:
884 exclude = []
860 (tag, revid) = self.pristine_upstream_source.import_component_tarball(885 (tag, revid) = self.pristine_upstream_source.import_component_tarball(
861 package, version, self.pristine_upstream_tree, upstream_parents, component,886 package, version, self.pristine_upstream_tree, parents,
862 md5, tarball, author=author, timestamp=timestamp)887 component, md5, tarball, author=author, timestamp=timestamp,
888 exclude=exclude)
889 self.pristine_upstream_branch.generate_revision_history(revid)
863 ret.append((component, tag, revid))890 ret.append((component, tag, revid))
864 self.branch.fetch(self.pristine_upstream_branch)891 self.branch.fetch(self.pristine_upstream_branch)
865 self.branch.tags.set_tag(tag, revid)892 self.branch.tags.set_tag(tag, revid)
866 return ret893 return ret
867894
868 def import_upstream_tarballs(self, tarballs, package, version, parents,895 def import_upstream_tarballs(self, tarballs, package, version, parents,
869 upstream_branch=None, upstream_revision=None):896 upstream_branch=None, upstream_revisions=None):
870 """Import an upstream part to the upstream branch.897 """Import an upstream part to the upstream branch.
871898
872 :param tarballs: List of tarballs / components to extract899 :param tarballs: List of tarballs / components to extract
@@ -876,7 +903,7 @@
876 parents.903 parents.
877 :param upstream_branch: An upstream branch to associate with the904 :param upstream_branch: An upstream branch to associate with the
878 tarball.905 tarball.
879 :param upstream_revision: Upstream revision id906 :param upstream_revisions: Upstream revision ids dictionary
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.
881 :return: list with (component, tag, revid) tuples908 :return: list with (component, tag, revid) tuples
882 """909 """
@@ -885,7 +912,7 @@
885 return self.import_upstream(tarball_dir, package, version, parents,912 return self.import_upstream(tarball_dir, package, version, parents,
886 tarballs,913 tarballs,
887 upstream_branch=upstream_branch,914 upstream_branch=upstream_branch,
888 upstream_revision=upstream_revision)915 upstream_revisions=upstream_revisions)
889 finally:916 finally:
890 shutil.rmtree(tarball_dir)917 shutil.rmtree(tarball_dir)
891918
@@ -1052,8 +1079,11 @@
1052 pull_branch = pull_parents[1][0]1079 pull_branch = pull_parents[1][0]
1053 pull_version = pull_parents[1][1]1080 pull_version = pull_parents[1][1]
1054 if not pull_branch.is_version_native(pull_version):1081 if not pull_branch.is_version_native(pull_version):
1055 pull_revid = pull_branch.pristine_upstream_source.version_as_revision(1082 pull_revids = pull_branch.pristine_upstream_source.version_as_revisions(
1056 package, pull_version.upstream_version)1083 package, pull_version.upstream_version)
1084 if pull_revids.keys() != [None]:
1085 raise MultipleUpstreamTarballsNotSupported()
1086 pull_revid = pull_revids[None]
1057 mutter("Initialising upstream from %s, version %s",1087 mutter("Initialising upstream from %s, version %s",
1058 str(pull_branch), str(pull_version))1088 str(pull_branch), str(pull_version))
1059 parents.append(pull_revid)1089 parents.append(pull_revid)
@@ -1062,7 +1092,8 @@
1062 last_revision=pull_revid)1092 last_revision=pull_revid)
1063 pull_branch.pristine_upstream_branch.tags.merge_to(1093 pull_branch.pristine_upstream_branch.tags.merge_to(
1064 self.pristine_upstream_branch.tags)1094 self.pristine_upstream_branch.tags)
1065 return parents1095 # FIXME: What about other versions ?
1096 return { None: parents }
10661097
1067 def get_changelog_from_source(self, dir):1098 def get_changelog_from_source(self, dir):
1068 cl_filename = os.path.join(dir, "debian", "changelog")1099 cl_filename = os.path.join(dir, "debian", "changelog")
@@ -1245,16 +1276,16 @@
1245 finally:1276 finally:
1246 extractor.cleanup()1277 extractor.cleanup()
12471278
1248 def extract_upstream_tree(self, upstream_tip, basedir):1279 def extract_upstream_tree(self, upstream_tips, basedir):
1249 """Extract upstream_tip to a tempdir as a working tree."""1280 """Extract upstream_tip to a tempdir as a working tree."""
1250 # TODO: should stack rather than trying to use the repository,1281 # TODO: should stack rather than trying to use the repository,
1251 # as that will be more efficient.1282 # as that will be more efficient.
1252 # TODO: remove the _extract_upstream_tree alias below.
1253 to_location = os.path.join(basedir, "upstream")1283 to_location = os.path.join(basedir, "upstream")
1254 # Use upstream_branch if it has been set, otherwise self.branch.1284 # Use upstream_branch if it has been set, otherwise self.branch.
1255 source_branch = self.pristine_upstream_branch or self.branch1285 source_branch = self.pristine_upstream_branch or self.branch
1286 assert upstream_tips.keys() == [None]
1256 dir_to = source_branch.bzrdir.sprout(to_location,1287 dir_to = source_branch.bzrdir.sprout(to_location,
1257 revision_id=upstream_tip,1288 revision_id=upstream_tips[None],
1258 accelerator_tree=self.tree)1289 accelerator_tree=self.tree)
1259 try:1290 try:
1260 self.pristine_upstream_tree = dir_to.open_workingtree()1291 self.pristine_upstream_tree = dir_to.open_workingtree()
@@ -1263,8 +1294,6 @@
1263 self.pristine_upstream_tree = dir_to.create_workingtree()1294 self.pristine_upstream_tree = dir_to.create_workingtree()
1264 self.pristine_upstream_branch = self.pristine_upstream_tree.branch1295 self.pristine_upstream_branch = self.pristine_upstream_tree.branch
12651296
1266 _extract_upstream_tree = extract_upstream_tree
1267
1268 def _create_empty_upstream_tree(self, basedir):1297 def _create_empty_upstream_tree(self, basedir):
1269 to_location = os.path.join(basedir, "upstream")1298 to_location = os.path.join(basedir, "upstream")
1270 to_transport = get_transport(to_location)1299 to_transport = get_transport(to_location)
@@ -1314,7 +1343,7 @@
1314 assert isinstance(previous_version, str), \1343 assert isinstance(previous_version, str), \
1315 "Should pass upstream version as str, not Version."1344 "Should pass upstream version as str, not Version."
1316 try:1345 try:
1317 upstream_tip = self.pristine_upstream_source.version_as_revision(1346 upstream_tips = self.pristine_upstream_source.version_as_revisions(
1318 package, previous_version)1347 package, previous_version)
1319 except PackageVersionNotPresent:1348 except PackageVersionNotPresent:
1320 raise BzrCommandError("Unable to find the tag for the "1349 raise BzrCommandError("Unable to find the tag for the "
@@ -1322,10 +1351,16 @@
1322 "%s" % (1351 "%s" % (
1323 previous_version,1352 previous_version,
1324 self.pristine_upstream_source.tag_name(previous_version)))1353 self.pristine_upstream_source.tag_name(previous_version)))
1325 self.extract_upstream_tree(upstream_tip, tempdir)1354 self.extract_upstream_tree(upstream_tips, tempdir)
1355
1356 def has_merged_upstream_revisions(self, this_revision, upstream_repository, upstream_revisions):
1357 graph = self.branch.repository.get_graph(
1358 other_repository=upstream_repository)
1359 return all(graph.is_ancestor(upstream_revision, this_revision)
1360 for upstream_revision in upstream_revisions.values())
13261361
1327 def merge_upstream(self, tarball_filenames, package, version, previous_version,1362 def merge_upstream(self, tarball_filenames, package, version, previous_version,
1328 upstream_branch=None, upstream_revision=None, merge_type=None,1363 upstream_branch=None, upstream_revisions=None, merge_type=None,
1329 force=False):1364 force=False):
1330 assert isinstance(version, str), \1365 assert isinstance(version, str), \
1331 "Should pass version as str not %s" % str(type(version))1366 "Should pass version as str not %s" % str(type(version))
@@ -1344,12 +1379,10 @@
1344 upstream_branch.lock_read()1379 upstream_branch.lock_read()
1345 try:1380 try:
1346 if upstream_branch is not None:1381 if upstream_branch is not None:
1347 if upstream_revision is None:1382 if upstream_revisions is None:
1348 upstream_revision = upstream_branch.last_revision()1383 upstream_revisions = { None: upstream_branch.last_revision() }
1349 graph = self.branch.repository.get_graph(1384 if (not force and
1350 other_repository=upstream_branch.repository)1385 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 UpstreamBranchAlreadyMerged1386 raise UpstreamBranchAlreadyMerged
1354 upstream_tarballs = [1387 upstream_tarballs = [
1355 (os.path.abspath(fn), component, md5sum_filename(fn)) for1388 (os.path.abspath(fn), component, md5sum_filename(fn)) for
@@ -1358,13 +1391,14 @@
1358 tarball_dir = self._extract_tarballs_to_tempdir(upstream_tarballs)1391 tarball_dir = self._extract_tarballs_to_tempdir(upstream_tarballs)
1359 try:1392 try:
1360 # FIXME: should use upstream_parents()?1393 # FIXME: should use upstream_parents()?
1361 parents = []1394 parents = { None: [] }
1362 if self.pristine_upstream_branch.last_revision() != NULL_REVISION:1395 if self.pristine_upstream_branch.last_revision() != NULL_REVISION:
1363 parents = [self.pristine_upstream_branch.last_revision()]1396 parents = { None: [self.pristine_upstream_branch.last_revision()] }
1364 for (component, tag, revid) in self.import_upstream(tarball_dir,1397 for (component, tag, revid) in self.import_upstream(tarball_dir,
1365 package, version, parents, upstream_tarballs=upstream_tarballs,1398 package, version, parents,
1399 upstream_tarballs=upstream_tarballs,
1366 upstream_branch=upstream_branch,1400 upstream_branch=upstream_branch,
1367 upstream_revision=upstream_revision):1401 upstream_revisions=upstream_revisions):
1368 self._fetch_upstream_to_branch(revid)1402 self._fetch_upstream_to_branch(revid)
1369 finally:1403 finally:
1370 shutil.rmtree(tarball_dir)1404 shutil.rmtree(tarball_dir)
@@ -1377,10 +1411,10 @@
1377 # missing a proper history link and a criss-cross merge1411 # missing a proper history link and a criss-cross merge
1378 # then recurses and finds no deeper ancestor.1412 # then recurses and finds no deeper ancestor.
1379 # Use the previous upstream import as the from revision1413 # Use the previous upstream import as the from revision
1380 if len(parents) == 0:1414 if len(parents[None]) == 0:
1381 from_revision = NULL_REVISION1415 from_revision = NULL_REVISION
1382 else:1416 else:
1383 from_revision = parents[0]1417 from_revision = parents[None][0]
1384 conflicts = self.tree.merge_from_branch(1418 conflicts = self.tree.merge_from_branch(
1385 self.pristine_upstream_branch, merge_type=merge_type,1419 self.pristine_upstream_branch, merge_type=merge_type,
1386 from_revision=from_revision)1420 from_revision=from_revision)
13871421
=== modified file 'merge_package.py'
--- merge_package.py 2011-06-15 13:21:22 +0000
+++ merge_package.py 2011-09-27 00:50:26 +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/blackbox/test_merge_upstream.py'
--- tests/blackbox/test_merge_upstream.py 2011-07-20 19:14:43 +0000
+++ tests/blackbox/test_merge_upstream.py 2011-09-27 00:50:26 +0000
@@ -98,7 +98,7 @@
98 [(self.tar.tarball, None, md5sum_filename(self.tar.tarball))],98 [(self.tar.tarball, None, md5sum_filename(self.tar.tarball))],
99 "foo",99 "foo",
100 str(self.tar.version),100 str(self.tar.version),
101 [tree.branch.last_revision()])101 { None: [tree.branch.last_revision()]} )
102 package_builder = SourcePackageBuilder("foo",102 package_builder = SourcePackageBuilder("foo",
103 str(self.tar.version)+"-1")103 str(self.tar.version)+"-1")
104 package_builder.add_default_control()104 package_builder.add_default_control()
105105
=== 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-27 00:50:26 +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=[]):
@@ -785,7 +787,7 @@
785 element in contents]787 element in contents]
786 self.build_tree_contents(contents)788 self.build_tree_contents(contents)
787 self.db1.import_upstream(basedir, "package", version.upstream_version,789 self.db1.import_upstream(basedir, "package", version.upstream_version,
788 [], [(None, None, None)])790 {}, [(None, None, None)])
789 return version791 return version
790792
791 def test_import_upstream(self):793 def test_import_upstream(self):
@@ -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))
@@ -819,7 +821,7 @@
819 write_to_file(os.path.join(basedir, "README"), "Hi\n")821 write_to_file(os.path.join(basedir, "README"), "Hi\n")
820 write_to_file(os.path.join(basedir, "BUGS"), "")822 write_to_file(os.path.join(basedir, "BUGS"), "")
821 write_to_file(os.path.join(basedir, "COPYING"), "")823 write_to_file(os.path.join(basedir, "COPYING"), "")
822 self.db1.import_upstream(basedir, "package", version1.upstream_version, [],824 self.db1.import_upstream(basedir, "package", version1.upstream_version, {},
823 [(None, None, None)])825 [(None, None, None)])
824 basedir = name + "-" + str(version2.upstream_version)826 basedir = name + "-" + str(version2.upstream_version)
825 os.mkdir(basedir)827 os.mkdir(basedir)
@@ -827,13 +829,15 @@
827 write_to_file(os.path.join(basedir, "BUGS"), "")829 write_to_file(os.path.join(basedir, "BUGS"), "")
828 write_to_file(os.path.join(basedir, "NEWS"), "")830 write_to_file(os.path.join(basedir, "NEWS"), "")
829 self.db1.import_upstream(basedir, "package", version2.upstream_version,831 self.db1.import_upstream(basedir, "package", version2.upstream_version,
830 [self.up_tree1.branch.last_revision()], [(None, None, None)])832 { None: [self.up_tree1.branch.last_revision()] }, [(None, None, None)])
831 tree = self.up_tree1833 tree = self.up_tree1
832 branch = tree.branch834 branch = tree.branch
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))
@@ -858,14 +862,14 @@
858 tf.add(basedir)862 tf.add(basedir)
859 finally:863 finally:
860 tf.close()864 tf.close()
861 self.db1.import_upstream(basedir, "package", version.upstream_version, [],865 self.db1.import_upstream(basedir, "package", version.upstream_version, {},
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)])
863 tree = self.up_tree1867 tree = self.up_tree1
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))
@@ -887,13 +891,13 @@
887 finally:891 finally:
888 tf.close()892 tf.close()
889 self.db1.import_upstream(basedir, "package", version.upstream_version,893 self.db1.import_upstream(basedir, "package", version.upstream_version,
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)])
891 tree = self.up_tree1895 tree = self.up_tree1
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))
@@ -936,13 +940,13 @@
936 finally:940 finally:
937 f.close()941 f.close()
938 self.db1.import_upstream(basedir, "package", version.upstream_version,942 self.db1.import_upstream(basedir, "package", version.upstream_version,
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)])
940 tree = self.up_tree1944 tree = self.up_tree1
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-27 00:50:26 +0000
@@ -25,7 +25,6 @@
25from base64 import standard_b64encode25from base64 import standard_b64encode
2626
27import bz227import bz2
28import gzip
29import os28import os
30import tarfile29import tarfile
31import zipfile30import zipfile
@@ -432,6 +431,20 @@
432 self.tree.commit("msg")431 self.tree.commit("msg")
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"))
434433
434 def test_version_as_revisions(self):
435 revid1 = self.tree.commit("msg")
436 self.tree.branch.tags.set_tag("2.1", self.tree.branch.last_revision())
437 config = DebBuildConfig(
438 [('user.conf', True), ('default.conf', False)],
439 branch=self.tree.branch)
440 source = UpstreamBranchSource(self.tree.branch,
441 {"2.1": self.tree.branch.last_revision()},
442 config=config)
443 revid2 = self.tree.commit("msg")
444 self.assertEquals(revid2,
445 source.version_as_revision("foo", "2.1+bzr2"))
446 self.assertEquals({None: revid1}, source.version_as_revisions("foo", "2.1"))
447
435 def test_version_as_revision(self):448 def test_version_as_revision(self):
436 revid1 = self.tree.commit("msg")449 revid1 = self.tree.commit("msg")
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())
@@ -699,14 +712,24 @@
699class TestUpstreamTagVersion(TestCase):712class TestUpstreamTagVersion(TestCase):
700713
701 def test_simple_upstream(self):714 def test_simple_upstream(self):
702 self.assertEqual('2.1', upstream_tag_version('upstream-2.1'))715 self.assertEqual((None, '2.1'), upstream_tag_version('upstream-2.1'))
703716
704 def test_distro_upstream(self):717 def test_distro_upstream(self):
705 self.assertEqual('2.1',718 self.assertEqual((None, '2.1'),
706 upstream_tag_version('upstream-debian-2.1'))719 upstream_tag_version('upstream-debian-2.1'))
707720
708 def test_git_upstream(self):721 def test_git_upstream(self):
709 self.assertEqual('2.1', upstream_tag_version('upstream/2.1'))722 self.assertEqual((None, '2.1'), upstream_tag_version('upstream/2.1'))
723
724 def test_git_upstream_component(self):
725 self.assertEqual(("lib", '2.1'), upstream_tag_version('upstream/2.1/lib'))
726
727 def test_simple_upstream_component(self):
728 self.assertEqual(("lib", '2.1'), upstream_tag_version('upstream-2.1/lib'))
729
730 def test_distro_upstream_component(self):
731 self.assertEqual(("lib", '2.1'),
732 upstream_tag_version('upstream-debian-2.1/lib'))
710733
711734
712class PristineTarSourceTests(TestCaseWithTransport):735class PristineTarSourceTests(TestCaseWithTransport):
@@ -766,14 +789,31 @@
766 rev.properties["deb-pristine-delta"] = standard_b64encode("bla")789 rev.properties["deb-pristine-delta"] = standard_b64encode("bla")
767 self.assertEquals("bla", self.source.pristine_tar_delta(rev))790 self.assertEquals("bla", self.source.pristine_tar_delta(rev))
768791
769 def test_version_as_revision_missing(self):792 def test_version_as_revisions_missing(self):
770 self.assertRaises(PackageVersionNotPresent,793 self.assertRaises(PackageVersionNotPresent,
771 self.source.version_as_revision, None, "1.2")794 self.source.version_as_revisions, None, "1.2")
772795
773 def test_version_as_revision(self):796 def test_version_as_revisions_single(self):
774 revid1 = self.tree.commit("msg")797 revid1 = self.tree.commit("msg")
775 self.tree.branch.tags.set_tag("upstream-2.1", revid1)798 self.tree.branch.tags.set_tag("upstream-2.1", revid1)
776 self.assertEquals(revid1, self.source.version_as_revision(None, "2.1"))799 self.assertEquals({None: revid1},
800 self.source.version_as_revisions(None, "2.1"))
801
802 def test_version_component_as_revision(self):
803 revid1 = self.tree.commit("msg")
804 self.tree.branch.tags.set_tag("upstream-2.1/lib", revid1)
805 self.assertEquals(revid1,
806 self.source.version_component_as_revision(None, "2.1", "lib"))
807
808 def test_version_as_revisions(self):
809 revid1 = self.tree.commit("msg")
810 revid2 = self.tree.commit("msg")
811 self.tree.branch.tags.set_tag("upstream-2.1", revid1)
812 self.tree.branch.tags.set_tag("upstream-2.1/lib", revid2)
813 self.assertEquals({ None: revid1, "lib": revid2 },
814 self.source.version_as_revisions(None, "2.1", [
815 ("upstream_2.1.orig.tar.gz", None, "somemd5sum"),
816 ("upstream_2.1.orig-lib.tar.gz", "lib", "othermd5sum")]))
777817
778818
779class TarfileSourceTests(TestCaseWithTransport):819class TarfileSourceTests(TestCaseWithTransport):
780820
=== modified file 'upstream/__init__.py'
--- upstream/__init__.py 2011-09-07 20:11:50 +0000
+++ upstream/__init__.py 2011-09-27 00:50:26 +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.
@@ -94,12 +95,14 @@
94 """95 """
95 raise NotImplementedError(self.has_version)96 raise NotImplementedError(self.has_version)
9697
97 def fetch_tarballs(self, package, version, target_dir):98 def fetch_tarballs(self, package, version, target_dir, components=None):
98 """Fetch the source tarball for a particular version.99 """Fetch the source tarball for a particular version.
99100
100 :param package: Name of the package101 :param package: Name of the package
101 :param version: Version string of the version to fetch102 :param version: Version string of the version to fetch
102 :param target_dir: Directory in which to store the tarball103 :param target_dir: Directory in which to store the tarball
104 :param components: List of component names to fetch; may be None,
105 in which case the backend will have to find out.
103 :return: Paths of the fetched tarballs106 :return: Paths of the fetched tarballs
104 """107 """
105 raise NotImplementedError(self.fetch_tarballs)108 raise NotImplementedError(self.fetch_tarballs)
@@ -113,7 +116,7 @@
113 """Upstream source that uses apt-source."""116 """Upstream source that uses apt-source."""
114117
115 def fetch_tarballs(self, package, upstream_version, target_dir,118 def fetch_tarballs(self, package, upstream_version, target_dir,
116 _apt_pkg=None):119 _apt_pkg=None, components=None):
117 if _apt_pkg is None:120 if _apt_pkg is None:
118 import apt_pkg121 import apt_pkg
119 else:122 else:
@@ -197,7 +200,7 @@
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)
198 return None201 return None
199202
200 def fetch_tarballs(self, package, version, target_dir):203 def fetch_tarballs(self, package, version, target_dir, components=None):
201 if self.larstiq:204 if self.larstiq:
202 rules_name = 'rules'205 rules_name = 'rules'
203 else:206 else:
@@ -279,7 +282,7 @@
279 os.unlink(tempfilename)282 os.unlink(tempfilename)
280 return self._xml_report_extract_upstream_version(stdout)283 return self._xml_report_extract_upstream_version(stdout)
281284
282 def fetch_tarballs(self, package, version, target_dir):285 def fetch_tarballs(self, package, version, target_dir, components=None):
283 note("Using uscan to look for the upstream tarball.")286 note("Using uscan to look for the upstream tarball.")
284 try:287 try:
285 tempfilename = self._export_watchfile()288 tempfilename = self._export_watchfile()
@@ -326,7 +329,7 @@
326 finally:329 finally:
327 shutil.rmtree(tmpdir)330 shutil.rmtree(tmpdir)
328331
329 def fetch_tarballs(self, package, version, target_dir):332 def fetch_tarballs(self, package, version, target_dir, components=None):
330 note("Using the current branch without the 'debian' directory "333 note("Using the current branch without the 'debian' directory "
331 "to create the tarball")334 "to create the tarball")
332 tarball_path = self._tarball_path(package, version, None, target_dir)335 tarball_path = self._tarball_path(package, version, None, target_dir)
@@ -346,10 +349,10 @@
346 def __repr__(self):349 def __repr__(self):
347 return "%s(%r)" % (self.__class__.__name__, self._sources)350 return "%s(%r)" % (self.__class__.__name__, self._sources)
348351
349 def fetch_tarballs(self, package, version, target_dir):352 def fetch_tarballs(self, package, version, target_dir, components=None):
350 for source in self._sources:353 for source in self._sources:
351 try:354 try:
352 paths = source.fetch_tarballs(package, version, target_dir)355 paths = source.fetch_tarballs(package, version, target_dir, components)
353 except PackageVersionNotPresent:356 except PackageVersionNotPresent:
354 pass357 pass
355 else:358 else:
@@ -496,7 +499,7 @@
496 self.path = path499 self.path = path
497 self.version = version500 self.version = version
498501
499 def fetch_tarballs(self, package, version, target_dir):502 def fetch_tarballs(self, package, version, target_dir, components=None):
500 if version != self.version:503 if version != self.version:
501 raise PackageVersionNotPresent(package, version, self)504 raise PackageVersionNotPresent(package, version, self)
502 dest_name = new_tarball_name(package, version, self.path)505 dest_name = new_tarball_name(package, version, self.path)
@@ -541,7 +544,7 @@
541 else:544 else:
542 self.project = project545 self.project = project
543546
544 def fetch_tarballs(self, package, version, target_dir):547 def fetch_tarballs(self, package, version, target_dir, components=None):
545 release = self.project.getRelease(version=version)548 release = self.project.getRelease(version=version)
546 if release is None:549 if release is None:
547 raise PackageVersionNotPresent(package, version, self)550 raise PackageVersionNotPresent(package, version, self)
548551
=== modified file 'upstream/branch.py'
--- upstream/branch.py 2011-06-26 21:02:48 +0000
+++ upstream/branch.py 2011-09-27 00:50:26 +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())
@@ -254,7 +264,7 @@
254 finally:264 finally:
255 self.upstream_branch.unlock()265 self.upstream_branch.unlock()
256266
257 def fetch_tarballs(self, package, version, target_dir):267 def fetch_tarballs(self, package, version, target_dir, components=None):
258 self.upstream_branch.lock_read()268 self.upstream_branch.lock_read()
259 try:269 try:
260 revid = self.version_as_revision(package, version)270 revid = self.version_as_revision(package, version)
261271
=== modified file 'upstream/pristinetar.py'
--- upstream/pristinetar.py 2011-09-09 13:20:42 +0000
+++ upstream/pristinetar.py 2011-09-27 00:50:26 +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 )
@@ -156,42 +160,35 @@
156 self.branch.tags.set_tag(tag_name, revid)160 self.branch.tags.set_tag(tag_name, revid)
157 return tag_name, revid161 return tag_name, revid
158162
159 def import_tarballs(self, package, version, tree, parent_ids, tarballs,
160 timestamp=None, author=None):
161 """Import the upstream tarballs.
162
163 :param package: Package name
164 :param version: Package version
165 :param path: Path with tree to import
166 :param parent_ids: Parent revisions
167 :param tarballs: List of (path, component, md5)
168 :param timestamp: Optional timestamp for new commits
169 :param author: Optional author for new commits
170 :return: List of tuples with (component, tag, revid)
171 """
172 ret = []
173 for (tarball, component, md5) in tarballs:
174 (tag, revid) = self.import_component_tarball(
175 package, version, tree, parent_ids, component,
176 md5, tarball, author=author, timestamp=timestamp)
177 ret.append((component, tag, revid))
178 return ret
179
180 def import_component_tarball(self, package, version, tree, parent_ids,163 def import_component_tarball(self, package, version, tree, parent_ids,
181 component=None, md5=None, tarball=None, author=None, timestamp=None):164 component=None, md5=None, tarball=None, author=None, timestamp=None,
165 subdir=None, exclude=None):
182 """Import a tarball.166 """Import a tarball.
183167
184 :param package: Package name168 :param package: Package name
185 :param version: Upstream version169 :param version: Upstream version
170 :param parent_ids: Dictionary mapping component names to revision ids
186 :param component: Component name (None for base)171 :param component: Component name (None for base)
172 :param exclude: Exclude directories
187 """173 """
188 if component is not None:174 if exclude is None:
189 raise BzrError("Importing non-base tarballs not yet supported")175 exclude = []
190 tree.set_parent_ids(parent_ids)176 def include_change(c):
177 if not exclude:
178 return True
179 path = c[1][1]
180 if path is None:
181 return True
182 for e in exclude:
183 if path == e or path.startswith(e+"/"):
184 return False
185 else:
186 return True
191 revprops = {}187 revprops = {}
192 if md5 is not None:188 if md5 is not None:
193 revprops["deb-md5"] = md5189 revprops["deb-md5"] = md5
194 delta = self.make_pristine_tar_delta(tree, tarball)190 delta = self.make_pristine_tar_delta(tree, tarball, subdir=subdir,
191 exclude=exclude)
195 uuencoded = standard_b64encode(delta)192 uuencoded = standard_b64encode(delta)
196 if tarball.endswith(".tar.bz2"):193 if tarball.endswith(".tar.bz2"):
197 revprops["deb-pristine-delta-bz2"] = uuencoded194 revprops["deb-pristine-delta-bz2"] = uuencoded
@@ -208,9 +205,32 @@
208 message = "Import upstream version %s" % (version,)205 message = "Import upstream version %s" % (version,)
209 if component is not None:206 if component is not None:
210 message += ", component %s" % component207 message += ", component %s" % component
211 revid = tree.commit(message, revprops=revprops, timestamp=timestamp,208 if len(parent_ids) == 0:
212 timezone=timezone)209 base_revid = _mod_revision.NULL_REVISION
213 tag_name, _ = self.tag_version(version, revid=revid)210 else:
211 base_revid = parent_ids[0]
212 basis_tree = tree.branch.repository.revision_tree(base_revid)
213 tree.lock_write()
214 try:
215 builder = tree.branch.get_commit_builder(parents=parent_ids,
216 revprops=revprops, timestamp=timestamp, timezone=timezone)
217 builder.will_record_deletes()
218 try:
219 changes = [c for c in tree.iter_changes(basis_tree) if
220 include_change(c)]
221 list(builder.record_iter_changes(tree, base_revid, changes))
222 builder.finish_inventory()
223 except:
224 builder.abort()
225 raise
226 revid = builder.commit(message)
227 tag_name, _ = self.tag_version(version, revid=revid, component=component)
228 tree.update_basis_by_delta(revid, builder.get_basis_delta())
229 finally:
230 tree.unlock()
231 mutter(
232 'imported %s version %s component %r as revid %s, tagged %s',
233 package, version, component, revid, tag_name)
214 return tag_name, revid234 return tag_name, revid
215235
216 def fetch_component_tarball(self, package, version, component, target_dir):236 def fetch_component_tarball(self, package, version, component, target_dir):
@@ -219,13 +239,13 @@
219 rev = self.branch.repository.get_revision(revid)239 rev = self.branch.repository.get_revision(revid)
220 except NoSuchRevision:240 except NoSuchRevision:
221 raise PackageVersionNotPresent(package, version, self)241 raise PackageVersionNotPresent(package, version, self)
222 note("Using pristine-tar to reconstruct the needed tarball.")
223 if self.has_pristine_tar_delta(rev):242 if self.has_pristine_tar_delta(rev):
224 format = self.pristine_tar_format(rev)243 format = self.pristine_tar_format(rev)
225 else:244 else:
226 format = 'gz'245 format = 'gz'
227 target_filename = self._tarball_path(package, version, component,246 target_filename = self._tarball_path(package, version, component,
228 target_dir, format=format)247 target_dir, format=format)
248 note("Using pristine-tar to reconstruct %s.", os.path.basename(target_filename))
229 try:249 try:
230 self.reconstruct_pristine_tar(revid, package, version, target_filename)250 self.reconstruct_pristine_tar(revid, package, version, target_filename)
231 except PristineTarError:251 except PristineTarError:
@@ -234,8 +254,15 @@
234 raise PackageVersionNotPresent(package, version, self)254 raise PackageVersionNotPresent(package, version, self)
235 return target_filename255 return target_filename
236256
237 def fetch_tarballs(self, package, version, target_dir):257 def fetch_tarballs(self, package, version, target_dir, components=None):
238 return [self.fetch_component_tarball(package, version, None, target_dir)]258 if components is None:
259 # Scan tags for components
260 try:
261 components = self._components_by_version()[version].keys()
262 except KeyError:
263 raise PackageVersionNotPresent(package, version, self)
264 return [self.fetch_component_tarball(package, version, component, target_dir)
265 for component in components]
239266
240 def _has_revision(self, revid, md5=None):267 def _has_revision(self, revid, md5=None):
241 self.branch.lock_read()268 self.branch.lock_read()
@@ -256,14 +283,16 @@
256 "revision %s", revid)283 "revision %s", revid)
257 return True284 return True
258285
259 def version_as_revision(self, package, version, tarballs=None):286 def version_as_revisions(self, package, version, tarballs=None):
260 if tarballs is None:287 if tarballs is None:
261 return self.version_component_as_revision(package, version, component=None)288 # FIXME: What if there are multiple tarballs?
262 elif len(tarballs) > 1:289 return {
263 raise MultipleUpstreamTarballsNotSupported()290 None: self.version_component_as_revision(package, version, component=None) }
264 else:291 ret = {}
265 return self.version_component_as_revision(package, version, tarballs[0][1],292 for (tarball, component, md5) in tarballs:
266 tarballs[0][2])293 ret[component] = self.version_component_as_revision(
294 package, version, component, md5)
295 return ret
267296
268 def version_component_as_revision(self, package, version, component, md5=None):297 def version_component_as_revision(self, package, version, component, md5=None):
269 assert isinstance(version, str)298 assert isinstance(version, str)
@@ -359,7 +388,7 @@
359 finally:388 finally:
360 shutil.rmtree(tmpdir)389 shutil.rmtree(tmpdir)
361390
362 def make_pristine_tar_delta(self, tree, tarball_path):391 def make_pristine_tar_delta(self, tree, tarball_path, subdir=None, exclude=None):
363 tmpdir = tempfile.mkdtemp(prefix="builddeb-pristine-")392 tmpdir = tempfile.mkdtemp(prefix="builddeb-pristine-")
364 try:393 try:
365 dest = os.path.join(tmpdir, "orig")394 dest = os.path.join(tmpdir, "orig")
@@ -367,22 +396,29 @@
367 try:396 try:
368 for (dp, ie) in tree.inventory.iter_entries():397 for (dp, ie) in tree.inventory.iter_entries():
369 ie._read_tree_state(dp, tree)398 ie._read_tree_state(dp, tree)
370 export(tree, dest, format='dir')399 export(tree, dest, format='dir', subdir=subdir)
371 finally:400 finally:
372 tree.unlock()401 tree.unlock()
373 return make_pristine_tar_delta(dest, tarball_path)402 return make_pristine_tar_delta(dest, tarball_path)
374 finally:403 finally:
375 shutil.rmtree(tmpdir)404 shutil.rmtree(tmpdir)
376405
406 def _components_by_version(self):
407 ret = {}
408 for tag_name, tag_revid in self.branch.tags.get_tag_dict().iteritems():
409 if not is_upstream_tag(tag_name):
410 continue
411 (component, version) = upstream_tag_version(tag_name)
412 ret.setdefault(version, {})[component] = tag_revid
413 return ret
414
377 def iter_versions(self):415 def iter_versions(self):
378 """Iterate over all upstream versions.416 """Iterate over all upstream versions.
379417
380 :return: Iterator over (tag_name, version, revid) tuples418 :return: Iterator over (tag_name, version, revid) tuples
381 """419 """
382 for tag_name, tag_revid in self.branch.tags.get_tag_dict().iteritems():420 ret = self._components_by_version()
383 if not is_upstream_tag(tag_name):421 return ret.iteritems()
384 continue
385 yield (tag_name, upstream_tag_version(tag_name), tag_revid)
386422
387423
388def is_upstream_tag(tag):424def is_upstream_tag(tag):
@@ -398,7 +434,7 @@
398 """Return the upstream version portion of an upstream tag name.434 """Return the upstream version portion of an upstream tag name.
399435
400 :param tag: The string name of the tag.436 :param tag: The string name of the tag.
401 :return: The version portion of the tag.437 :return: tuple with version portion of the tag and component name
402 """438 """
403 assert is_upstream_tag(tag), "Not an upstream tag: %s" % tag439 assert is_upstream_tag(tag), "Not an upstream tag: %s" % tag
404 if tag.startswith('upstream/'):440 if tag.startswith('upstream/'):
@@ -409,4 +445,9 @@
409 tag = tag[len('debian-'):]445 tag = tag[len('debian-'):]
410 elif tag.startswith('ubuntu-'):446 elif tag.startswith('ubuntu-'):
411 tag = tag[len('ubuntu-'):]447 tag = tag[len('ubuntu-'):]
412 return tag448 if not '/' in tag:
449 return (None, tag)
450 (version, component) = tag.rsplit('/', 1)
451 if component == "":
452 component = None
453 return (component, version)

Subscribers

People subscribed via source and target branches