]> git.decadent.org.uk Git - dak.git/blobdiff - daklib/filewriter.py
Merge branch 'pu/xz-for-indices'
[dak.git] / daklib / filewriter.py
old mode 100755 (executable)
new mode 100644 (file)
index 714531a..2f080e6
@@ -27,7 +27,7 @@ Helper code for file writing with optional compression.
 
 from daklib.config import Config
 
-from subprocess import check_call
+from daklib.daksubprocess import check_call
 
 import os, os.path
 
@@ -43,24 +43,29 @@ class BaseFileWriter(object):
         include strings for suite, component, architecture and booleans
         uncompressed, gzip, bzip2.
         '''
-        self.uncompressed = keywords.get('uncompressed', True)
-        self.gzip = keywords.get('gzip', False)
-        self.bzip2 = keywords.get('bzip2', False)
-        root_dir = Config()['Dir::Root']
-        relative_dir = template % keywords
-        self.path = os.path.join(root_dir, relative_dir)
+        compression = keywords.get('compression', ['none'])
+        self.uncompressed = 'none' in compression
+        self.gzip = 'gzip' in compression
+        self.bzip2 = 'bzip2' in compression
+        self.xz = 'xz' in compression
+        self.path = template % keywords
 
     def open(self):
         '''
         Returns a file object for writing.
         '''
+        # create missing directories
+        try:
+            os.makedirs(os.path.dirname(self.path))
+        except:
+            pass
         self.file = open(self.path + '.new', 'w')
         return self.file
 
     # internal helper function
     def rename(self, filename):
         tempfilename = filename + '.new'
-        os.chmod(tempfilename, 0664)
+        os.chmod(tempfilename, 0o664)
         os.rename(tempfilename, filename)
 
     def close(self):
@@ -69,12 +74,15 @@ class BaseFileWriter(object):
         '''
         self.file.close()
         if self.gzip:
-            check_call('gzip --rsyncable <%s.new >%s.gz.new' % (self.path, self.path),
+            check_call('gzip -9cn --rsyncable <%s.new >%s.gz.new' % (self.path, self.path),
                 shell = True)
             self.rename('%s.gz' % self.path)
         if self.bzip2:
-            check_call('bzip2 <%s.new >%s.bz2.new' % (self.path, self.path), shell = True)
+            check_call('bzip2 -9 <%s.new >%s.bz2.new' % (self.path, self.path), shell = True)
             self.rename('%s.bz2' % self.path)
+        if self.xz:
+            check_call('xz -c <{0}.new >{0}.xz.new'.format(self.path), shell=True)
+            self.rename('{0}.xz'.format(self.path))
         if self.uncompressed:
             self.rename(self.path)
         else:
@@ -88,15 +96,13 @@ class BinaryContentsFileWriter(BaseFileWriter):
         Output files are gzip compressed only.
         '''
         flags = {
-            'uncompressed': False,
-            'gzip':         True,
-            'bzip2':        False
+            'compression': ['gzip'],
         }
         flags.update(keywords)
-        if 'component' in flags:
-            template = "dists/%(suite)s/%(component)s/Contents-%(architecture)s"
-        else:
-            template = "dists/%(suite)s/Contents-%(architecture)s"
+        if flags['debtype'] == 'deb':
+            template = "%(archive)s/dists/%(suite)s/%(component)s/Contents-%(architecture)s"
+        else: # udeb
+            template = "%(archive)s/dists/%(suite)s/%(component)s/Contents-udeb-%(architecture)s"
         BaseFileWriter.__init__(self, template, **flags)
 
 class SourceContentsFileWriter(BaseFileWriter):
@@ -106,12 +112,10 @@ class SourceContentsFileWriter(BaseFileWriter):
         Output files are gzip compressed only.
         '''
         flags = {
-            'uncompressed': False,
-            'gzip':         True,
-            'bzip2':        False
+            'compression': ['gzip'],
         }
         flags.update(keywords)
-        template = "dists/%(suite)s/%(component)s/Contents-source"
+        template = "%(archive)s/dists/%(suite)s/%(component)s/Contents-source"
         BaseFileWriter.__init__(self, template, **flags)
 
 class PackagesFileWriter(BaseFileWriter):
@@ -121,15 +125,13 @@ class PackagesFileWriter(BaseFileWriter):
         are strings.  Output files are gzip compressed only.
         '''
         flags = {
-            'uncompressed': False,
-            'gzip':         True,
-            'bzip2':        True
+            'compression': ['gzip', 'bzip2'],
         }
         flags.update(keywords)
         if flags['debtype'] == 'deb':
-            template = "dists/%(suite)s/%(component)s/binary-%(architecture)s/Packages"
+            template = "%(archive)s/dists/%(suite)s/%(component)s/binary-%(architecture)s/Packages"
         else: # udeb
-            template = "dists/%(suite)s/%(component)s/debian-installer/binary-%(architecture)s/Packages"
+            template = "%(archive)s/dists/%(suite)s/%(component)s/debian-installer/binary-%(architecture)s/Packages"
         BaseFileWriter.__init__(self, template, **flags)
 
 class SourcesFileWriter(BaseFileWriter):
@@ -139,10 +141,22 @@ class SourcesFileWriter(BaseFileWriter):
         files are gzip compressed only.
         '''
         flags = {
-            'uncompressed': False,
-            'gzip':         True,
-            'bzip2':        True
+            'compression': ['gzip', 'bzip2'],
         }
         flags.update(keywords)
-        template = "dists/%(suite)s/%(component)s/source/Sources"
+        template = "%(archive)s/dists/%(suite)s/%(component)s/source/Sources"
         BaseFileWriter.__init__(self, template, **flags)
+
+class TranslationFileWriter(BaseFileWriter):
+    def __init__(self, **keywords):
+        '''
+        The value of the keywords suite, component and language are strings.
+        Output files are bzip2 compressed only.
+        '''
+        flags = {
+            'compression': ['bzip2'],
+            'language':     'en',
+        }
+        flags.update(keywords)
+        template = "%(archive)s/dists/%(suite)s/%(component)s/i18n/Translation-%(language)s"
+        super(TranslationFileWriter, self).__init__(template, **flags)