[Pkg-bazaar-commits] r139 ./bzr-builddeb/people/jdw/merge_upstream: Make the config say 'native = True' when it is so that the packages will build.

James Westby jw+debian at jameswestby.net
Sun Jul 1 18:18:16 UTC 2007


------------------------------------------------------------
revno: 139
committer: James Westby <jw+debian at jameswestby.net>
branch nick: merge_upstream
timestamp: Sun 2007-07-01 19:15:12 +0100
message:
  Make the config say 'native = True' when it is so that the packages will build.
  
  This does remove the config file when it transitions to non-native, so it
  might play funny buggers with merges a bit, but it's a rare situation.
  
  Also add some helpers in the tests for common things. Doesn't reduce the line
  count much, but it makes the intention a bit clearer for some.
modified:
  import_dsc.py
  tests/test_import_dsc.py
-------------- next part --------------
=== modified file 'import_dsc.py'
--- a/import_dsc.py	2007-07-01 14:58:33 +0000
+++ b/import_dsc.py	2007-07-01 18:15:12 +0000
@@ -30,6 +30,7 @@
                     generate_ids,
                     urlutils,
                     )
+from bzrlib.config import ConfigObj
 from bzrlib.errors import FileExists, BzrError
 from bzrlib.osutils import file_iterator, isdir, basename
 from bzrlib.trace import warning, info
@@ -44,7 +45,6 @@
 from errors import ImportError
 from merge_upstream import make_upstream_tag
 
-# TODO: Allow native->non-native transitions and back
 # TODO: support explicit upstream branch.
 
 def import_tar(tree, tar_input, file_ids_from=None):
@@ -236,9 +236,12 @@
     try:
       dangling_revid = None
       dangling_tree = None
+      old_upstream_tree = None
       if last_upstream is not None:
         old_upstream_revid = tree.branch.tags.lookup_tag(
                                  make_upstream_tag(last_upstream))
+        old_upstream_tree = tree.branch.repository.revision_tree(
+                                  old_upstream_revid)
         if old_upstream_revid != tree.branch.last_revision():
           dangling_revid = tree.branch.last_revision()
           dangling_tree = tree.branch.repository.revision_tree(dangling_revid)
@@ -251,6 +254,46 @@
         tree.branch.set_last_revision_info(revno, old_upstream_revid)
       if dangling_revid is not None:
         tree.add_parent_tree_id(dangling_revid)
