#!/usr/bin/env python3

import argparse
import pathlib
import urllib.request

# When updating this list, also update:
# - package/rustc/Config.in.host:
#       BR2_PACKAGE_HOST_RUSTC_ARCH_SUPPORTS
# - package/rustc/rustc.mk:
#       RUSTC_HOST_NAME
RUST_HOSTS = [
    "aarch64-unknown-linux-gnu",
    "i686-unknown-linux-gnu",
    "powerpc-unknown-linux-gnu",
    "powerpc64-unknown-linux-gnu",
    "powerpc64le-unknown-linux-gnu",
    "riscv64gc-unknown-linux-gnu",
    "s390x-unknown-linux-gnu",
    "x86_64-unknown-linux-gnu",
]

# When updating this list, also update one of:
# - package/rustc/Config.in.host:
#       BR2_PACKAGE_HOST_RUSTC_TARGET_TIER1_PLATFORMS
#       BR2_PACKAGE_HOST_RUSTC_TARGET_TIER2_HOST_TOOLS_PLATFORMS
#       BR2_PACKAGE_HOST_RUSTC_TARGET_TIER2_PLATFORMS
# - package/rustc/rustc.mk:
#       RUSTC_TARGET_NAME
# and check whether one of the follwoing needs updating:
# - package/rustc/Config.in.host:
#       BR2_PACKAGE_HOST_RUSTC_ARCH
#       BR2_PACKAGE_HOST_RUSTC_ABI
RUST_TARGETS = [
    "aarch64-unknown-linux-gnu",
    "aarch64-unknown-linux-musl",
    "arm-unknown-linux-gnueabi",
    "arm-unknown-linux-gnueabihf",
    "arm-unknown-linux-musleabi",
    "arm-unknown-linux-musleabihf",
    "armv5te-unknown-linux-gnueabi",
    "armv5te-unknown-linux-musleabi",
    "armv7-unknown-linux-gnueabi",
    "armv7-unknown-linux-gnueabihf",
    "armv7-unknown-linux-musleabi",
    "armv7-unknown-linux-musleabihf",
    "i586-unknown-linux-gnu",
    "i586-unknown-linux-musl",
    "i686-unknown-linux-gnu",
    "i686-unknown-linux-musl",
    "powerpc-unknown-linux-gnu",
    "powerpc64-unknown-linux-gnu",
    "powerpc64le-unknown-linux-gnu",
    "riscv64gc-unknown-linux-gnu",
    "s390x-unknown-linux-gnu",
    "sparc64-unknown-linux-gnu",
    "x86_64-unknown-linux-gnu",
    "x86_64-unknown-linux-musl",
]

RUST_DIST_URL = "https://static.rust-lang.org/dist"

LICENSES = {
    "APACHE": "62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a",
    "MIT": "23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3",
}


def update_mk_file(mk_file, new_version):
    with mk_file.open("r") as fd:
        lines = fd.readlines()

    version_var = pathlib.Path(mk_file).stem.upper().replace("-", "_") + "_VERSION"
    with mk_file.open("w") as fd:
        for line in lines:
            words = line.split()
            if len(words) == 3 and words[0] == version_var and words[1] == "=":
                fd.write(f"{words[0]} = {new_version}\n")
            else:
                fd.write(line)


def gen_hash_file_src(hash_file, new_version):
    with hash_file.open("w") as fd:
        fd.write("# Generated with utils/update-rust\n# Do not edit manually\n\n")
        f_name = f"rustc-{new_version}-src.tar.xz"
        print(f"\r\033[KUpdating {f_name}", end="")
        h_url = f"{RUST_DIST_URL}/{f_name}.sha256"
        with urllib.request.urlopen(h_url) as r:
            if r.status != 200:
                raise RuntimeError(f"No hash for {f_name}. Has source been removed?")
            # rstrip() content, and explicitly add the \n, in case
            # a hash file does not have a trailing \n.
            fd.write(f"# From {h_url}\nsha256  {r.read().decode().rstrip()}\n")
        fd.write("# Locally generated\n")
        for license in LICENSES:
            fd.write(f"sha256  {LICENSES[license]}  LICENSE-{license}\n")


def gen_hash_file_bin(hash_file, new_version):
    with hash_file.open("w") as fd:
        fd.write("# Generated with utils/update-rust\n# Do not edit manually\n\n")
        for host in RUST_HOSTS:
            f_name = f"rust-{new_version}-{host}.tar.xz"
            print(f"\r\033[KUpdating {f_name}", end="")
            h_url = f"{RUST_DIST_URL}/{f_name}.sha256"
            with urllib.request.urlopen(h_url) as r:
                if r.status != 200:
                    raise RuntimeError(f"No hash for {f_name}. Has host {host} been removed?")
                # rstrip() content, and explicitly add the \n, in case
                # a hash file does not have a trailing \n.
                fd.write(f"# From {h_url}\nsha256  {r.read().decode().rstrip()}\n")
        for target in RUST_TARGETS:
            f_name = f"rust-std-{new_version}-{target}.tar.xz"
            print(f"\r\033[KUpdating {f_name}", end="")
            h_url = f"{RUST_DIST_URL}/{f_name}.sha256"
            with urllib.request.urlopen(h_url) as r:
                if r.status != 200:
                    raise RuntimeError(f"No hash for {f_name}. Has target {target} been removed?")
                # rstrip() content, and explicitly add the \n, in case
                # a hash file does not have a trailing \n.
                fd.write(f"# From {h_url}\nsha256  {r.read().decode().rstrip()}\n")
        fd.write("# Locally generated\n")
        for license in LICENSES:
            fd.write(f"sha256  {LICENSES[license]}  LICENSE-{license}\n")


def main():
    parser = argparse.ArgumentParser(description="Update rust")
    parser.add_argument("version", help="Rust version to update to", type=str)

    args = parser.parse_args()

    TOPDIR = pathlib.Path(__file__).parent.parent
    update_mk_file(TOPDIR / "package/rust/rust.mk", args.version)
    update_mk_file(TOPDIR / "package/rust-bin/rust-bin.mk", args.version)
    gen_hash_file_src(TOPDIR / "package/rust/rust.hash", args.version)
    gen_hash_file_bin(TOPDIR / "package/rust-bin/rust-bin.hash", args.version)

    print("\r\033[K", end="")


if __name__ == "__main__":
    main()
