[Pkg-bazaar-commits] r119 ./bzr-builddeb/people/jdw/merge_upstream: Add support for importing from directories and .tar.bz2 archives.

James Westby jw+debian at jameswestby.net
Fri Jun 22 22:52:45 UTC 2007


------------------------------------------------------------
revno: 119
committer: James Westby <jw+debian at jameswestby.net>
branch nick: merge-upstream.siretart
timestamp: Fri 2007-06-22 23:52:45 +0100
message:
  Add support for importing from directories and .tar.bz2 archives.
  
  Parameterise the test suite so that each test is run against each import
  type.
modified:
  merge_upstream.py
  tests/__init__.py
  tests/test_merge_upstream.py
-------------- next part --------------
=== modified file 'merge_upstream.py'
--- a/merge_upstream.py	2007-06-22 17:05:26 +0000
+++ b/merge_upstream.py	2007-06-22 22:52:45 +0000
@@ -19,10 +19,14 @@
 #    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
 
+from bz2 import BZ2File
 import os
+from StringIO import StringIO
 
 from bzrlib.errors import BzrCommandError
-from bzrlib.plugins.bzrtools.upstream_import import import_tar
+from bzrlib.plugins.bzrtools.upstream_import import (import_tar,
+                                                     import_dir,
+                                                     )
 
 # TODO: handle more input sources.
 # TODO: rename/repack tarball in to place.
@@ -63,22 +67,43 @@
     revno, rev_id = old_revision.in_branch(tree.branch)
     if rev_id != tree.branch.last_revision():
       tree.revert([], tree.branch.repository.revision_tree(rev_id))
-      tar_input = open(source, 'rb')
-      try:
-        import_tar(tree, tar_input)
-      finally:
-        tar_input.close()
+      if os.path.isdir(source):
+        s = StringIO(source)
+        s.seek(0)
+        import_dir(tree, s)
+      else:
+        if (source.endswith('.tar') or source.endswith('.tar.gz') or
+            source.endswith('.tar.bz2') or source.endswith('.tgz')):
+          if source.endswith('.bz2'):
+            tar_input = BZ2File(source, 'r')
+            tar_input = StringIO(tar_input.read())
+          else:
+            tar_input = open(source, 'rb')
+          try:
+            import_tar(tree, tar_input)
+          finally:
+            tar_input.close()
       tree.set_parent_ids([rev_id])
       tree.branch.set_last_revision_info(revno, rev_id)
       tree.commit('import upstream from %s' % os.path.basename(source))
       tree.merge_from_branch(tree.branch, to_revision=current_revision)
     else:
       # Fast forward the merge.
-      tar_input = open(source, 'rb')
-      try:
-        import_tar(tree, tar_input)
-      finally:
-        tar_input.close()
+      if os.path.isdir(source):
+        s = StringIO(source)
+        s.seek(0)
+        import_dir(tree, s)
+      else:
+        if (source.endswith('.tar') or source.endswith('.tar.gz') or
+            source.endswith('.tar.bz2') or source.endswith('.tgz')):
+          if source.endswith('.bz2'):
+            tar_input = BZ2File(source, 'r')
+            tar_input = StringIO(tar_input.read())
+          else:
+            tar_input = open(source, 'rb')
+          try:
+            import_tar(tree, tar_input)
+          finally:
+            tar_input.close()
       tree.commit('import upstream from %s' % os.path.basename(source))
 
-

=== modified file 'tests/__init__.py'
--- a/tests/__init__.py	2007-06-21 22:55:10 +0000
+++ b/tests/__init__.py	2007-06-22 22:52:45 +0000
@@ -18,13 +18,66 @@
 #    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #
 
+from copy import deepcopy
 import doctest
+import os
 from unittest import TestSuite
 
-from bzrlib.tests import TestUtil
+from bzrlib.tests import TestUtil, adapt_modules
 
 import changes
 import config
