[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