Rev 452: import-upstream sets the most recent previous tarballs as a parent. in http://people.canonical.com/~robertc/baz2.0/plugins/builddeb/trunk

Robert Collins robertc at robertcollins.net
Tue May 4 03:45:39 BST 2010


At http://people.canonical.com/~robertc/baz2.0/plugins/builddeb/trunk

------------------------------------------------------------
revno: 452
revision-id: robertc at robertcollins.net-20100504024538-lw0gfw5l44molyib
parent: robertc at robertcollins.net-20100503205337-qo85gec2h2hmf87g
committer: Robert Collins <robertc at robertcollins.net>
branch nick: trunk
timestamp: Tue 2010-05-04 14:45:38 +1200
message:
  import-upstream sets the most recent previous tarballs as a parent.
=== modified file 'cmds.py'
--- a/cmds.py	2010-05-03 20:53:37 +0000
+++ b/cmds.py	2010-05-04 02:45:38 +0000
@@ -48,6 +48,7 @@
     )
 from bzrlib.option import Option
 from bzrlib.revisionspec import RevisionSpec
+from bzrlib import revision as mod_revision
 from bzrlib.tag import _merge_tags_if_possible
 from bzrlib.trace import note, warning
 from bzrlib.workingtree import WorkingTree
@@ -91,7 +92,7 @@
         open_file_via_transport,
         tarball_name,
         )
-from bzrlib import revision as mod_revision
+from bzrlib.plugins.builddeb.tagging import *
 
 dont_purge_opt = Option('dont-purge',
     help="Don't purge the build directory after building.")
@@ -791,20 +792,23 @@
             parents = []
         if parents == [mod_revision.NULL_REVISION]:
             parents = []
+        tagged_versions = {}
+        for tag_name, tag_revid in branch.tags.get_tag_dict().iteritems():
+            if not is_upstream_tag(tag_name):
+                continue
+            tag_version = Version(upstream_tag_version(tag_name))
+            tagged_versions[tag_version] = tag_revid
+        tag_order = sorted(tagged_versions.keys())
+        if tag_order:
+            parents.insert(0, tagged_versions[tag_order[-1]])
         if parents:
+            # See bug lp:309682
+            db.upstream_branch.repository.fetch(branch.repository, parents[0])
             db.extract_upstream_tree(parents[0], tempdir)
         else:
             db._create_empty_upstream_tree(tempdir)
         tree = db.get_branch_tip_revtree()
         tree.lock_read()
-        try:
-            try:
-                changelog, _ = find_changelog(tree, False)
-                last_version = changelog.version
-            except MissingChangelogError:
-                last_version = None
-        finally:
-            tree.unlock()
         dbs = DistributionBranchSet()
         dbs.add_branch(db)
         db.import_upstream_tarball(location, version, parents)

=== modified file 'import_dsc.py'
--- a/import_dsc.py	2010-05-03 06:47:42 +0000
+++ b/import_dsc.py	2010-05-04 02:45:38 +0000
@@ -996,12 +996,16 @@
         return revid
 
     def import_upstream_tarball(self, tarball_filename, version, parents,
-        md5sum=None):
+        md5sum=None, upstream_branch=None):
         """Import an upstream part to the upstream branch.
 
         :param tarball_filename: The tarball to import.
         :param version: The upstream version to import.
-        :param parents: The parents to use for the import.
+        :param parents: The tarball-branch parents to use for the import.
+            If an upstream branch is supplied, its automatically added to
+            parents.
+        :param upstream_branch: An upstream branch to associate with the
+            tarball.
         :param md5sum: hex digest of the md5sum of the tarball, if known.
         """
         if not md5sum:
@@ -1009,7 +1013,8 @@
         tarball_dir = self._extract_tarball_to_tempdir(tarball_filename)
         try:
             self.import_upstream(tarball_dir, version, md5sum, parents,
-                upstream_tarball=tarball_filename)
+                upstream_tarball=tarball_filename,
+                upstream_branch=upstream_branch)
         finally:
             shutil.rmtree(tarball_dir)
 

