[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