]> git.decadent.org.uk Git - dak.git/commitdiff
create new class InstallerCopier
authorTorsten Werner <twerner@debian.org>
Sat, 8 Jan 2011 16:28:17 +0000 (17:28 +0100)
committerTorsten Werner <twerner@debian.org>
Sat, 8 Jan 2011 17:27:00 +0000 (18:27 +0100)
- will support the now copy-installer command
- includes test code

Signed-off-by: Torsten Werner <twerner@debian.org>
dak/copy_installer.py [new file with mode: 0644]
tests/fixtures/dak.conf
tests/fixtures/ftp/dists/proposed-updates/main/.keepme [new file with mode: 0644]
tests/fixtures/ftp/dists/stable/main/.keepme [new file with mode: 0644]
tests/fixtures/ftp/dists/testing/main/installer-i386/20110106/something [new file with mode: 0644]
tests/fixtures/ftp/dists/unstable/main/installer-amd64/20110106/somedir/file [new file with mode: 0644]
tests/fixtures/ftp/dists/unstable/main/installer-amd64/20110106/something [new file with mode: 0644]
tests/fixtures/ftp/dists/unstable/main/installer-i386/20110106/somedir/file [new file with mode: 0644]
tests/fixtures/ftp/dists/unstable/main/installer-i386/20110106/something [new file with mode: 0644]
tests/test_copy_installer.py [new file with mode: 0755]

diff --git a/dak/copy_installer.py b/dak/copy_installer.py
new file mode 100644 (file)
index 0000000..8e767d2
--- /dev/null
@@ -0,0 +1,66 @@
+#!/usr/bin/env python
+
+from daklib.config import Config
+
+import glob, os.path, re, shutil
+
+root_dir = Config()['Dir::Root']
+
+class InstallerCopier:
+    def __init__(self, source = 'unstable', dest = 'testing',
+            **keywords):
+        self.source = source
+        self.dest = dest
+        if 'version' not in keywords:
+            raise KeyError('no version specified')
+        self.version = keywords['version']
+
+        self.source_dir = os.path.join(root_dir, 'dists', source, 'main')
+        self.dest_dir = os.path.join(root_dir, 'dists', dest, 'main')
+        self.check_dir(self.source_dir, 'source does not exist')
+        self.check_dir(self.dest_dir, 'destination does not exist')
+
+        self.architectures = []
+        self.skip_architectures = []
+        self.trees_to_copy = []
+        self.symlinks_to_create = []
+        arch_pattern = os.path.join(self.source_dir, 'installer-*', self.version)
+        for arch_dir in glob.glob(arch_pattern):
+            self.check_architecture(arch_dir)
+
+    def check_dir(self, dir, message):
+        if not os.path.isdir(dir):
+            raise IOError(message)
+
+    def check_architecture(self, arch_dir):
+        architecture = re.sub('.*?/installer-(.*?)/.*', r'\1', arch_dir)
+        dest_basedir = os.path.join(self.dest_dir, \
+            'installer-%s' % architecture)
+        dest_dir = os.path.join(dest_basedir, self.version)
+        if os.path.isdir(dest_dir):
+            self.skip_architectures.append(architecture)
+        else:
+            self.architectures.append(architecture)
+            self.trees_to_copy.append((arch_dir, dest_dir))
+            symlink_target = os.path.join(dest_basedir, 'current')
+            self.symlinks_to_create.append((self.version, symlink_target))
+
+    def get_message(self):
+        return """
+Will copy installer version %(version)s from suite %(source)s to
+%(dest)s.
+Architectures to copy: %(arch_list)s
+Architectures to skip: %(skip_arch_list)s""" % {
+            'version':        self.version,
+            'source':         self.source,
+            'dest':           self.dest,
+            'arch_list':      ', '.join(self.architectures),
+            'skip_arch_list': ', '.join(self.skip_architectures)}
+
+    def do_copy(self):
+        for source, dest in self.trees_to_copy:
+            shutil.copytree(source, dest)
+        for source, dest in self.symlinks_to_create:
+            if os.path.lexists(dest):
+                os.unlink(dest)
+            os.symlink(source, dest)
index a73884088bb405b45dc17da462afc6a241622254..1c50af073a9a2424b7718466931978b9488e94cc 100644 (file)
@@ -17,3 +17,8 @@ Component
        Description "Software that fails to meet the DFSG";
   };
 };