+      config_filename = '.bzr-builddeb/default.conf'
+      to_add = False
+      to_add_dir = False
+      if not tree.has_filename(config_filename):
+        if not tree.has_filename(os.path.dirname(config_filename)):
+          os.mkdir(os.path.join(tree.basedir,
+                                os.path.dirname(config_filename)))
+          to_add_dir = True
+        conf = open(os.path.join(tree.basedir, config_filename), 'wb')
+        conf.close()
+        to_add = True
+      config_ = ConfigObj(os.path.join(tree.basedir, config_filename))
+      try:
+        config_['BUILDDEB']
+      except KeyError:
+        config_['BUILDDEB'] = {}
+      try:
+        current_value = config_['BUILDDEB']['native']
+      except KeyError:
+        current_value = False
+      if not current_value:
+        config_['BUILDDEB']['native'] = True
+        config_.write()
+      if to_add_dir:
+        file_id = None
+        parent = os.path.dirname(config_filename)
+        if old_upstream_tree is not None:
+          file_id = old_upstream_tree.path2id(parent)
+        if file_id is not None:
+          tree.add([parent], [file_id])
+        else:
+          tree.add([parent])
+      if to_add:
+        file_id = None
+        if old_upstream_tree is not None:
+          file_id = old_upstream_tree.path2id(config_filename)
+        if file_id is not None:
+          tree.add([config_filename], [file_id])
+        else:
+          tree.add([config_filename])
       tree.commit('import package from %s' % (os.path.basename(origname)))
       upstream_version = version.upstream_version
       tree.branch.tags.set_tag(make_upstream_tag(upstream_version),
@@ -434,25 +477,31 @@
     try:
       last_upstream = None
       dangling_revid = None
+      last_native = False
       for (filename, version, type, base_dir, transport) in self.safe_files:
         if type == 'orig':
+          if last_native:
+            last_upstream = None
           dangling_revid = self.import_orig(tree, filename, version,
                                             last_upstream=last_upstream,
                                             transport=transport,
                                             base_dir=base_dir)
           info("imported %s" % filename)
           last_upstream = version.upstream_version
+          last_native = False
         elif type == 'diff':
           self.import_diff(tree, filename, version,
                            dangling_revid=dangling_revid,
                            transport=transport, base_dir=base_dir)
           info("imported %s" % filename)
           dangling_revid = None
+          last_native = False
         elif type == 'native':
           self.import_native(tree, filename, version,
                              last_upstream=last_upstream,
                              transport=transport, base_dir=base_dir)
-          last_upstream = None
+          last_upstream = version.upstream_version
+          last_native = True
           info("imported %s" % filename)
     finally:
       tree.unlock()

=== modified file 'tests/test_import_dsc.py'
--- a/tests/test_import_dsc.py	2007-07-01 14:58:33 +0000
+++ b/tests/test_import_dsc.py	2007-07-01 18:15:12 +0000
@@ -22,6 +22,7 @@
 import shutil
 import tarfile
 
+from bzrlib.config import ConfigObj
 from bzrlib.errors import FileExists
 from bzrlib.tests import TestCaseWithTransport
 from bzrlib.workingtree import WorkingTree
@@ -62,6 +63,8 @@
   native_dsc_1 = 'package_0.1.dsc'
   native_dsc_2 = 'package_0.2.dsc'
 
+  config_files = ['.bzr-builddeb/', '.bzr-builddeb/default.conf']
+
   def make_base_package(self):
     os.mkdir(self.basedir)
     write_to_file(os.path.join(self.basedir, 'README'), 'hello\n')
@@ -225,18 +228,10 @@
       tree.unlock()
     for path in expected_inv:
       self.failUnlessExists(os.path.join(self.target, path))
-    f = open(os.path.join(self.target, 'Makefile'))
-    try:
-      contents = f.read()
-    finally:
-      f.close()
-    self.assertEqual(contents, 'good command\n')
-    f = open(os.path.join(self.target, 'debian', 'changelog'))
-    try:
-      contents = f.read()
-    finally:
-      f.close()
-    self.assertEqual(contents, 'version 1-1\n')
+    self.assertContentsAre(os.path.join(self.target, 'Makefile'),
+                           'good command\n')
+    self.assertContentsAre(os.path.join(self.target, 'debian', 'changelog'),
+                           'version 1-1\n')
     self.assertEqual(tree.changes_from(tree.basis_tree()).has_changed(),
                      False)
 
@@ -245,27 +240,15 @@
     tree = WorkingTree.open(self.target)
     rh = tree.branch.revision_history()
     self.assertEqual(len(rh), 2)
-    msg = tree.branch.repository.get_revision(rh[0]).message
-    self.assertEqual(msg, 'import upstream from %s' % self.orig_1)
-    msg = tree.branch.repository.get_revision(rh[1]).message
-    self.assertEqual(msg, 'merge packaging changes from %s' % self.diff_1)
+    self.check_revision_message(tree, rh[0],
+                          'import upstream from %s' % self.orig_1)
+    self.check_revision_message(tree, rh[1],
+                          'merge packaging changes from %s' % self.diff_1)
     changes = tree.changes_from(tree.branch.repository.revision_tree(rh[0]))
-    added = changes.added
-    self.assertEqual(len(added), 3)
-    self.assertEqual(added[0][0], 'debian')
-    self.assertEqual(added[0][2], 'directory')
-    self.assertEqual(added[1][0], 'debian/changelog')
-    self.assertEqual(added[1][2], 'file')
-    self.assertEqual(added[2][0], 'debian/install')
-    self.assertEqual(added[2][2], 'file')
-    self.assertEqual(len(changes.removed), 0)
-    self.assertEqual(len(changes.renamed), 0)
-    modified = changes.modified
-    self.assertEqual(len(modified), 1)
-    self.assertEqual(modified[0][0], 'Makefile')
-    self.assertEqual(modified[0][2], 'file')
-    self.assertEqual(modified[0][3], True)
-    self.assertEqual(modified[0][4], False)
+    expected_added = ['debian/', 'debian/changelog', 'debian/install']
+    expected_modified = ['Makefile']
+    self.check_changes(changes, added=expected_added,
+                       modified=expected_modified)
     tag = tree.branch.tags.lookup_tag('upstream-0.1')
     self.assertEqual(tag, rh[0])
 
@@ -282,18 +265,10 @@
       tree.unlock()
     for path in expected_inv:
       self.failUnlessExists(os.path.join(self.target, path))
-    f = open(os.path.join(self.target, 'Makefile'))
-    try:
-      contents = f.read()
-    finally:
-      f.close()
-    self.assertEqual(contents, 'good command\n')
-    f = open(os.path.join(self.target, 'debian', 'changelog'))
-    try:
-      contents = f.read()
-    finally:
-      f.close()
-    self.assertEqual(contents, 'version 1-1\nversion 1-2\n')
+    self.assertContentsAre(os.path.join(self.target, 'Makefile'),
+                           'good command\n')
+    self.assertContentsAre(os.path.join(self.target, 'debian', 'changelog'),
+                           'version 1-1\nversion 1-2\n')
     self.assertEqual(tree.changes_from(tree.basis_tree()).has_changed(),
                      False)
 
@@ -302,54 +277,36 @@
     tree = WorkingTree.open(self.target)
     rh = tree.branch.revision_history()
     self.assertEqual(len(rh), 3)
-    msg = tree.branch.repository.get_revision(rh[0]).message
-    self.assertEqual(msg, 'import upstream from %s' % self.orig_1)
-    msg = tree.branch.repository.get_revision(rh[1]).message
-    self.assertEqual(msg, 'merge packaging changes from %s' % self.diff_1)
-    msg = tree.branch.repository.get_revision(rh[2]).message
-    self.assertEqual(msg, 'merge packaging changes from %s' % self.diff_1b)
+    self.check_revision_message(tree, rh[0],
+                          'import upstream from %s' % self.orig_1)
+    self.check_revision_message(tree, rh[1],
+                          'merge packaging changes from %s' % self.diff_1)
+    self.check_revision_message(tree, rh[2],
+                          'merge packaging changes from %s' % self.diff_1b)
     changes = tree.changes_from(tree.branch.repository.revision_tree(rh[1]))
-    added = changes.added
-    self.assertEqual(len(added), 1, str(added))
-    self.assertEqual(added[0][0], 'debian/control')
-    self.assertEqual(added[0][2], 'file')
-    self.assertEqual(len(changes.removed), 1)
-    self.assertEqual(changes.removed[0][0], 'debian/install')
-    self.assertEqual(changes.removed[0][2], 'file')
-    self.assertEqual(len(changes.renamed), 0)
-    modified = changes.modified
-    self.assertEqual(len(modified), 1)
-    self.assertEqual(modified[0][0], 'debian/changelog')
-    self.assertEqual(modified[0][2], 'file')
-    self.assertEqual(modified[0][3], True)
-    self.assertEqual(modified[0][4], False)
+    expected_added = ['debian/control']
+    expected_removed = ['debian/install']
+    expected_modified = ['debian/changelog']
+    self.check_changes(changes, added=expected_added,
+                       removed=expected_removed, modified=expected_modified)
 
   def test_import_two_dsc_one_upstream_history_repeated_diff(self):
     self.import_dsc_1b_repeated_diff()
     tree = WorkingTree.open(self.target)
     rh = tree.branch.revision_history()
     self.assertEqual(len(rh), 3)
-    msg = tree.branch.repository.get_revision(rh[0]).message
-    self.assertEqual(msg, 'import upstream from %s' % self.orig_1)
-    msg = tree.branch.repository.get_revision(rh[1]).message
-    self.assertEqual(msg, 'merge packaging changes from %s' % self.diff_1)
-    msg = tree.branch.repository.get_revision(rh[2]).message
-    self.assertEqual(msg, 'merge packaging changes from %s' % self.diff_1b)
+    self.check_revision_message(tree, rh[0],
+                          'import upstream from %s' % self.orig_1)
+    self.check_revision_message(tree, rh[1],
+                          'merge packaging changes from %s' % self.diff_1)
+    self.check_revision_message(tree, rh[2],
+                          'merge packaging changes from %s' % self.diff_1b)
     changes = tree.changes_from(tree.branch.repository.revision_tree(rh[1]))
-    added = changes.added
-    self.assertEqual(len(added), 1, str(added))
-    self.assertEqual(added[0][0], 'debian/control')
-    self.assertEqual(added[0][2], 'file')
-    self.assertEqual(len(changes.removed), 1)
-    self.assertEqual(changes.removed[0][0], 'debian/install')
-    self.assertEqual(changes.removed[0][2], 'file')
-    self.assertEqual(len(changes.renamed), 0)
-    modified = changes.modified
-    self.assertEqual(len(modified), 1)
-    self.assertEqual(modified[0][0], 'debian/changelog')
-    self.assertEqual(modified[0][2], 'file')
-    self.assertEqual(modified[0][3], True)
-    self.assertEqual(modified[0][4], False)
+    expected_added = ['debian/control']
+    expected_removed = ['debian/install']
+    expected_modified = ['debian/changelog']
+    self.check_changes(changes, added=expected_added,
+                       removed=expected_removed, modified=expected_modified)
 
   def test_import_three_dsc_one_upstream_tree(self):
     self.import_dsc_1c()
@@ -365,18 +322,10 @@
       tree.unlock()
     for path in expected_inv:
       self.failUnlessExists(os.path.join(self.target, path))
-    f = open(os.path.join(self.target, 'Makefile'))
-    try:
-      contents = f.read()
-    finally:
-      f.close()
-    self.assertEqual(contents, 'good command\n')
-    f = open(os.path.join(self.target, 'debian', 'changelog'))
-    try:
-      contents = f.read()
-    finally:
-      f.close()
-    self.assertEqual(contents, 'version 1-1\nversion 1-2\nversion 1-3\n')
+    self.assertContentsAre(os.path.join(self.target, 'Makefile'),
+                           'good command\n')
+    self.assertContentsAre(os.path.join(self.target, 'debian', 'changelog'),
+                           'version 1-1\nversion 1-2\nversion 1-3\n')
     self.assertEqual(tree.changes_from(tree.basis_tree()).has_changed(),
                      False)
 
@@ -385,28 +334,19 @@
     tree = WorkingTree.open(self.target)
     rh = tree.branch.revision_history()
     self.assertEqual(len(rh), 4)
-    msg = tree.branch.repository.get_revision(rh[0]).message
-    self.assertEqual(msg, 'import upstream from %s' % self.orig_1)
-    msg = tree.branch.repository.get_revision(rh[1]).message
-    self.assertEqual(msg, 'merge packaging changes from %s' % self.diff_1)
-    msg = tree.branch.repository.get_revision(rh[2]).message
-    self.assertEqual(msg, 'merge packaging changes from %s' % self.diff_1b)
-    msg = tree.branch.repository.get_revision(rh[3]).message
-    self.assertEqual(msg, 'merge packaging changes from %s' % self.diff_1c)
+    self.check_revision_message(tree, rh[0],
+                          'import upstream from %s' % self.orig_1)
+    self.check_revision_message(tree, rh[1],
+                          'merge packaging changes from %s' % self.diff_1)
+    self.check_revision_message(tree, rh[2],
+                          'merge packaging changes from %s' % self.diff_1b)
+    self.check_revision_message(tree, rh[3],
+                          'merge packaging changes from %s' % self.diff_1c)
     changes = tree.changes_from(tree.branch.repository.revision_tree(rh[2]))
-    added = changes.added
-    self.assertEqual(len(added), 2, str(added))
-    self.assertEqual(added[0][0], 'debian/install')
-    self.assertEqual(added[0][2], 'file')
-    self.assertEqual(added[1][0], 'from_debian')
-    self.assertEqual(len(changes.removed), 0)
-    self.assertEqual(len(changes.renamed), 0)
-    modified = changes.modified
-    self.assertEqual(len(modified), 1)
-    self.assertEqual(modified[0][0], 'debian/changelog')
-    self.assertEqual(modified[0][2], 'file')
-    self.assertEqual(modified[0][3], True)
-    self.assertEqual(modified[0][4], False)
+    expected_added = ['debian/install', 'from_debian']
+    expected_modified = ['debian/changelog']
+    self.check_changes(changes, added=expected_added,
+                       modified=expected_modified)
 
   def test_import_three_dsc_two_upstream_tree(self):
     self.import_dsc_2()
@@ -421,64 +361,52 @@
       tree.unlock()
     for path in expected_inv:
       self.failUnlessExists(os.path.join(self.target, path))
-    f = open(os.path.join(self.target, 'Makefile'))
-    try:
-      contents = f.read()
-    finally:
-      f.close()
-    self.assertEqual(contents, 'good command\n')
-    f = open(os.path.join(self.target, 'debian', 'changelog'))
-    try:
-      contents = f.read()
-    finally:
-      f.close()
-    self.assertEqual(contents,
+    self.assertContentsAre(os.path.join(self.target, 'Makefile'),
+                           'good command\n')
+    self.assertContentsAre(os.path.join(self.target, 'debian', 'changelog'),
                      'version 1-1\nversion 1-2\nversion 1-3\nversion 2-1\n')
     self.assertEqual(tree.changes_from(tree.basis_tree()).has_changed(),
                      False)
 
+  def assertContentsAre(self, filename, expected_contents):
+    f = open(filename)
+    try:
+      contents = f.read()
+    finally:
+      f.close()
+    self.assertEqual(contents, expected_contents,
+                     "Contents of %s are not as expected" % filename)
+
   def test_import_four_dsc_two_upstream_history(self):
     self.import_dsc_2()
     tree = WorkingTree.open(self.target)
     rh = tree.branch.revision_history()
     self.assertEqual(len(rh), 3)
-    msg = tree.branch.repository.get_revision(rh[0]).message
-    self.assertEqual(msg, 'import upstream from %s' % self.orig_1)
-    msg = tree.branch.repository.get_revision(rh[1]).message
-    self.assertEqual(msg, 'import upstream from %s' % self.orig_2)
-    msg = tree.branch.repository.get_revision(rh[2]).message
-    self.assertEqual(msg, 'merge packaging changes from %s' % self.diff_2)
+    self.check_revision_message(tree, rh[0],
+                          'import upstream from %s' % self.orig_1)
+    self.check_revision_message(tree, rh[1],
+                          'import upstream from %s' % self.orig_2)
+    self.check_revision_message(tree, rh[2],
+                         'merge packaging changes from %s' % self.diff_2)
     parents = tree.branch.repository.revision_tree(rh[1]).get_parent_ids()
     self.assertEqual(parents, [rh[0]], rh)
     parents = tree.branch.repository.revision_tree(rh[2]).get_parent_ids()
     self.assertEqual(len(parents), 2)
     self.assertEqual(parents[0], rh[1], rh)
-    self.assertEqual(tree.branch.repository.get_revision(parents[1]).message,
+    self.check_revision_message(tree, parents[1],
                      'merge packaging changes from %s' % self.diff_1c)
     # Check the diff against upstream.
     changes = tree.changes_from(tree.branch.repository.revision_tree(rh[1]))
-    added = changes.added
-    self.assertEqual(len(added), 3, str(added))
-    self.assertEqual(added[0][0], 'debian')
-    self.assertEqual(added[0][2], 'directory')
-    self.assertEqual(added[1][0], 'debian/changelog')
-    self.assertEqual(added[1][2], 'file')
-    self.assertEqual(added[2][0], 'debian/install')
-    self.assertEqual(added[2][2], 'file')
-    self.assertEqual(changes.removed, [])
-    self.assertEqual(changes.modified, [])
+    expected_added = ['debian/', 'debian/changelog', 'debian/install']
+    self.check_changes(changes, added=expected_added)
     # Check the diff against last packaging version
     changes = tree.changes_from(
                  tree.branch.repository.revision_tree(parents[1]))
-    self.assertEqual(len(changes.added), 1, str(changes.added))
-    self.assertEqual(changes.added[0][0], 'NEWS')
-    self.assertEqual(changes.added[0][2], 'file')
-    self.assertEqual(len(changes.removed), 1)
-    self.assertEqual(changes.removed[0][0], 'debian/control')
-    self.assertEqual(changes.removed[0][2], 'file')
-    self.assertEqual(len(changes.modified), 1)
-    self.assertEqual(changes.modified[0][0], 'debian/changelog')
-    self.assertEqual(changes.modified[0][2], 'file')
+    expected_added = ['NEWS']
+    expected_removed = ['debian/control']
+    expected_modified = ['debian/changelog']
+    self.check_changes(changes, added=expected_added,
+                       removed=expected_removed, modified=expected_modified)
 
   def test_import_dsc_restrictions_on_dscs(self):
     """Test that errors are raised for confusing sets of .dsc files."""
@@ -511,12 +439,12 @@
     tree = WorkingTree.open(self.target)
     rh = tree.branch.revision_history()
     self.assertEqual(len(rh), 3)
-    msg = tree.branch.repository.get_revision(rh[0]).message
-    self.assertEqual(msg, 'import upstream from %s' % self.orig_1)
-    msg = tree.branch.repository.get_revision(rh[1]).message
-    self.assertEqual(msg, 'import upstream from %s' % self.orig_2)
-    msg = tree.branch.repository.get_revision(rh[2]).message
-    self.assertEqual(msg, 'merge packaging changes from %s' % self.diff_2)
+    self.check_revision_message(tree, rh[0], 'import upstream from %s' % \
+                                self.orig_1)
+    self.check_revision_message(tree, rh[1], 'import upstream from %s' % \
+                                self.orig_2)
+    self.check_revision_message(tree, rh[2],
+                         'merge packaging changes from %s' % self.diff_2)
     parents = tree.branch.repository.revision_tree(rh[1]).get_parent_ids()
     self.assertEqual(parents, [rh[0]], rh)
     parents = tree.branch.repository.revision_tree(rh[2]).get_parent_ids()
@@ -526,28 +454,16 @@
                      'merge packaging changes from %s' % self.diff_1c)
     # Check the diff against upstream.
     changes = tree.changes_from(tree.branch.repository.revision_tree(rh[1]))
-    added = changes.added
-    self.assertEqual(len(added), 3, str(added))
-    self.assertEqual(added[0][0], 'debian')
-    self.assertEqual(added[0][2], 'directory')
-    self.assertEqual(added[1][0], 'debian/changelog')
-    self.assertEqual(added[1][2], 'file')
-    self.assertEqual(added[2][0], 'debian/install')
-    self.assertEqual(added[2][2], 'file')
-    self.assertEqual(changes.removed, [])
-    self.assertEqual(changes.modified, [])
+    expected_added = ['debian/', 'debian/changelog', 'debian/install']
+    self.check_changes(changes, added=expected_added)
     # Check the diff against last packaging version
     changes = tree.changes_from(
                  tree.branch.repository.revision_tree(parents[1]))
-    self.assertEqual(len(changes.added), 1)
-    self.assertEqual(changes.added[0][0], 'NEWS')
-    self.assertEqual(changes.added[0][2], 'file')
-    self.assertEqual(len(changes.removed), 1)
-    self.assertEqual(changes.removed[0][0], 'debian/control')
-    self.assertEqual(changes.removed[0][2], 'file')
-    self.assertEqual(len(changes.modified), 1)
-    self.assertEqual(changes.modified[0][0], 'debian/changelog')
-    self.assertEqual(changes.modified[0][2], 'file')
+    expected_added = ['NEWS']
+    expected_removed = ['debian/control']
+    expected_modified = ['debian/changelog']
+    self.check_changes(changes, added=expected_added,
+                       removed=expected_removed, modified=expected_modified)
 
   def test_import_dsc_different_dir(self):
     source = 'source'
@@ -609,7 +525,7 @@
     importer.import_dsc(self.target)
     tree = WorkingTree.open(self.target)
     expected_inv = ['CHANGELOG', 'README', 'Makefile', 'debian/',
-                    'debian/changelog']
+                    'debian/changelog'] + self.config_files
     tree.lock_read()
     try:
       self.check_inventory_shape(tree.inventory, expected_inv)
@@ -617,11 +533,10 @@
       tree.unlock()
     rh = tree.branch.revision_history()
     self.assertEqual(len(rh), 1)
-    rev = tree.branch.repository.get_revision(rh[0])
-    self.assertEqual(rev.message,
-                     "import package from %s" % \
+    self.check_revision_message(tree, rh[0], "import package from %s" % \
                      os.path.basename(self.native_1))
     self.assertEqual(len(tree.get_parent_ids()), 1)
+    self.check_is_native_in_config(tree)
 
   def test_import_dsc_native_double(self):
     self.make_native_dsc_1()
@@ -630,7 +545,7 @@
     importer.import_dsc(self.target)
     tree = WorkingTree.open(self.target)
     expected_inv = ['CHANGELOG', 'README', 'Makefile', 'NEWS', 'from_debian',
-                    'debian/', 'debian/changelog']
+                    'debian/', 'debian/changelog'] + self.config_files
     tree.lock_read()
     try:
       self.check_inventory_shape(tree.inventory, expected_inv)
@@ -638,17 +553,25 @@
       tree.unlock()
     rh = tree.branch.revision_history()
     self.assertEqual(len(rh), 2)
-    rev = tree.branch.repository.get_revision(rh[0])
-    self.assertEqual(rev.message,
-                     "import package from %s" % \
+    self.check_revision_message(tree, rh[0], "import package from %s" % \
                      os.path.basename(self.native_1))
-    rev = tree.branch.repository.get_revision(rh[1])
-    self.assertEqual(rev.message,
-                     "import package from %s" % \
+    self.check_revision_message(tree, rh[1], "import package from %s" % \
                      os.path.basename(self.native_2))
     self.assertEqual(len(tree.get_parent_ids()), 1)
     parents = tree.branch.repository.revision_tree(rh[1]).get_parent_ids()
     self.assertEqual(len(parents), 1)
+    self.check_is_native_in_config(tree)
+    old_tree = tree.branch.repository.revision_tree(rh[0])
+    self.check_is_native_in_config(old_tree)
+    changes = tree.changes_from(old_tree)
+    expected_added = ['NEWS', 'from_debian']
+    expected_modified = ['Makefile', 'debian/changelog']
+    self.check_changes(changes, added=expected_added,
+                       modified=expected_modified)
+
+  def check_revision_message(self, tree, revision, expected_message):
+    rev = tree.branch.repository.get_revision(revision)
+    self.assertEqual(rev.message, expected_message)
 
   def test_non_native_to_native(self):
     self.make_dsc_1()
@@ -657,7 +580,7 @@
     importer.import_dsc(self.target)
     tree = WorkingTree.open(self.target)
     expected_inv = ['CHANGELOG', 'README', 'Makefile', 'NEWS', 'from_debian',
-                    'debian/', 'debian/changelog']
+                    'debian/', 'debian/changelog'] + self.config_files
     tree.lock_read()
     try:
       self.check_inventory_shape(tree.inventory, expected_inv)
@@ -666,39 +589,84 @@
     self.assertEqual(tree.changes_from(tree.basis_tree()).has_changed(), False)
     rh = tree.branch.revision_history()
     self.assertEqual(len(rh), 2)
-    rev = tree.branch.repository.get_revision(rh[0])
-    self.assertEqual(rev.message,
-                     "import upstream from %s" % \
+    self.check_revision_message(tree, rh[0], "import upstream from %s" % \
                      os.path.basename(self.orig_1))
-    rev = tree.branch.repository.get_revision(rh[1])
-    self.assertEqual(rev.message,
-                     "import package from %s" % \
+    self.check_revision_message(tree, rh[1], "import package from %s" % \
                      os.path.basename(self.native_2))
     self.assertEqual(len(tree.get_parent_ids()), 1)
     parents = tree.branch.repository.revision_tree(rh[1]).get_parent_ids()
     self.assertEqual(len(parents), 2)
-    rev = tree.branch.repository.get_revision(parents[1])
-    self.assertEqual(rev.message,
+    self.check_revision_message(tree, parents[1],
                      "merge packaging changes from %s" % \
                      os.path.basename(self.diff_1))
-    changes = tree.changes_from(tree.branch.repository.revision_tree(rh[0]))
-    self.assertEqual(len(changes.added), 4)
-    self.assertEqual(changes.added[0][0], 'NEWS')
-    self.assertEqual(changes.added[1][0], 'debian')
-    self.assertEqual(changes.added[2][0], 'debian/changelog')
-    self.assertEqual(changes.added[3][0], 'from_debian')
-    self.assertEqual(len(changes.modified), 1)
-    self.assertEqual(changes.modified[0][0], 'Makefile')
-    self.assertEqual(changes.removed, [])
-    changes = tree.changes_from(
-                    tree.branch.repository.revision_tree(parents[1]))
-    self.assertEqual(len(changes.added), 2)
-    self.assertEqual(changes.added[0][0], 'NEWS')
-    self.assertEqual(changes.added[1][0], 'from_debian')
-    self.assertEqual(len(changes.modified), 1, str(changes.modified))
-    self.assertEqual(changes.modified[0][0], 'debian/changelog')
-    self.assertEqual(len(changes.removed), 1)
-    self.assertEqual(changes.removed[0][0], 'debian/install')
+    up_tree = tree.branch.repository.revision_tree(rh[0])
+    changes = tree.changes_from(up_tree)
+    expected_added = ['NEWS', 'debian/', 'debian/changelog', 'from_debian']
+    expected_added += self.config_files
+    self.check_changes(changes, added=expected_added, modified=['Makefile'])
+    package_tree = tree.branch.repository.revision_tree(parents[1])
+    changes = tree.changes_from(package_tree)
+    expected_added = ['NEWS', 'from_debian'] + self.config_files
+    expected_modified = ['debian/changelog']
+    expected_removed = ['debian/install']
+    self.check_changes(changes, added=expected_added,
+                       modified=expected_modified, removed=expected_removed)
+    self.check_is_not_native_in_config(up_tree)
+    self.check_is_not_native_in_config(package_tree)
+    self.check_is_native_in_config(tree)
+
+  def check_changes(self, changes, added=[], removed=[], modified=[],
+                    renamed=[]):
+    exp_added = set(added)
+    exp_removed = set(removed)
+    exp_modified = set(modified)
+    exp_renamed = set(renamed)
+
+    def make_set(list):
+      output = set()
+      for item in list:
+        if item[2] == 'directory':
+          output.add(item[0] + '/')
+        else:
+          output.add(item[0])
+      return output
+
+    real_added = make_set(changes.added)
+    real_removed = make_set(changes.removed)
+    real_modified = make_set(changes.modified)
+    real_renamed = make_set(changes.renamed)
+    missing_added = exp_added.difference(real_added)
+    missing_removed = exp_removed.difference(real_removed)
+    missing_modified = exp_modified.difference(real_modified)
+    missing_renamed = exp_renamed.difference(real_renamed)
+    extra_added = real_added.difference(exp_added)
+    extra_removed = real_removed.difference(exp_removed)
+    extra_modified = real_modified.difference(exp_modified)
+    extra_renamed = real_renamed.difference(exp_renamed)
+    if len(missing_added) > 0:
+      self.fail("Some expected paths not found added in the changes: %s" % \
+                 str(missing_added))
+    if len(missing_removed) > 0:
+      self.fail("Some expected paths not found removed in the changes: %s" % \
+                 str(missing_removed))
+    if len(missing_modified) > 0:
+      self.fail("Some expected paths not found modified in the changes: %s" % \
+                 str(missing_modified))
+    if len(missing_renamed) > 0:
+      self.fail("Some expected paths not found renamed in the changes: %s" % \
+                 str(missing_renamed))
+    if len(extra_added) > 0:
+      self.fail("Some extra paths found added in the changes: %s" % \
+                 str(extra_added))
+    if len(extra_removed) > 0:
+      self.fail("Some extra paths found removed in the changes: %s" % \
+                 str(extra_removed))
+    if len(extra_modified) > 0:
+      self.fail("Some extra paths found modified in the changes: %s" % \
+                 str(extra_modified))
+    if len(extra_renamed) > 0:
+      self.fail("Some extra paths found renamed in the changes: %s" % \
+                 str(extra_renamed))
 
   def test_native_to_non_native(self):
     self.make_native_dsc_1()
@@ -717,16 +685,13 @@
     self.assertEqual(tree.changes_from(tree.basis_tree()).has_changed(), False)
     rh = tree.branch.revision_history()
     self.assertEqual(len(rh), 3)
-    rev = tree.branch.repository.get_revision(rh[0])
-    self.assertEqual(rev.message,
+    self.check_revision_message(tree, rh[0],
                      "import package from %s" % \
                      os.path.basename(self.native_1))
-    rev = tree.branch.repository.get_revision(rh[1])
-    self.assertEqual(rev.message,
+    self.check_revision_message(tree, rh[1],
                      "import upstream from %s" % \
                      os.path.basename(self.orig_2))
-    rev = tree.branch.repository.get_revision(rh[2])
-    self.assertEqual(rev.message,
+    self.check_revision_message(tree, rh[2],
                      "merge packaging changes from %s" % \
                      os.path.basename(self.diff_2))
     self.assertEqual(len(tree.get_parent_ids()), 1)
@@ -736,32 +701,44 @@
     self.assertEqual(len(parents), 1)
     up_tree = tree.branch.repository.revision_tree(rh[1])
     changes = tree.changes_from(up_tree)
-    self.assertEqual(len(changes.added), 3)
-    self.assertEqual(changes.added[0][0], 'debian')
-    self.assertEqual(changes.added[1][0], 'debian/changelog')
-    self.assertEqual(changes.added[2][0], 'debian/install')
-    self.assertEqual(changes.modified, [])
-    self.assertEqual(changes.removed, [])
-    changes = up_tree.changes_from(tree.branch.repository.revision_tree(rh[0]))
-    self.assertEqual(len(changes.added), 2)
-    self.assertEqual(changes.added[0][0], 'NEWS')
-    self.assertEqual(changes.added[1][0], 'from_debian')
-    self.assertEqual(len(changes.modified), 1, str(changes.modified))
-    self.assertEqual(changes.modified[0][0], 'Makefile')
-    self.assertEqual(len(changes.removed), 2)
-    self.assertEqual(changes.removed[0][0], 'debian')
-    self.assertEqual(changes.removed[1][0], 'debian/changelog')
+    expected_added = ['debian/', 'debian/changelog', 'debian/install']
+    self.check_changes(changes, added=expected_added)
+    native_tree = tree.branch.repository.revision_tree(rh[0])
+    changes = up_tree.changes_from(native_tree)
+    expected_added = ['NEWS', 'from_debian']
+    expected_modified = ['Makefile']
+    expected_removed = ['debian/', 'debian/changelog'] + self.config_files
+    self.check_changes(changes, added=expected_added, removed=expected_removed,
+                       modified=expected_modified)
     # FIXME: Should changelog etc. be added/removed or not?
-    changes = tree.changes_from(tree.branch.repository.revision_tree(rh[0]))
-    self.assertEqual(len(changes.added), 5, str(changes.added))
-    self.assertEqual(changes.added[0][0], 'NEWS')
-    self.assertEqual(changes.added[1][0], 'debian')
-    self.assertEqual(changes.added[2][0], 'debian/changelog')
-    self.assertEqual(changes.added[3][0], 'debian/install')
-    self.assertEqual(changes.added[4][0], 'from_debian')
-    self.assertEqual(len(changes.modified), 1)
-    self.assertEqual(changes.modified[0][0], 'Makefile')
-    self.assertEqual(len(changes.removed), 2)
-    self.assertEqual(changes.removed[0][0], 'debian')
-    self.assertEqual(changes.removed[1][0], 'debian/changelog')
+    changes = tree.changes_from(native_tree)
+    expected_added = ['NEWS', 'debian/', 'debian/install', 'from_debian',
+                      'debian/changelog']
+    expected_modified = ['Makefile']
+    expected_removed = ['debian/', 'debian/changelog'] + self.config_files
+    self.check_changes(changes, added=expected_added,
+                       modified=expected_modified, removed=expected_removed)
+    self.check_is_native_in_config(native_tree)
+    self.check_is_not_native_in_config(up_tree)
+    self.check_is_not_native_in_config(tree)
+
+  def _get_tree_default_config(self, tree, fail_on_none=True):
+    config_file_id = tree.path2id('.bzr-builddeb/default.conf')
+    if config_file_id is None:
+      if fail_on_none:
+        self.fail("The tree has no config file")
+      else:
+        return None
+    config_file = tree.get_file_text(config_file_id).split('\n')
+    config = ConfigObj(config_file)
+    return config
+
+  def check_is_native_in_config(self, tree):
+    config = self._get_tree_default_config(tree)
+    self.assertEqual(bool(config['BUILDDEB']['native']), True)
+
+  def check_is_not_native_in_config(self, tree):
+    config = self._get_tree_default_config(tree, fail_on_none=False)
+    if config is not None:
+      self.assertEqual(bool(config['BUILDDEB']['native']), False)
 



More information about the Pkg-bazaar-commits mailing list