[Pkg-bazaar-commits] r135 ./bzr-builddeb/people/jdw/merge_upstream: Initial support for importing native packages.

James Westby jw+debian at jameswestby.net
Sat Jun 30 21:03:01 UTC 2007


------------------------------------------------------------
revno: 135
committer: James Westby <jw+debian at jameswestby.net>
branch nick: merge_upstream
timestamp: Sat 2007-06-30 22:03:01 +0100
message:
  Initial support for importing native packages.
  
  Support importing native packages. Transitions to and from native packages 
  are currently untested.
modified:
  import_dsc.py
  tests/test_import_dsc.py
-------------- next part --------------
=== modified file 'import_dsc.py'
--- a/import_dsc.py	2007-06-30 17:37:57 +0000
+++ b/import_dsc.py	2007-06-30 21:03:01 +0000
@@ -38,8 +38,8 @@
 from errors import ImportError
 from merge_upstream import make_upstream_tag
 
-# TODO: support native packages (should be easy).
-# TODO: Use a transport to retrieve the files, so that they can be got remotely
+# TODO: Allow native->non-native transitions and back
+# TODO: support explicit upstream branch.
 
 def open_file(path, transport, base_dir=None):
   """Open a file, possibly over a transport.
@@ -127,6 +127,29 @@
       f.close()
     return dangling_revid
 
+  def import_native(self, tree, origname, version, dangling_revid=None,
+                    last_upstream=None, transport=None, base_dir=None):
+    f = open_file(origname, transport, base_dir=base_dir)[0]
+    try:
+      if last_upstream is not None:
+        old_upstream_revid = tree.branch.tags.lookup_tag(
+                                 make_upstream_tag(last_upstream))
+        tree.revert([],
+                    tree.branch.repository.revision_tree(old_upstream_revid))
+      import_tar(tree, f)
+      if last_upstream is not None:
+        tree.set_parent_ids([old_upstream_revid])
+        revno = tree.branch.revision_id_to_revno(old_upstream_revid)
+        tree.branch.set_last_revision_info(revno, old_upstream_revid)
+      if dangling_revid is not None:
+        tree.add_parent_tree_id(dangling_revid)
+      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),
+                               tree.branch.last_revision())
+    finally:
+      f.close()
+
   def _patch_tree(self, patch, basedir):
     cmd = ['patch', '--strip', '1', '--quiet', '--directory', basedir]
     child_proc = Popen(cmd, stdin=PIPE)
@@ -240,6 +263,7 @@
   def _decode_dsc(self, dsc, dscname):
     orig_file = None
     diff_file = None
+    native_file = None
     self._check_package_name(dsc['Source'])
     for file_details in dsc['files']:
       name = file_details['name']
@@ -251,19 +275,30 @@
         if diff_file is not None:
           raise ImportError("%s contains more than one .diff.gz" % dscname)
         diff_file = name
-    if diff_file is None:
-      raise ImportError("%s contains only a .orig.tar.gz, it must contain a "
-                        ".diff.gz as well" % dscname)
+      elif name.endswith('.tar.gz'):
+        if native_file is not None:
+          raise ImportError("%s contains more than one .tar.gz" % dscname)
+        native_file = name
     version = Version(dsc['Version'])
     if self.transport is not None:
       base_dir = urlutils.split(dscname)[0]
     else:
       base_dir = None
     dsc_transport = self.cache.get_transport(dscname)
-    if orig_file is not None:
-      self._add_to_safe(orig_file, version, 'orig', base_dir, dsc_transport)
-    self._check_orig_exists(version)
-    self._add_to_safe(diff_file, version, 'diff', base_dir, dsc_transport)
+    if native_file is not None:
+      if diff_file is not None or orig_file is not None:
+        raise ImportError("%s contains both a native package and a normal "
+                          "package." % dscname)
+      self._add_to_safe(native_file, version, 'native', base_dir,
+                        dsc_transport)
+    else:
+      if diff_file is None:
+        raise ImportError("%s contains only a .orig.tar.gz, it must contain a "
+                          ".diff.gz as well" % dscname)
+      if orig_file is not None:
+        self._add_to_safe(orig_file, version, 'orig', base_dir, dsc_transport)
+      self._check_orig_exists(version)
+      self._add_to_safe(diff_file, version, 'diff', base_dir, dsc_transport)
 
   def import_dsc(self, target_dir):
     if os.path.exists(target_dir):
@@ -298,6 +333,14 @@
                            transport=transport, base_dir=base_dir)
           info("imported %s" % filename)
           dangling_revid = None
+        elif type == 'native':
+          self.import_native(tree, filename, version,
+                             dangling_revid=dangling_revid,
+                             last_upstream=last_upstream,
+                             transport=transport, base_dir=base_dir)
+          dangling_revid = None
+          last_upstream = version.upstream_version
+          info("imported %s" % filename)
     finally:
       tree.unlock()
 

=== modified file 'tests/test_import_dsc.py'
--- a/tests/test_import_dsc.py	2007-06-30 14:17:45 +0000
+++ b/tests/test_import_dsc.py	2007-06-30 21:03:01 +0000
@@ -57,6 +57,10 @@
   dsc_1b = 'package_0.1-2.dsc'
   dsc_1c = 'package_0.1-3.dsc'
   dsc_2 = 'package_0.2-1.dsc'
+  native_1 = 'package_0.1.tar.gz'
+  native_2 = 'package_0.2.tar.gz'
+  native_dsc_1 = 'package_0.1.dsc'
+  native_dsc_2 = 'package_0.2.dsc'
 
   def make_base_package(self):
     os.mkdir(self.basedir)
@@ -490,6 +494,13 @@
     self.make_dsc(self.dsc_1b, '0.1-2', self.diff_1b, package='otherpackage')
     importer = DscImporter([self.dsc_1, self.dsc_1b])
     self.assertRaises(ImportError, importer.import_dsc, self.target)
+    self.make_dsc(self.dsc_1, '0.1', self.diff_1b, [self.orig_1,
+                                                    self.native_1])
+    importer = DscImporter([self.dsc_1])
+    self.assertRaises(ImportError, importer.import_dsc, self.target)
+    self.make_dsc(self.dsc_1, '0.1', self.native_1, [self.native_1])
+    importer = DscImporter([self.dsc_1])
+    self.assertRaises(ImportError, importer.import_dsc, self.target)
 
   def test_import_four_dsc_two_upstream_history_repeated_orig(self):
     self.import_dsc_2_repeated_orig()
@@ -553,3 +564,73 @@
     for path in expected_inv:
       self.failUnlessExists(os.path.join(self.target, path))
 
+  def make_native_dsc_1(self):
+    self.make_base_package()
+    os.mkdir(os.path.join(self.basedir, 'debian'))
+    write_to_file(os.path.join(self.basedir, 'debian', 'changelog'),
+                  'version 1\n')
+    tar = tarfile.open(self.native_1, 'w:gz')
+    try:
+      tar.add(self.basedir)
+    finally:
+      tar.close()
+    self.make_dsc(self.native_dsc_1, '0.1', self.native_1)
+
+  def make_native_dsc_2(self):
+    self.extend_base_package()
+    append_to_file(os.path.join(self.basedir, 'debian', 'changelog'),
+                   'version 2\n')
+    tar = tarfile.open(self.native_2, 'w:gz')
+    try:
+      tar.add(self.basedir)
+    finally:
+      tar.close()
+    self.make_dsc(self.native_dsc_2, '0.2', self.native_2)
+
+  def test_import_dsc_native_single(self):
+    self.make_native_dsc_1()
+    importer = DscImporter([self.native_dsc_1])
+    importer.import_dsc(self.target)
+    tree = WorkingTree.open(self.target)
+    expected_inv = ['CHANGELOG', 'README', 'Makefile', 'debian/',
+                    'debian/changelog']
+    tree.lock_read()
+    try:
+      self.check_inventory_shape(tree.inventory, expected_inv)
+    finally:
+      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" % \
+                     os.path.basename(self.native_1))
+    self.assertEqual(len(tree.get_parent_ids()), 1)
+
+  def test_import_dsc_native_double(self):
+    self.make_native_dsc_1()
+    self.make_native_dsc_2()
+    importer = DscImporter([self.native_dsc_1, self.native_dsc_2])
+    importer.import_dsc(self.target)
+    tree = WorkingTree.open(self.target)
+    expected_inv = ['CHANGELOG', 'README', 'Makefile', 'NEWS', 'debian/',
+                    'debian/changelog']
+    tree.lock_read()
+    try:
+      self.check_inventory_shape(tree.inventory, expected_inv)
+    finally:
+      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" % \
+                     os.path.basename(self.native_1))
+    rev = tree.branch.repository.get_revision(rh[1])
+    self.assertEqual(rev.message,
+                     "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)
+



More information about the Pkg-bazaar-commits mailing list