from daklib.config import Config
-from subprocess import check_call
+from daklib.daksubprocess import check_call
import os, os.path
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, 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 --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 <%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:
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):
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):
are strings. Output files are gzip compressed only.
'''
flags = {
- 'uncompressed': False,
- 'gzip': True,
- 'bzip2': True
+ '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):
files are gzip compressed only.
'''
flags = {
- 'uncompressed': False,
- 'gzip': True,
- 'bzip2': True
+ '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):
+ 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)