Files
scylladb/dist/debian/debian_files_gen.py
Kefu Chai 4856e95a1c dist/debian: specify debian/* file encodings
instead of using the encoding returned by "locale.getencoding()",
explicitly specify the used encoding. per the Debian policies,
the debian/control, debian/changelog, and paths should be encoded
in UTF-8. see

- https://www.debian.org/doc/debian-policy/ch-controlfields.html
- https://manpages.debian.org/testing/dpkg-dev/deb-changelog.5.en.html
- https://www.debian.org/doc/debian-policy/ch-files.html#file-names

Signed-off-by: Kefu Chai <kefu.chai@scylladb.com>
2023-09-06 11:26:19 +08:00

119 lines
3.9 KiB
Python
Executable File

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Copyright (C) 2020-present ScyllaDB
#
#
# SPDX-License-Identifier: AGPL-3.0-or-later
#
import argparse
import string
import os
import shutil
import re
import subprocess
from pathlib import Path
class DebianFilesTemplate(string.Template):
delimiter = '%'
def get_version(builddir):
with open(os.path.join(builddir, 'SCYLLA-VERSION-FILE')) as f:
return f.read().strip().replace('-', '~')
def get_release(builddir):
with open(os.path.join(builddir, 'SCYLLA-RELEASE-FILE')) as f:
return f.read().strip()
def get_product(builddir):
with open(os.path.join(builddir, 'SCYLLA-PRODUCT-FILE')) as f:
return f.read().strip()
def generate_control(scriptdir, outputdir, product):
with open(os.path.join(scriptdir, 'control.template')) as f:
control_template = f.read()
s = DebianFilesTemplate(control_template)
control_applied = s.substitute(product=product)
with open(os.path.join(outputdir, 'control'), 'w', encoding='utf-8') as f:
f.write(control_applied)
def generate_changelog(scriptdir, outputdir, product, version, release):
with open(os.path.join(scriptdir, 'changelog.template')) as f:
changelog_template = f.read()
s = DebianFilesTemplate(changelog_template)
changelog_applied = s.substitute(product=product,
version=version,
release=release,
revision='1',
codename='stable')
with open(os.path.join(outputdir, 'changelog'), 'w', encoding='utf-8') as f:
f.write(changelog_applied)
def generate_include_binaries(outputdir):
include_binaries = subprocess.run(
"./scripts/create-relocatable-package.py --print-libexec -",
shell=True,
check=True,
capture_output=True,
encoding='utf-8').stdout
with open(os.path.join(outputdir, 'source', 'include-binaries'), 'w', encoding='utf-8') as f:
f.write(include_binaries)
def rename_to(outputdir, from_product, to_product):
for p in Path(outputdir).glob('scylla-*'):
# pat1: scylla-server.service
# -> scylla-enterprise-server.scylla-server.service
# or
# scylla-server.default
# -> scylla-enterprise-server.scylla-server.default
# pat2: scylla-server.scylla-fstrim.service
# -> scylla-enterprise-server.scylla-fstrim.service
# pat3: scylla-conf.install
# -> scylla-enterprise-conf.install
if m := re.match(r'^scylla(-[^.]+)\.(service|default)$', p.name):
p.rename(p.parent / f'{to_product}{m.group(1)}.{p.name}')
elif m := re.match(r'^scylla(-[^.]+\.scylla-[^.]+\.[^.]+)$', p.name):
p.rename(p.parent / f'{to_product}{m.group(1)}')
else:
p.rename(p.parent / p.name.replace(from_product, to_product, 1))
def main():
arg_parser = argparse.ArgumentParser()
arg_parser.add_argument('--build-dir', action='store', default='build',
help='build directory')
arg_parser.add_argument('--output-dir', action='store', default='debian/debian',
help='output directory')
args = arg_parser.parse_args()
builddir = args.build_dir
if os.path.isabs(args.output_dir):
outputdir = args.output_dir
else:
outputdir = os.path.join(builddir, args.output_dir)
if os.path.exists(outputdir):
shutil.rmtree(outputdir)
shutil.copytree('dist/debian/debian', outputdir)
product = get_product(builddir)
if product != 'scylla':
rename_to(outputdir, 'scylla', product)
scriptdir = os.path.dirname(__file__)
generate_changelog(scriptdir, outputdir, product, get_version(builddir), get_release(builddir))
generate_control(scriptdir, outputdir, product)
generate_include_binaries(outputdir)
if __name__ == '__main__':
main()