=== added file 'tagging.py'
--- a/tagging.py	1970-01-01 00:00:00 +0000
+++ b/tagging.py	2010-05-04 02:45:38 +0000
@@ -0,0 +1,54 @@
+# Copyright (C) 2010 Canonical Limited
+# vim: ts=4 sts=4 sw=4
+#
+# This file is part of bzr-builddeb.
+#
+# bzr-builddeb is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# bzr-builddeb is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with bzr-builddeb; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+"""Tagging related functions for bzr-builddeb."""
+
+__all__ = ['is_upstream_tag', 'upstream_tag_version']
+
+def is_upstream_tag(tag):
+    """Return true if tag is an upstream tag.
+    
+    :param tag: The string name of the tag.
+    :return: True if the tag name is one generated by upstream tag operations.
+
+    >>> is_upstream_tag('2.1')
+    False
+    >>> is_upstream_tag('upstream-2.1')
+    True
+    """
+    return tag.startswith('upstream-') or tag.startswith('upstream/')
+
+
+def upstream_tag_version(tag):
+    """Return the upstream version portion of an upstream tag name.
+
+    :param tag: The string name of the tag.
+    :return: The version portion of the tag.
+
+    >>> upstream_tag_version('upstream-2.1')
+    '2.1'
+    """
+    if tag.startswith('upstream/'):
+        return tag[9:]
+    segments = tag.split('-')
+    segments.reverse()
+    while not segments[-1][0].isdigit():
+        segments.pop()
+    segments.reverse()
+    return '-'.join(segments)

=== modified file 'tests/__init__.py'
--- a/tests/__init__.py	2010-02-12 15:55:47 +0000
+++ b/tests/__init__.py	2010-05-04 02:45:38 +0000
@@ -125,6 +125,7 @@
             'test_source_distiller',
             'test_upstream',
             'test_util',
+            'test_tagging',
             ]
     suite.addTest(loader.loadTestsFromModuleNames(["%s.%s" % (__name__, i)
                                             for i in testmod_names]))

=== modified file 'tests/blackbox/test_import_dsc.py'
--- a/tests/blackbox/test_import_dsc.py	2010-05-03 03:03:34 +0000
+++ b/tests/blackbox/test_import_dsc.py	2010-05-04 02:45:38 +0000
@@ -32,10 +32,14 @@
 
 class TestBaseImportDsc(BuilddebTestCase):
 
-  upstream_dir = property(lambda self:
-      self.package_name + '-' + self.upstream_version)
+  def _upstream_dir(self, package_name, upstream_version):
+      return package_name + '-' + upstream_version
+  upstream_dir = property(lambda self:self._upstream_dir(self.package_name,
+      self.upstream_version))
+  def _upstream_tarball_name(self, package_name, upstream_version):
+      return package_name + '_' + upstream_version + '.orig.tar.gz'
   upstream_tarball_name = property(lambda self:
-      self.package_name + '_' + self.upstream_version + '.orig.tar.gz')
+      self._upstream_tarball_name(self.package_name, self.upstream_version))
   dsc_name = property(lambda self:
       self.package_name + '_' + str(self.package_version) + '.dsc')
 
@@ -45,9 +49,20 @@
     transport.ensure_base()
     self.build_tree(['README'], transport=transport)
 
-  def make_upstream_tarball(self):
-    self.make_unpacked_upstream_source()
-    tar = tarfile.open(self.upstream_tarball_name, 'w:gz')
+  def get_test_upstream_version(self, upstream_version):
+    """Return the upstream_version to be used in a test helper method."""
+    if upstream_version is None:
+        return self.upstream_version
+    else:
+        return upstream_version
+
+  def make_upstream_tarball(self, upstream_version=None):
+    upstream_version = self.get_test_upstream_version(upstream_version)
+    upstream_dir = self._upstream_dir(self.package_name, upstream_version)
+    self.make_unpacked_upstream_source(get_transport(upstream_dir))
+    tar = tarfile.open(
+        self._upstream_tarball_name(self.package_name, upstream_version),
+        'w:gz')
     try:
       tar.add(self.upstream_dir)
     finally:
@@ -101,5 +116,5 @@
         'package.'], 'import-dsc')
 
 
-# vim: ts=2 sts=2 sw=2
+# vim: ts=4 sts=4 sw=4
 

=== modified file 'tests/blackbox/test_import_upstream.py'
--- a/tests/blackbox/test_import_upstream.py	2010-05-03 06:47:42 +0000
+++ b/tests/blackbox/test_import_upstream.py	2010-05-04 02:45:38 +0000
@@ -25,6 +25,7 @@
 import tarfile
 
 from bzrlib import tests
