X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=daklib%2Ffilewriter.py;h=7fa68289e8a933d92979ff179c77463f7ebd4a57;hb=52eb03dccab0a9898bca4d36a0a96ebe377fb977;hp=35919634e9e971515ff5388ff14289542e752ea8;hpb=c3210fb3c3eb33ff14df2f4bd3da087836089444;p=dak.git diff --git a/daklib/filewriter.py b/daklib/filewriter.py old mode 100755 new mode 100644 index 35919634..7fa68289 --- a/daklib/filewriter.py +++ b/daklib/filewriter.py @@ -43,24 +43,28 @@ 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.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,11 +73,11 @@ 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.uncompressed: self.rename(self.path) @@ -88,13 +92,67 @@ 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): + def __init__(self, **keywords): + ''' + The value of the keywords suite and component are strings. + Output files are gzip compressed only. + ''' + flags = { + 'compression': ['gzip'], + } + flags.update(keywords) + template = "%(archive)s/dists/%(suite)s/%(component)s/Contents-source" + BaseFileWriter.__init__(self, template, **flags) + +class PackagesFileWriter(BaseFileWriter): + def __init__(self, **keywords): + ''' + The value of the keywords suite, component, debtype and architecture + are strings. Output files are gzip compressed only. + ''' + flags = { + 'compression': ['gzip', 'bzip2'], + } + flags.update(keywords) + if flags['debtype'] == 'deb': + template = "%(archive)s/dists/%(suite)s/%(component)s/binary-%(architecture)s/Packages" + else: # udeb + template = "%(archive)s/dists/%(suite)s/%(component)s/debian-installer/binary-%(architecture)s/Packages" + BaseFileWriter.__init__(self, template, **flags) + +class SourcesFileWriter(BaseFileWriter): + def __init__(self, **keywords): + ''' + The value of the keywords suite and component are strings. Output + files are gzip compressed only. + ''' + flags = { + 'compression': ['gzip', 'bzip2'], + } + flags.update(keywords) + 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)