aboutsummaryrefslogtreecommitdiffstats
path: root/generate_auto_job
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2021-12-28 17:58:19 +0100
committerJay Berkenbilt <ejb@ql.org>2022-01-30 19:11:03 +0100
commitc216854607c2ed2ab0df90f2e2ea5c44dfcb85ad (patch)
tree30454cc3d09f69cfc81ca1de24b08b62d796dd44 /generate_auto_job
parentad096b462c12ae651b92ab12f2ab07ecb101c520 (diff)
downloadqpdf-c216854607c2ed2ab0df90f2e2ea5c44dfcb85ad.tar.zst
Add basic framework for QPDFJob code generation
Diffstat (limited to 'generate_auto_job')
-rwxr-xr-xgenerate_auto_job98
1 files changed, 98 insertions, 0 deletions
diff --git a/generate_auto_job b/generate_auto_job
new file mode 100755
index 00000000..7f92a630
--- /dev/null
+++ b/generate_auto_job
@@ -0,0 +1,98 @@
+#!/usr/bin/env python3
+import os
+import sys
+import argparse
+import hashlib
+import re
+
+whoami = os.path.basename(sys.argv[0])
+BANNER = f'''//
+// This file is automatically generated by {whoami}.
+// Edits will be automatically overwritten if the build is
+// run in maintainer mode.
+//'''
+
+
+def warn(*args, **kwargs):
+ print(*args, file=sys.stderr, **kwargs)
+
+
+class Main:
+ SOURCES = [whoami, 'job.yml']
+ SUMS = 'job.sums'
+
+ def main(self, args=sys.argv[1:], prog=whoami):
+ options = self.parse_args(args, prog)
+ self.top(options)
+
+ def parse_args(self, args, prog):
+ parser = argparse.ArgumentParser(
+ prog=prog,
+ description='Generate files for QPDFJob',
+ )
+ mxg = parser.add_mutually_exclusive_group(required=True)
+ mxg.add_argument('--check',
+ help='update checksums if files are not up to date',
+ action='store_true', default=False)
+ mxg.add_argument('--generate',
+ help='generate files from sources',
+ action='store_true', default=False)
+ return parser.parse_args(args)
+
+ def top(self, options):
+ if options.check:
+ self.check()
+ elif options.generate:
+ self.generate()
+ else:
+ exit(f'{whoami} unknown mode')
+
+ def get_hashes(self):
+ hashes = {}
+ for i in sorted(self.SOURCES):
+ m = hashlib.sha256()
+ with open(i, 'rb') as f:
+ m.update(f.read())
+ hashes[i] = m.hexdigest()
+ return hashes
+
+ def check(self):
+ hashes = self.get_hashes()
+ match = False
+ try:
+ old_hashes = {}
+ with open(self.SUMS, 'r') as f:
+ for line in f.readlines():
+ m = re.match(r'^(\S+) (\S+)\s*$', line)
+ if m:
+ old_hashes[m.group(1)] = m.group(2)
+ match = old_hashes == hashes
+ except Exception:
+ pass
+ if not match:
+ exit(f'{whoami}: auto job inputs have changed')
+
+ def update_hashes(self):
+ hashes = self.get_hashes()
+ with open(self.SUMS, 'w') as f:
+ print(f'# Generated by {whoami}', file=f)
+ for k, v in hashes.items():
+ print(f'{k} {v}', file=f)
+
+ def generate(self):
+ warn(f'{whoami}: regenerating auto job files')
+
+ with open('libqpdf/qpdf/auto_job_decl.hh', 'w') as f:
+ print(BANNER, file=f)
+
+ # Update hashes last to ensure that this will be rerun in the
+ # event of a failure.
+ self.update_hashes()
+
+
+if __name__ == '__main__':
+ try:
+ os.chdir(os.path.dirname(os.path.realpath(__file__)))
+ Main().main()
+ except KeyboardInterrupt:
+ exit(130)