tmove hashing of files to a separate function - amprolla - devuan's apt repo merger HTML git clone git://parazyd.org/amprolla.git DIR Log DIR Files DIR Refs DIR README DIR LICENSE --- DIR commit 5283b1e533085e4814bfe73dc67a89d279f9dc06 DIR parent aedd903f12d7c7ddc538aab72ebed412559ab565 HTML Author: parazyd <parazyd@dyne.org> Date: Wed, 8 Nov 2017 16:52:44 +0100 move hashing of files to a separate function This commit also introduces a global variable called "rehash". It will be used to signal whether the rehashing of files needs to be done. Diffstat: M amprolla_update.py | 1 + M lib/globalvars.py | 3 +++ M lib/release.py | 38 +++++++++++++++++++++---------- 3 files changed, 30 insertions(+), 12 deletions(-) --- DIR diff --git a/amprolla_update.py b/amprolla_update.py t@@ -73,6 +73,7 @@ def perform_update(suite, paths): diffs = compare_dict(parse_release(remote_rel.text), parse_release(local_rel_text)) if diffs: + globalvars.rehash = True for k in diffs: if k.endswith('Packages.gz') or k.endswith('Sources.gz'): needsmerge[i]['mergelist'].append(k) DIR diff --git a/lib/globalvars.py b/lib/globalvars.py t@@ -6,3 +6,6 @@ amprolla globals to pass around # state for the current suite we're in suite = "" + +# tells us if we need to recreate checksums for Release files +rehash = True DIR diff --git a/lib/release.py b/lib/release.py t@@ -10,6 +10,7 @@ from lzma import compress as lzma_comp from os.path import getsize, isfile from subprocess import Popen +import lib.globalvars as globalvars from lib.config import (checksums, distrolabel, gpgdir, release_aliases, release_keys, signingkey) from lib.log import info t@@ -63,25 +64,38 @@ def write_release(oldrel, newrel, filelist, r, sign=True, rewrite=True): if k in rel_cont: new.write('%s: %s\n' % (k, rel_cont[k])) + if globalvars.rehash: + rehash_release(filelist, new, r) + + new.close() + + if sign: + sign_release(newrel) + + +def rehash_release(_filelist, fd, r): + """ + Calculates checksums of a given filelist and writes them to the given + file descriptor. Takes r as the third argument, which is a string to + remove from the path of the hashed file when writing it to a file. + """ + info('Hashing checksums') for csum in checksums: - new.write('%s:\n' % csum['name']) - for f in filelist: + fd.write('%s:\n' % csum['name']) + for f in _filelist: if isfile(f): cont = open(f, 'rb').read() - new.write(' %s %8s %s\n' % (csum['f'](cont).hexdigest(), - getsize(f), f.replace(r+'/', ''))) + fd.write(' %s %8s %s\n' % (csum['f'](cont).hexdigest(), + getsize(f), f.replace(r+'/', ''))) elif f.endswith('.xz') and isfile(f.replace('.xz', '.gz')): xzstr = lzma_comp(open(f.replace('.xz', '.gz'), 'rb').read()) - new.write(' %s %8s %s\n' % (csum['f'](xzstr).hexdigest(), - len(xzstr), f.replace(r+'/', ''))) + fd.write(' %s %8s %s\n' % (csum['f'](xzstr).hexdigest(), + len(xzstr), f.replace(r+'/', ''))) elif not f.endswith('.gz') and isfile(f+'.gz'): uncomp = gzip_decomp(open(f+'.gz', 'rb').read()) - new.write(' %s %8s %s\n' % (csum['f'](uncomp).hexdigest(), - len(uncomp), f.replace(r+'/', ''))) - new.close() - - if sign: - sign_release(newrel) + fd.write(' %s %8s %s\n' % (csum['f'](uncomp).hexdigest(), + len(uncomp), f.replace(r+'/', ''))) + return def sign_release(infile):