+import shutil
+import tarfile
+
+def make_new_upstream_dir(dir):
+  def _make_upstream_dir():
+    os.rename('package-0.2', dir)
+  return _make_upstream_dir
+
+def make_new_upstream_tarball(tarball):
+  def _make_upstream_tarball():
+    tar = tarfile.open(tarball, 'w:gz')
+    try:
+      tar.add('package-0.2')
+    finally:
+      tar.close()
+    shutil.rmtree('package-0.2')
+  return _make_upstream_tarball
+
+def make_new_upstream_tarball_bz2(tarball):
+  def _make_upstream_tarball():
+    tar = tarfile.open(tarball, 'w:bz2')
+    try:
+      tar.add('package-0.2')
+    finally:
+      tar.close()
+    shutil.rmtree('package-0.2')
+  return _make_upstream_tarball
+
+tarball_functions = [('dir', make_new_upstream_dir, '../package-0.2'),
+                     ('.tar.gz', make_new_upstream_tarball,
+                      '../package-0.2.tar.gz'),
+                     ('.tar.bz2', make_new_upstream_tarball_bz2,
+                      '../package-0.2.tar.bz2'),
+                     ]
+
+
+class MergeUpstreamAdaptor(object):
+
+  def adapt(self, test):
+    result = TestSuite()
+    for (name, function, source) in tarball_functions:
+      new_test = deepcopy(test)
+      new_test.build_tarball = function(source)
+      new_test.upstream_tarball = source
+      def make_new_id():
+        new_id = '%s(%s)' % (test.id(), name)
+        return lambda: new_id
+      new_test.id = make_new_id()
+      result.addTest(new_test)
+    return result
+
 
 def test_suite():
     loader = TestUtil.TestLoader()
