diff --git a/.gitignore b/.gitignore index 92afa22fd84964797c24ac50c6a69227c2534b99..1d63d7731b45e428eed05875429b2692afc056c2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ __pycache__/ venv/ +*.sw[po] diff --git a/packages.yml b/packages.yml index ff330245afcaebd1c2729f7b628f87b9d8bc61ac..d65db58ec54034877dcf1b5a0a4dcc0c3095fb82 100644 --- a/packages.yml +++ b/packages.yml @@ -1,3 +1,8 @@ ---- -- name: adcli - patch_dir: patches/adcli +maintainer: + name: FSMPI Admin-Team + mail: admin@fsmpi.rwth-aachen.de +packages: + - name: adcli + patch_dir: patches/adcli + version: 0.8.2-1.1-fsmpi + changelog: Apply the unreleased upstream-patches, fixing RT#100 diff --git a/scripts/build.py b/scripts/build.py index cbb92a8329e0119cc3489decd28a989b0a4855cc..4a7113fdeef54f5247db13e6e3cdfbe4d127bea0 100755 --- a/scripts/build.py +++ b/scripts/build.py @@ -1,7 +1,11 @@ #!/usr/bin/env python3 +import locale +locale.setlocale(locale.LC_ALL, "en_US.UTF-8") + import os import subprocess as sp +import re import tempfile import yaml @@ -11,17 +15,91 @@ def load_config(): return yaml.load(config_file) -def build_package(repo_dir, name, patch_dir=None): - with tempfile.TemporaryDirectory() as tempdir: - os.chdir(tempdir) - result = sp.run( - ["apt-get", "source", name], - check=True) +PKG_NAME_PATTERN = r"[a-zA-Z0-9.+-]+" +EPOCH_PATTERN = r"[0-9]+:" +UPSTREAM_VERSION_PATTERN = r"[a-zA-Z0-9.+-:]+" +DEBIAN_VERSION_PATTERN = r"[a-zA-Z0-9.+~]+" +EXTRACT_PATTERN = (r"extracting (?P<name>{pkg_name}) in (?P<dir>{pkg_name}-{version})" + .format(pkg_name=PKG_NAME_PATTERN, version=UPSTREAM_VERSION_PATTERN)) + + +def run_checked(command, **kwargs): + try: + return sp.run( + command, check=True, + stdout=sp.PIPE, stderr=sp.PIPE, universal_newlines=True, + **kwargs) + except sp.CalledProcessError as error: + print(error.stderr) + raise +def build_package(repo_dir, name, patch_dir=None, version=None, changelog=None): + with tempfile.TemporaryDirectory(dir=os.path.abspath(".")) as tempdir: + os.chdir(tempdir) + result = run_checked(["apt-get", "source", name]) + source_dir_candidates = [ + line for line in result.stdout.splitlines() if "extracting" in line] + if len(source_dir_candidates) != 1: + raise ValueError("Got inconclusive candidate directories: {}".format( + source_dir_candidates)) + source_dir_match = re.search(EXTRACT_PATTERN, source_dir_candidates[0]) + if source_dir_match is None: + raise ValueError("Cannot get extraction directory from {}".format( + source_dir_candidates[0])) + pkg_dir = source_dir_match.group("dir") + pkg_name = source_dir_match.group("name") + if pkg_name != name: + raise ValueError( + "Extracted package {} is not expected package {}".format( + pkg_name, name)) + + debian_workdir = os.path.join(tempdir, pkg_dir, "debian") + os.chdir(debian_workdir) + if patch_dir is not None: + abs_patch_dir = os.path.join(repo_dir, patch_dir) + for patch in sorted(os.listdir(abs_patch_dir)): + patch_file = os.path.join(abs_patch_dir, patch) + run_checked(["quilt", "import", patch_file]) + + command = ["debchange", "--preserve"] + if version is None: + command.append("--nmu") + else: + command.extend(["--newversion", version]) + def _get_log_entries(): + if changelog: + yield changelog + yield "Non-maintainer upload" + for entry in _get_log_entries(): + run_checked(command + [entry]) + + command = ["debuild", "-b", "-uc", "-us"] + run_checked(command) + + deb_packages = [ + filename + for filename in os.listdir(tempdir) + if filename.endswith(".deb") + ] + print(deb_packages) + + #input("Waiting for you, do your thing…") + + def main(): repo_dir = os.getcwd() - for package in load_config(): + config = load_config() + maintainer = config.get("maintainer", None) + if maintainer is not None: + name = maintainer.get("name", None) + mail = maintainer.get("mail", None) + if name: + os.environ["DEBFULLNAME"] = name + if mail: + os.environ["DEBEMAIL"] = mail + + for package in config["packages"]: build_package(repo_dir=repo_dir, **package) os.chdir(repo_dir)