]> git.donarmstrong.com Git - dak.git/blobdiff - daklib/filewriter.py
Fix breakage on missing w-b dump for an arch
[dak.git] / daklib / filewriter.py
index c010fb5dc97afc0b1cc1f115bf0ec392119acac7..7db42085298828f6bb2da3168f3ff135552c3a6c 100644 (file)
@@ -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
 
@@ -47,9 +47,8 @@ class BaseFileWriter(object):
         self.uncompressed = 'none' in compression
         self.gzip = 'gzip' in compression
         self.bzip2 = 'bzip2' in compression
-        root_dir = Config()['Dir::Root']
-        relative_dir = template % keywords
-        self.path = os.path.join(root_dir, relative_dir)
+        self.xz = 'xz' in compression
+        self.path = template % keywords
 
     def open(self):
         '''
@@ -66,21 +65,28 @@ class BaseFileWriter(object):
     # internal helper function
     def rename(self, filename):
         tempfilename = filename + '.new'
-        os.chmod(tempfilename, 0o664)
+        os.chmod(tempfilename, 0o644)
         os.rename(tempfilename, filename)
 
+    # internal helper function to compress output
+    def compress(self, cmd, suffix, path):
+        in_filename = "{0}.new".format(path)
+        out_filename = "{0}.{1}.new".format(path, suffix)
+        with open(in_filename, 'r') as in_fh, open(out_filename, 'w') as out_fh:
+            check_call(cmd, stdin=in_fh, stdout=out_fh)
+        self.rename("{0}.{1}".format(path, suffix))
+
     def close(self):
         '''
         Closes the file object and does the compression and rename work.
         '''
         self.file.close()
         if self.gzip:
-            check_call('gzip -9cn --rsyncable <%s.new >%s.gz.new' % (self.path, self.path),
-                shell = True)
-            self.rename('%s.gz' % self.path)
+            self.compress(['gzip', '-9cn', '--rsyncable'], 'gz', self.path)
         if self.bzip2:
-            check_call('bzip2 -9 <%s.new >%s.bz2.new' % (self.path, self.path), shell = True)
-            self.rename('%s.bz2' % self.path)
+            self.compress(['bzip2', '-9'], 'bz2', self.path)
+        if self.xz:
+            self.compress(['xz', '-c'], 'xz', self.path)
         if self.uncompressed:
             self.rename(self.path)
         else:
@@ -98,9 +104,9 @@ class BinaryContentsFileWriter(BaseFileWriter):
         }
         flags.update(keywords)
         if flags['debtype'] == 'deb':
-            template = "dists/%(suite)s/%(component)s/Contents-%(architecture)s"
+            template = "%(archive)s/dists/%(suite)s/%(component)s/Contents-%(architecture)s"
         else: # udeb
-            template = "dists/%(suite)s/%(component)s/Contents-udeb-%(architecture)s"
+            template = "%(archive)s/dists/%(suite)s/%(component)s/Contents-udeb-%(architecture)s"
         BaseFileWriter.__init__(self, template, **flags)
 
 class SourceContentsFileWriter(BaseFileWriter):
@@ -113,7 +119,7 @@ class SourceContentsFileWriter(BaseFileWriter):
             '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):
@@ -123,13 +129,13 @@ class PackagesFileWriter(BaseFileWriter):
         are strings.  Output files are gzip compressed only.
         '''
         flags = {
-            'compression': ['gzip', 'bzip2'],
+            'compression': ['gzip', 'xz'],
         }
         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 +145,10 @@ class SourcesFileWriter(BaseFileWriter):
         files are gzip compressed only.
         '''
         flags = {
-            'compression': ['gzip', 'bzip2'],
+            'compression': ['gzip', 'xz'],
         }
         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):
@@ -156,5 +162,5 @@ class TranslationFileWriter(BaseFileWriter):
             'language':     'en',
         }
         flags.update(keywords)
-        template = "dists/%(suite)s/%(component)s/i18n/Translation-%(language)s"
+        template = "%(archive)s/dists/%(suite)s/%(component)s/i18n/Translation-%(language)s"
         super(TranslationFileWriter, self).__init__(template, **flags)