#!/usr/bin/env python3
# Copyright 2021 Oliver Smith
# SPDX-License-Identifier: GPL-3.0-or-later
import sys

# Same dir
import common

# pmbootstrap
import add_pmbootstrap_to_import_path
import pmb.parse
import pmb.parse._apkbuild
import pmb.helpers.pmaports


def build_strict(packages, arch):
    common.run_pmbootstrap(["build_init"])
    common.run_pmbootstrap(["--details-to-stdout", "--no-ccache", "build",
                            "--strict", "--force",
                            "--arch", arch, ] + list(packages))


def verify_checksums(packages, arch):
    # Only do this with one build-{arch} job
    arch_verify = "x86_64"
    if arch != arch_verify:
        print(f"NOTE: doing checksum verification in build-{arch_verify} job,"
              " not here.")
        return

    if len(packages) == 0:
        print("no packages changed, not doing any checksums verification")
        return

    common.run_pmbootstrap(["build_init"])
    common.run_pmbootstrap(["--details-to-stdout", "checksum", "--verify"] +
                           list(packages))


if __name__ == "__main__":
    # Architecture to build for (as in build-{arch})
    if len(sys.argv) != 2:
        print("usage: build_changed_aports.py ARCH")
        sys.exit(1)
    arch = sys.argv[1]

    # Get and print modified packages
    common.add_upstream_git_remote()
    packages = common.get_changed_packages()

    # Package count sanity check
    common.get_changed_packages_sanity_check(len(packages))

    # [ci:skip-build]: verify checksums and stop
    verify_only = common.commit_message_has_string("[ci:skip-build]")
    if verify_only:
        print("WARNING: not building changed packages ([ci:skip-build])!")
        print("verifying checksums: " + ", ".join(packages))
        verify_checksums(packages, arch)
        sys.exit(0)

    # Prepare "args" to use pmbootstrap code
    sys.argv = ["pmbootstrap", "chroot"]
    args = pmb.parse.arguments()

    # Filter out packages that can't be built for given arch
    # (Iterate over copy of packages, because we modify it in this loop)
    for package in packages.copy():
        apkbuild_path = pmb.helpers.pmaports.find(args, package)
        apkbuild = pmb.parse._apkbuild.apkbuild(f"{apkbuild_path}/APKBUILD")

        if not pmb.helpers.pmaports.check_arches(apkbuild["arch"], arch):
            print(f"{package}: not enabled for {arch}, skipping")
            packages.remove(package)

    # No packages: skip build
    if len(packages) == 0:
        print(f"no packages changed, which can be built for {arch}")
        sys.exit(0)

    # Build packages
    print(f"building in strict mode for {arch}: {', '.join(packages)}")
    build_strict(packages, arch)