#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Copyright 2020 The ChromiumOS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Fetches and submits the artifacts from ChromeOS toolchain's crash bucket.
"""

import argparse
import glob
import json
import logging
import os
import os.path
import shutil
import subprocess
import sys

import chroot


def get_artifacts(pattern):
    results = subprocess.check_output(
        ["gsutil.py", "ls", pattern], stderr=subprocess.STDOUT, encoding="utf-8"
    )
    return sorted(l.strip() for l in results.splitlines())


def get_crash_reproducers(working_dir):
    results = []
    for src in [
        f
        for f in glob.glob("%s/*.c*" % working_dir)
        if f.split(".")[-1] in ["c", "cc", "cpp"]
    ]:
        script = ".".join(src.split(".")[:-1]) + ".sh"
        if not os.path.exists(script):
            logging.warning("could not find the matching script of %s", src)
        else:
            results.append((src, script))
    return results


def submit_crash_to_forcey(
    forcey: str, temporary_directory: str, buildbucket_id: str, url: str
) -> None:
    dest_dir = os.path.join(temporary_directory, buildbucket_id)
    dest_file = os.path.join(dest_dir, os.path.basename(url))
    logging.info("Downloading and submitting %r...", url)
    subprocess.check_output(
        ["gsutil.py", "cp", url, dest_file], stderr=subprocess.STDOUT
    )
    subprocess.check_output(["tar", "-xJf", dest_file], cwd=dest_dir)
    for src, script in get_crash_reproducers(dest_dir):
        subprocess.check_output(
            [
                forcey,
                "reduce",
                "-wait=false",
                "-note",
                "%s:%s" % (url, src),
                "-sh_file",
                script,
                "-src_file",
                src,
            ]
        )


def main(argv):
    chroot.VerifyOutsideChroot()
    logging.basicConfig(
        format="%(asctime)s: %(levelname)s: %(filename)s:%(lineno)d: %(message)s",
        level=logging.INFO,
    )
    cur_dir = os.path.dirname(os.path.abspath(__file__))
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument(
        "--4c", dest="forcey", required=True, help="Path to a 4c client binary"
    )
    parser.add_argument(
        "--state_file",
        default=os.path.join(cur_dir, "chromeos-state.json"),
        help="The path to the state file.",
    )
    parser.add_argument(
        "--nocleanup",
        action="store_false",
        dest="cleanup",
        help="Keep temporary files created after the script finishes.",
    )
    opts = parser.parse_args(argv)

    state_file = os.path.abspath(opts.state_file)
    os.makedirs(os.path.dirname(state_file), exist_ok=True)
    temporary_directory = "/tmp/bisect_clang_crashes"
    os.makedirs(temporary_directory, exist_ok=True)
    urls = get_artifacts(
        "gs://chromeos-toolchain-artifacts/clang-crash-diagnoses"
        "/**/*clang_crash_diagnoses.tar.xz"
    )
    logging.info("%d crash URLs found", len(urls))

    visited = {}
    if os.path.exists(state_file):
        buildbucket_ids = {url.split("/")[-2] for url in urls}
        with open(state_file, encoding="utf-8") as f:
            data = json.load(f)
            visited = {k: v for k, v in data.items() if k in buildbucket_ids}
        logging.info(
            "Successfully loaded %d previously-submitted crashes", len(visited)
        )

    try:
        for url in urls:
            splits = url.split("/")
            buildbucket_id = splits[-2]
            # Skip the builds that has been processed
            if buildbucket_id in visited:
                continue
            submit_crash_to_forcey(
                forcey=opts.forcey,
                temporary_directory=temporary_directory,
                buildbucket_id=buildbucket_id,
                url=url,
            )
            visited[buildbucket_id] = url

        exception_in_flight = False
    except:
        exception_in_flight = True
        raise
    finally:
        if exception_in_flight:
            # This is best-effort. If the machine powers off or similar, we'll just
            # resubmit the same crashes, which is suboptimal, but otherwise
            # acceptable.
            logging.error(
                "Something went wrong; attempting to save our work..."
            )
        else:
            logging.info("Persisting state...")

        tmp_state_file = state_file + ".tmp"
        with open(tmp_state_file, "w", encoding="utf-8") as f:
            json.dump(visited, f, indent=2)
        os.rename(tmp_state_file, state_file)

        logging.info("State successfully persisted")

    if opts.cleanup:
        shutil.rmtree(temporary_directory)


if __name__ == "__main__":
    sys.exit(main(sys.argv[1:]))