@@ -32,7 +85,6 @@
     testmod_names = [
             'test_builder',
             'test_config',
-            'test_merge_upstream',
             'test_util',
             ]
     suite.addTest(loader.loadTestsFromModuleNames(["%s.%s" % (__name__, i)
@@ -45,5 +97,8 @@
     for mod in doctest_mod_names:
       suite.addTest(doctest.DocTestSuite(mod))
 
+    adapt_modules(['%s.test_merge_upstream' % __name__],
+                  MergeUpstreamAdaptor(), loader, suite)
+
     return suite
 

=== modified file 'tests/test_merge_upstream.py'
--- a/tests/test_merge_upstream.py	2007-06-22 17:53:51 +0000
+++ b/tests/test_merge_upstream.py	2007-06-22 22:52:45 +0000
@@ -20,7 +20,6 @@
 
 import os
 import shutil
-import tarfile
 
 from bzrlib.errors import (BzrCommandError,
                            InvalidRevisionSpec,
@@ -44,11 +43,16 @@
   """Turn the rev_id passed in to a revision spec."""
   return RevisionSpec.from_string('revid:' + rev_id)
 
-class TestSimpleMergeUpstreamNormal(TestCaseWithTransport):
+class TestMergeUpstreamNormal(TestCaseWithTransport):
   """Test that builddeb can merge upstream in normal mode"""
 
   upstream_rev_id_1 = 'upstream-1'
-  upstream_tarball = '../package-0.2.tar.gz'
+
+  def make_new_upstream(self):
+    self.build_tree(['package-0.2/', 'package-0.2/README-NEW',
+                     'package-0.2/CHANGELOG'])
+    write_to_file('package-0.2/CHANGELOG', 'version 2\n')
+    self.build_tarball()
 
   def make_first_upstream_commit(self):
     self.wt = self.make_branch_and_tree('.')
@@ -62,28 +66,12 @@
                 ['debian-id', 'debian-changelog-id'])
     self.wt.commit('debian version 1-1', rev_id='debian-1-1')
 
-  def make_new_upstream_tarball(self):
-    self.build_tree(['package-0.2/', 'package-0.2/README-NEW',
-                     'package-0.2/CHANGELOG'])
-    write_to_file('package-0.2/CHANGELOG', 'version 2\n')
-    tar = tarfile.open(self.upstream_tarball, 'w:gz')
-    try:
-      tar.add('package-0.2')
-    finally:
-      tar.close()
-    shutil.rmtree('package-0.2')
-
-  def make_new_upstream_tarball_with_debian(self):
+  def make_new_upstream_with_debian(self):
     self.build_tree(['package-0.2/', 'package-0.2/README-NEW',
                      'package-0.2/CHANGELOG', 'package-0.2/debian/',
                      'package-0.2/debian/changelog'])
     write_to_file('package-0.2/CHANGELOG', 'version 2\n')
-    tar = tarfile.open(self.upstream_tarball, 'w:gz')
-    try:
-      tar.add('package-0.2')
-    finally:
-      tar.close()
-    shutil.rmtree('package-0.2')
+    self.build_tarball()
 
   def perform_upstream_merge(self):
     """Perform a simple upstream merge.
@@ -94,54 +82,14 @@
     self.make_first_upstream_commit()
     old_upstream_revision = self.wt.branch.last_revision()
     self.make_first_debian_commit()
-    self.make_new_upstream_tarball()
+    self.make_new_upstream()
     merge_upstream(self.wt, self.upstream_tarball,
                    make_revspec(old_upstream_revision))
-    os.unlink(self.upstream_tarball)
     return self.wt
 
-  def test_merge_upstream_gives_correct_tree(self):
-    """Check that a merge leaves the tree as expected."""
-    wt = self.perform_upstream_merge()
-    self.failUnlessExists('CHANGELOG')
-    self.failUnlessExists('README-NEW')
-    self.failIfExists('README')
-    self.failUnlessExists('debian/changelog')
-    f = open('CHANGELOG')
-    try:
-      self.assertEqual(f.read(), 'version 2\n')
-    finally:
-      f.close()
-
-  def test_merge_upstream_gives_correct_status(self):
-    wt = self.perform_upstream_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(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(), [])
-
-  def test_merge_upstream_gives_correct_history(self):
-    wt = self.perform_upstream_merge()
-    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 package-0.2.tar.gz')
+  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('.')
@@ -159,7 +107,7 @@
   def test_merge_upstream_handles_invalid_revision(self):
     self.make_first_upstream_commit()
     self.make_first_debian_commit()
-    self.make_new_upstream_tarball()
+    self.make_new_upstream()
     self.assertRaises(InvalidRevisionSpec, merge_upstream, self.wt,
                       self.upstream_tarball, make_revspec('NOTAREVID'))
 
@@ -170,7 +118,7 @@
     branch the code should do a fast-forward.
     """
     self.make_first_upstream_commit()
-    self.make_new_upstream_tarball()
+    self.make_new_upstream()
     revspec = make_revspec(self.wt.branch.last_revision())
     merge_upstream(self.wt, self.upstream_tarball, revspec)
     wt = self.wt
@@ -187,13 +135,17 @@
     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))
 
   def perform_conflicted_merge(self):
     self.make_first_upstream_commit()
     revspec = make_revspec(self.wt.branch.last_revision())
     write_to_file('CHANGELOG', 'debian version\n')
     self.make_first_debian_commit()
-    self.make_new_upstream_tarball_with_debian()
+    self.make_new_upstream_with_debian()
     merge_upstream(self.wt, self.upstream_tarball, revspec)
     return self.wt
 
@@ -265,6 +217,34 @@
     self.assertEqual(len(rh), 2)
     self.assertEqual(rh[0], 'upstream-1')
     self.assertEqual(wt.branch.repository.get_revision(rh[1]).message,
-                     'import upstream from package-0.2.tar.gz')
+                     'import upstream from %s' % \
+                     os.path.basename(self.upstream_tarball))
 
+  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))
 



More information about the Pkg-bazaar-commits mailing list