+
+Dir
+{
+  Root "fixtures/ftp/";
+};
diff --git a/tests/fixtures/ftp/dists/proposed-updates/main/.keepme b/tests/fixtures/ftp/dists/proposed-updates/main/.keepme
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/fixtures/ftp/dists/stable/main/.keepme b/tests/fixtures/ftp/dists/stable/main/.keepme
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/fixtures/ftp/dists/testing/main/installer-i386/20110106/something b/tests/fixtures/ftp/dists/testing/main/installer-i386/20110106/something
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/fixtures/ftp/dists/unstable/main/installer-amd64/20110106/somedir/file b/tests/fixtures/ftp/dists/unstable/main/installer-amd64/20110106/somedir/file
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/fixtures/ftp/dists/unstable/main/installer-amd64/20110106/something b/tests/fixtures/ftp/dists/unstable/main/installer-amd64/20110106/something
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/fixtures/ftp/dists/unstable/main/installer-i386/20110106/somedir/file b/tests/fixtures/ftp/dists/unstable/main/installer-i386/20110106/somedir/file
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/fixtures/ftp/dists/unstable/main/installer-i386/20110106/something b/tests/fixtures/ftp/dists/unstable/main/installer-i386/20110106/something
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/tests/test_copy_installer.py b/tests/test_copy_installer.py
new file mode 100755 (executable)
index 0000000..440e4c1
--- /dev/null
@@ -0,0 +1,62 @@
+#!/usr/bin/env python
+
+from base_test import DakTestCase
+
+from dak.copy_installer import InstallerCopier
+
+import unittest
+
+class ImportTestCase(DakTestCase):
+    def test_arguments(self):
+        '''test constructor arguments'''
+        # version argument is required
+        self.assertRaises(KeyError, InstallerCopier)
+
+        copier = InstallerCopier(version = '20110106')
+        self.assertEqual('20110106', copier.version)
+        self.assertEqual('unstable', copier.source)
+        self.assertEqual('testing', copier.dest)
+
+        copier = InstallerCopier(version = '20110106', source = \
+                'proposed-updates')
+        self.assertEqual('proposed-updates', copier.source)
+
+        copier = InstallerCopier(version = '20110106', dest = 'stable')
+        self.assertEqual('stable', copier.dest)
+
+    def test_dir_names(self):
+        copier = InstallerCopier(version = '20110106')
+        self.assertEqual('fixtures/ftp/dists/unstable/main',
+                copier.source_dir)
+        self.assertEqual('fixtures/ftp/dists/testing/main',
+                copier.dest_dir)
+
+    def missing_source(self):
+        copier = InstallerCopier(version = '20110106', source = 'foo')
+
+    def missing_dest(self):
+        copier = InstallerCopier(version = '20110106', dest = 'bar')
+
+    def test_suites(self):
+        self.assertRaises(IOError, self.missing_source)
+        self.assertRaises(IOError, self.missing_dest)
+
+    def test_copy(self):
+        copier = InstallerCopier(version = '20110106')
+        self.assertEqual(['amd64'], copier.architectures)
+        self.assertEqual(['i386'], copier.skip_architectures)
+        self.assertEqual( \
+            [('fixtures/ftp/dists/unstable/main/installer-amd64/20110106', \
+              'fixtures/ftp/dists/testing/main/installer-amd64/20110106'),], \
+            copier.trees_to_copy)
+        self.assertEqual([('20110106', \
+            'fixtures/ftp/dists/testing/main/installer-amd64/current')], \
+            copier.symlinks_to_create)
+        self.assertEqual('''
+Will copy installer version 20110106 from suite unstable to
+testing.
+Architectures to copy: amd64
+Architectures to skip: i386''', copier.get_message())
+
+if __name__ == '__main__':
+    unittest.main()