[Pkg-bazaar-commits] r191 ./bzr-builddeb/trunk: * Allow the last upstream not to be on the mainline during merge-upstream.
James Westby
jw+debian at jameswestby.net
Wed Oct 31 19:58:28 UTC 2007
------------------------------------------------------------
revno: 191
committer: James Westby <jw+debian at jameswestby.net>
branch nick: trunk
timestamp: Wed 2007-10-31 19:58:28 +0000
message:
* Allow the last upstream not to be on the mainline during merge-upstream.
modified:
debian/changelog
merge_upstream.py
tests/test_merge_upstream.py
-------------- next part --------------
=== modified file 'debian/changelog'
--- a/debian/changelog 2007-10-31 19:17:23 +0000
+++ b/debian/changelog 2007-10-31 19:58:28 +0000
@@ -10,8 +10,9 @@
* bzr 0.92 is required.
* Improve the error message when the upstream tag is not found to actually
give the name of the expected tag.
+ * Allow the last upstream not to be on the mainline during merge-upstream.
- -- James Westby <jw+debian at jameswestby.net> Wed, 31 Oct 2007 19:15:54 +0000
+ -- James Westby <jw+debian at jameswestby.net> Wed, 31 Oct 2007 19:57:29 +0000
bzr-builddeb (0.91) unstable; urgency=low
=== modified file 'merge_upstream.py'
--- a/merge_upstream.py 2007-10-29 18:00:52 +0000
+++ b/merge_upstream.py 2007-10-31 19:58:28 +0000
@@ -128,7 +128,7 @@
current_revision = tree.last_revision()
rev_id = lookup_tag(tree)
if rev_id != tree.branch.last_revision():
- tree.revert(None, tree.branch.repository.revision_tree(rev_id))
+ tree.pull(tree.branch, stop_revision=rev_id, overwrite=True)
if os.path.isdir(source):
s = StringIO(source)
s.seek(0)
@@ -147,9 +147,6 @@
tar_input.close()
elif source.endswith('.zip'):
import_zip(tree, open(source, 'rb'))
- tree.set_parent_ids([rev_id])
- tree.branch.set_last_revision_info(
- tree.branch.revision_id_to_revno(rev_id), rev_id)
tree.commit('import upstream from %s' % os.path.basename(source))
tree.branch.tags.set_tag(make_upstream_tag(version_number),
tree.branch.last_revision())
=== modified file 'tests/test_merge_upstream.py'
--- a/tests/test_merge_upstream.py 2007-10-29 18:00:52 +0000
+++ b/tests/test_merge_upstream.py 2007-10-31 19:58:28 +0000
@@ -28,6 +28,7 @@
TagAlreadyExists,
)
from bzrlib.tests import TestCaseWithTransport
+from bzrlib.workingtree import WorkingTree
from merge_upstream import merge_upstream
@@ -316,4 +317,249 @@
os.path.basename(self.upstream_tarball))
self.assertEqual(wt.branch.tags.lookup_tag('upstream-0.2'), rh[0])
+ def test_merge_upstream_last_upstream_not_in_mainline(self):
+ self.wt = self.make_branch_and_tree('.', format='dirstate-tags')
+ self.make_new_upstream()
+ self.build_tree(['NEWS'])
+ self.wt.add(['NEWS'])
+ self.wt.commit('base')
+ self.wt.bzrdir.sprout('upstream')
+ up_tree = WorkingTree.open('upstream')
+ up_tree.commit('upstream')
+ up_tree.branch.tags.set_tag('upstream-0.1', up_tree.branch.last_revision())
+ self.wt.merge_from_branch(up_tree.branch)
+ self.wt.commit('merge')
+
+ def test_merge_upstream(self):
+ self.perform_upstream_merge()
+ self.check_simple_merge_results()
+
+ def test_merge_upstream_requires_clean_tree(self):
+ wt = self.make_branch_and_tree('.', format='dirstate-tags')
+ self.build_tree(['file'])
+ wt.add(['file'])
+ self.assertRaises(BzrCommandError, merge_upstream, wt, 'source', 1)
+
+ def test_merge_upstream_handles_no_source(self):
+ self.make_first_upstream_commit()
+ self.wt.branch.tags.set_tag('upstream-0.1', self.wt.branch.last_revision())
+ self.make_first_debian_commit()
+ self.assertRaises(NoSuchFile, merge_upstream, self.wt, 'source', '0.2')
+
+ def test_merge_upstream_handles_invalid_revision(self):
+ self.make_first_upstream_commit()
+ self.make_first_debian_commit()
+ self.make_new_upstream()
+ self.assertRaises(NoSuchTag, merge_upstream, self.wt,
+ self.upstream_tarball, '0.2')
+
+ def test_merge_upstream_handles_last_revision(self):
+ """Test handling of merging in to tip.
+
+ If the upstream revision is said to be at the latest revision in the
+ branch the code should do a fast-forward.
+ """
+ self.wt = self.make_branch_and_tree('.', format='dirstate-tags')
+ self.build_tree(['README', 'CHANGELOG', 'debian/'])
+ cl = Changelog()
+ cl.new_block(package='package',
+ version=Version('0.1-1'),
+ distributions='unstable',
+ urgency='low',
+ author='James Westby <jw+debian at jameswestby.net',
+ date='Thu, 3 Aug 2006 19:16:22 +0100',
+ )
+ cl.add_change('');
+ cl.add_change(' * Initial packaging.');
+ cl.add_change('');
+ f = open('debian/changelog', 'wb')
+ try:
+ cl.write_to_open_file(f)
+ finally:
+ f.close()
+ self.wt.add(['README', 'CHANGELOG', 'debian', 'debian/changelog'],
+ ['README-id', 'CHANGELOG-id', 'debian-id',
+ 'debian-changelog-id'])
+ self.wt.commit('upstream version 1', rev_id=self.upstream_rev_id_1)
+ self.wt.branch.tags.set_tag('upstream-0.1', self.wt.branch.last_revision())
+ self.make_new_upstream()
+ merge_upstream(self.wt, self.upstream_tarball, '0.2')
+ wt = self.wt
+ delta = wt.changes_from(wt.basis_tree(), want_unversioned=True,
+ want_unchanged=True)
+ self.assertEqual(delta.unversioned, [])
+ self.assertEqual(len(delta.unchanged), 2)
+ self.assertEqual(delta.unchanged[0], ('CHANGELOG', 'CHANGELOG-id', 'file'))
+ self.assertEqual(delta.unchanged[1][0], 'README-NEW')
+ self.assertEqual(delta.unchanged[1][2], 'file')
+ self.assertEqual(wt.conflicts(), [])
+ rh = wt.branch.revision_history()
+ self.assertEqual(len(rh), 2)
+ self.assertEqual(rh[0], self.upstream_rev_id_1)
+ self.assertEqual(len(wt.get_parent_ids()), 1)
+ self.assertEqual(wt.get_parent_ids()[0], rh[1])
+ revision = wt.branch.repository.get_revision(rh[1])
+ self.assertEqual(revision.message,
+ 'import upstream from %s' % \
+ os.path.basename(self.upstream_tarball))
+ self.assertEqual(wt.branch.tags.lookup_tag('upstream-0.2'), rh[1])
+
+ def test_merge_upstream_new_tag_extant(self):
+ self.make_first_upstream_commit()
+ self.wt.branch.tags.set_tag('upstream-0.1', self.wt.branch.last_revision())
+ self.make_first_debian_commit()
+ self.make_new_upstream()
+ self.wt.branch.tags.set_tag('upstream-0.2', self.wt.branch.last_revision())
+ self.assertRaises(TagAlreadyExists, merge_upstream, self.wt,
+ self.upstream_tarball, '0.2')
+
+ def perform_conflicted_merge(self):
+ self.make_first_upstream_commit()
+ self.wt.branch.tags.set_tag('upstream-0.1', self.wt.branch.last_revision())
+ write_to_file('CHANGELOG', 'debian version\n')
+ self.make_first_debian_commit()
+ self.make_new_upstream_with_debian()
+ merge_upstream(self.wt, self.upstream_tarball, '0.2')
+ return self.wt
+
+ def test_merge_upstream_gives_correct_tree_on_conficts(self):
+ """Check that a merge leaves the tree as expected with conflicts."""
+ wt = self.perform_conflicted_merge()
+ self.failUnlessExists('CHANGELOG')
+ self.failUnlessExists('README-NEW')
+ self.failIfExists('README')
+ self.failUnlessExists('debian/changelog')
+ self.failUnlessExists('debian.moved/changelog')
+ f = open('CHANGELOG')
+ try:
+ self.assertEqual(f.read(), "<<<<<<< TREE\nversion 2\n=======\n"
+ "debian version\n>>>>>>> MERGE-SOURCE\n")
+ finally:
+ f.close()
+
+ def test_merge_upstream_gives_correct_status(self):
+ wt = self.perform_conflicted_merge()
+ basis = wt.basis_tree()
+ changes = wt.changes_from(basis, want_unchanged=True,
+ want_unversioned=True)
+ added = [('debian', 'debian-id', 'directory'),
+ ('debian/changelog', 'debian-changelog-id', 'file')]
+ self.assertEqual(changes.added, added)
+ self.assertEqual(changes.removed, [])
+ self.assertEqual(len(changes.renamed), 1)
+ renamed = changes.renamed[0]
+ self.assertEqual(renamed[0], 'debian')
+ self.assertEqual(renamed[1], 'debian.moved')
+ self.assertEqual(renamed[3], 'directory')
+ self.assertEqual(renamed[4], False)
+ self.assertEqual(renamed[5], False)
+ self.assertEqual(changes.modified,
+ [('CHANGELOG', 'CHANGELOG-id', 'file', True, False)])
+ self.assertEqual(changes.kind_changed, [])
+ self.assertEqual(len(changes.unchanged), 2)
+ self.assertEqual(changes.unchanged[0][0], 'README-NEW')
+ self.assertEqual(changes.unchanged[0][2], 'file')
+ self.assertEqual(changes.unchanged[1][0], 'debian.moved/changelog')
+ self.assertEqual(changes.unchanged[1][2], 'file')
+ self.assertEqual(changes.unversioned,
+ [('CHANGELOG.BASE', None, 'file'),
+ ('CHANGELOG.OTHER', None, 'file'),
+ ('CHANGELOG.THIS', None, 'file')])
+
+ def test_merge_upstream_gives_correct_parents(self):
+ wt = self.perform_conflicted_merge()
+ parents = wt.get_parent_ids()
+ self.assertEqual(len(parents), 2)
+ self.assertEqual(parents[1], 'debian-1-1')
+
+ def test_merge_upstream_gives_correct_conflicts(self):
+ wt = self.perform_conflicted_merge()
+ conflicts = wt.conflicts()
+ self.assertEqual(len(conflicts), 2)
+ self.assertEqual(conflicts[0].path, 'CHANGELOG')
+ self.assertEqual(conflicts[0].file_id, 'CHANGELOG-id')
+ self.assertEqual(conflicts[0].typestring, 'text conflict')
+ self.assertEqual(conflicts[1].action, 'Moved existing file to')
+ self.assertEqual(conflicts[1].conflict_path, 'debian')
+ self.assertEqual(conflicts[1].conflict_file_id, 'debian-id')
+ self.assertEqual(conflicts[1].typestring, 'duplicate')
+
+ def test_merge_upstream_gives_correct_history(self):
+ wt = self.perform_conflicted_merge()
+ rh = wt.branch.revision_history()
+ self.assertEqual(len(rh), 2)
+ self.assertEqual(rh[0], 'upstream-1')
+ self.assertEqual(wt.branch.repository.get_revision(rh[1]).message,
+ 'import upstream from %s' % \
+ os.path.basename(self.upstream_tarball))
+
+ def test_merge_upstream_tags_new_version(self):
+ wt = self.perform_conflicted_merge()
+ rh = wt.branch.revision_history()
+ self.assertEqual(wt.branch.tags.lookup_tag('upstream-0.2'), rh[1])
+
+ def check_simple_merge_results(self):
+ wt = self.wt
+ basis = wt.basis_tree()
+ changes = wt.changes_from(basis, want_unchanged=True,
+ want_unversioned=True)
+ added = [('debian', 'debian-id', 'directory'),
+ ('debian/changelog', 'debian-changelog-id', 'file')]
+ self.assertEqual(changes.added, added)
+ self.assertEqual(changes.removed, [])
+ self.assertEqual(changes.renamed, [])
+ self.assertEqual(changes.modified, [])
+ self.assertEqual(changes.unchanged[0],
+ ('CHANGELOG', 'CHANGELOG-id', 'file'))
+ self.assertEqual(changes.unchanged[1][0], 'README-NEW')
+ self.assertEqual(changes.unchanged[1][2], 'file')
+ self.assertEqual(changes.unversioned, [])
+ self.assertEqual(changes.kind_changed, [])
+ parents = wt.get_parent_ids()
+ self.assertEqual(len(parents), 2)
+ self.assertEqual(parents[1], 'debian-1-1')
+ self.assertEqual(wt.conflicts(), [])
+ rh = wt.branch.revision_history()
+ self.assertEqual(len(rh), 2)
+ self.assertEqual(rh[0], self.upstream_rev_id_1)
+ self.assertEqual(wt.branch.repository.get_revision(rh[1]).message,
+ 'import upstream from %s' % \
+ os.path.basename(self.upstream_tarball))
+ self.assertEqual(wt.branch.tags.lookup_tag('upstream-0.2'), rh[1])
+
+ def test_merge_upstream_to_empty_branch(self):
+ self.wt = self.make_branch_and_tree('.', format='dirstate-tags')
+ self.make_new_upstream()
+ merge_upstream(self.wt, self.upstream_tarball, '0.2')
+ wt = self.wt
+ basis = wt.basis_tree()
+ self.assertEqual(wt.changes_from(basis).has_changed(), False)
+ parents = wt.get_parent_ids()
+ self.assertEqual(len(parents), 1)
+ self.assertEqual(wt.conflicts(), [])
+ rh = wt.branch.revision_history()
+ self.assertEqual(len(rh), 1)
+ self.assertEqual(rh[0], parents[0])
+ self.assertEqual(wt.branch.repository.get_revision(rh[0]).message,
+ 'import upstream from %s' % \
+ os.path.basename(self.upstream_tarball))
+ self.assertEqual(wt.branch.tags.lookup_tag('upstream-0.2'), rh[0])
+
+ def test_merge_upstream_last_upstream_not_in_mainline(self):
+ self.wt = self.make_branch_and_tree('.', format='dirstate-tags')
+ self.make_first_debian_commit()
+ self.wt.bzrdir.sprout('upstream')
+ up_tree = WorkingTree.open('upstream')
+ self.build_tree(['upstream/NEWS'])
+ up_tree.add(['NEWS'])
+ up_tree.commit('upstream')
+ up_tree.branch.tags.set_tag('upstream-0.1', up_tree.branch.last_revision())
+ self.wt.merge_from_branch(up_tree.branch)
+ self.wt.commit('merge')
+ up_tree.branch.tags.merge_to(self.wt.branch.tags)
+ self.assertEqual(len(self.wt.branch.revision_history()), 2)
+ self.make_new_upstream()
+ merge_upstream(self.wt, self.upstream_tarball, '0.2')
+
# vim: ts=2 sts=2 sw=2
+
More information about the Pkg-bazaar-commits
mailing list