+from debian_bundle.changelog import Version
 
 from bzrlib.plugins.builddeb.tests.blackbox.test_import_dsc import TestBaseImportDsc
 from bzrlib.plugins.builddeb.tests.test_import_dsc import PristineTarFeature
@@ -32,9 +33,14 @@
 
 class TestImportUpstream(TestBaseImportDsc):
 
-    def assertHasImportArtifacts(self, tree):
-        upstream_tag = 'upstream-%s' % self.upstream_version
-        tags = tree.branch._format.make_tags(tree.branch)
+    def setUp(self):
+        TestBaseImportDsc.setUp(self)
+        self.requireFeature(PristineTarFeature)
+
+    def assertHasImportArtifacts(self, tree, upstream_version=None):
+        upstream_version = self.get_test_upstream_version(upstream_version)
+        upstream_tag = self.upstream_tag(upstream_version)
+        tags = tree.branch.tags
         # If it imported, we have a tag
         imported_rev = tags.lookup_tag(upstream_tag)
         # For a working revision tree
@@ -43,8 +49,41 @@
         self.addCleanup(revtree.unlock)
         return revtree
 
+    def assertUpstreamContentAndFileIdFromTree(self, revtree, fromtree):
+        """Check what content and file ids revtree has."""
+        # that does not have debian/
+        self.assertEqual(None, revtree.path2id('debian'))
+        # and does have the same fileid for README as in tree
+        self.assertNotEqual(None, revtree.path2id('README'))
+        self.assertEqual(fromtree.path2id('README'), revtree.path2id('README'))
+
+    def make_upstream_tree(self):
+        """Make an upstream tree with its own history."""
+        upstreamtree = self.make_branch_and_tree('upstream')
+        self.make_unpacked_upstream_source(transport=upstreamtree.bzrdir.root_transport)
+        upstreamtree.smart_add(['upstream'])
+        upstreamtree.commit('upstream release')
+        return upstreamtree
+
+    def make_upstream_change(self, upstreamtree):
+        """Commit a change to upstreamtree."""
+        # Currently an empty commit, but we may need file content changes to be
+        # thorough?
+        return upstreamtree.commit('new commit')
+
+    def make_workingdir(self):
+        """Make a working directory with both upstream source and debian packaging."""
+        tree = self.make_branch_and_tree('working')
+        self.make_unpacked_upstream_source(transport=tree.bzrdir.root_transport)
+        self.make_debian_dir(tree.bzrdir.root_transport.local_abspath('debian'))
+        tree.smart_add(['working'])
+        tree.commit('save changes')
+        return tree
+
+    def upstream_tag(self, version):
+        return "upstream-%s" % version
+
     def test_import_upstream_no_branch_no_prior_tarball(self):
-        self.requireFeature(PristineTarFeature)
         self.make_upstream_tarball()
         self.make_real_source_package()
         tree = self.make_branch_and_tree('working')
@@ -58,26 +97,14 @@
         self.addCleanup(tree.unlock)
         self.assertFalse(tree.has_changes())
         revtree = self.assertHasImportArtifacts(tree)
-        # that does not have debian/
-        self.assertEqual(None, revtree.path2id('debian'))
-        # and does have the same fileid for README
-        self.assertNotEqual(None, revtree.path2id('README'))
-        self.assertEqual(tree.path2id('README'), revtree.path2id('README'))
+        self.assertUpstreamContentAndFileIdFromTree(revtree, tree)
 
     def test_import_upstream_with_branch_no_prior_tarball(self):
-        self.requireFeature(PristineTarFeature)
         self.make_upstream_tarball()
         # The two branches are deliberately disconnected, to reflect likely
         # situations where this is first called.
-        upstreamtree = self.make_branch_and_tree('upstream')
-        self.make_unpacked_upstream_source(transport=upstreamtree.bzrdir.root_transport)
-        upstreamtree.smart_add(['upstream'])
-        upstreamtree.commit('upstream release')
-        tree = self.make_branch_and_tree('working')
-        self.make_unpacked_upstream_source(transport=tree.bzrdir.root_transport)
-        self.make_debian_dir(tree.bzrdir.root_transport.local_abspath('debian'))
-        tree.smart_add(['working'])
-        tree.commit('save changes')
+        upstreamtree = self.make_upstream_tree()
+        tree = self.make_workingdir()
         self.run_bzr(['import-upstream', self.upstream_version, "../%s" %
             self.upstream_tarball_name, '../upstream'],
             working_dir='working')
