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