@@ -85,11 +112,37 @@
         self.addCleanup(tree.unlock)
         self.assertFalse(tree.has_changes())
         revtree = self.assertHasImportArtifacts(tree)
-        # that does not have debian/
-        self.assertEqual(None, revtree.path2id('debian'))
-        # and has the fileid from upstream for README.
-        self.assertNotEqual(None, revtree.path2id('README'))
-        self.assertEqual(upstreamtree.path2id('README'), revtree.path2id('README'))
+        self.assertUpstreamContentAndFileIdFromTree(revtree, upstreamtree)
+
+    def test_import_upstream_with_branch_prior_tarball(self):
+        self.make_upstream_tarball()
+        upstreamtree = self.make_upstream_tree()
+        tree = self.make_workingdir()
+        # XXX: refactor: make this an API call - running blackbox in test prep
+        # is ugly.
+        self.run_bzr(['import-upstream', self.upstream_version, "../%s" %
+            self.upstream_tarball_name, '../upstream'],
+            working_dir='working')
+        new_version = Version('0.2-1')
+        self.make_upstream_tarball(new_version.upstream_version)
+        upstream_parent = self.make_upstream_change(upstreamtree)
+        self.run_bzr(['import-upstream', new_version.upstream_version, "../%s" %
+            self._upstream_tarball_name(self.package_name, new_version.upstream_version), '../upstream'],
+            working_dir='working')
+        tree.lock_read()
+        self.addCleanup(tree.unlock)
+        self.assertFalse(tree.has_changes())
+        revtree = self.assertHasImportArtifacts(tree, new_version.upstream_version)
+        self.assertUpstreamContentAndFileIdFromTree(revtree, upstreamtree)
+        # Check parents: we want
+        # [previous_import, upstream_parent] to reflect that the 'branch' is
+        # the tarball branch aka upstream branch [ugh], and then a merge in
+        # from upstream so that cherrypicks do the right thing.
+        tags = tree.branch.tags
+        self.assertEqual([tags.lookup_tag(self.upstream_tag(self.upstream_version)),
+            upstreamtree.branch.last_revision()],
+            revtree.get_parent_ids())
+
 
 # vim: ts=4 sts=4 sw=4
 

=== added file 'tests/test_tagging.py'
--- a/tests/test_tagging.py	1970-01-01 00:00:00 +0000
+++ b/tests/test_tagging.py	2010-05-04 02:45:38 +0000
@@ -0,0 +1,53 @@
+# Copyright (C) 2010 Canonical Limited
+# vim: ts=4 sts=4 sw=4
+#
+# This file is part of bzr-builddeb.
+#
+# bzr-builddeb is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# bzr-builddeb is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with bzr-builddeb; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+"""Tests for bzrlib.plugins.builddeb.tagging."""
+
+from bzrlib.plugins.builddeb import tagging
+from bzrlib.tests import (
+    TestCase,
+    )
+
+
+class TestIsUpstreamTag(TestCase):
+
+    def test_plain_version(self):
+        self.assertFalse(tagging.is_upstream_tag('2.1'))
+
+    def test_simple_upstream(self):
+        self.assertTrue(tagging.is_upstream_tag('upstream-2.1'))
+
+    def test_distro_upstream(self):
+        self.assertTrue(tagging.is_upstream_tag('upstream-lucid-2.1'))
+
+    def test_git_upstream(self):
+        self.assertTrue(tagging.is_upstream_tag('upstream/2.1'))
+
+
+class TestUpstreamTagVersion(TestCase):
+
+    def test_simple_upstream(self):
+        self.assertEqual('2.1', tagging.upstream_tag_version('upstream-2.1'))
+
+    def test_distro_upstream(self):
+        self.assertEqual('2.1',
+            tagging.upstream_tag_version('upstream-lucid-2.1'))
+
+    def test_git_upstream(self):
+        self.assertEqual('2.1', tagging.upstream_tag_version('upstream/2.1'))




More information about the bazaar-commits mailing list