#!/usr/bin/env python
# Copyright 2022 The IREE Authors
#
# Licensed under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception

# Creates a new branch that bumps the llvm-project commit.
# Typical usage (from the iree/ repository):
#   /path/to/here/bump_llvm.py
#
# In the default configuration, it will create a new branch
#   "bump-llvm-YYYYMMDD"
# This will fail if the branch already exists, in which case, you can:
#   * Specify an explicit branch name with --branch-name=my-integrate
#   * Pass "--reuse-branch" if you are sure that you want to lose the current
#     branch state. This is largely meant for developing this script or YOLO
#     use.
#
# In order to not interfere with your personal preferences, a remote named
# 'UPSTREAM_AUTOMATION' is used (and setup if needed). Sorry if you use that
# name for your daily work.
#
# This then reverts any changes to the llvm-project submodule setup (i.e.
# resets it to llvm-project's repository and disables branch tracking) and
# resets the submodule to the curren HEAD commit, generating a nice commit
# message.
#
# The branch is then pushed to the main repository. GitHub will print the usual
# message to create a pull request, which you should do to kick off pre-merge
# checks. You should land changes to this branch until green (or get other
# people to do so).
#
# When satisfied, Squash and Merge, opting to delete the branch to keep things
# tidy.

import argparse
from datetime import date
import os
import sys

import iree_modules
import iree_utils


def main(args):
    if not args.disable_setup_remote:
        iree_utils.git_setup_remote(args.upstream_remote,
                                    args.upstream_repository)

    iree_utils.git_check_porcelain()
    print(f"Fetching remote repository: {args.upstream_remote}")
    iree_utils.git_fetch(repository=args.upstream_remote)

    # If re-using a branch, make sure we are not on that branch.
    if args.reuse_branch:
        iree_utils.git_checkout("main")

    # Create branch.
    branch_name = args.branch_name
    if not branch_name:
        branch_name = f"bump-llvm-{date.today().strftime('%Y%m%d')}"
    print(f"Creating branch {branch_name} (override with --branch-name=)")
    iree_utils.git_create_branch(branch_name,
                                 checkout=True,
                                 ref=f"{args.upstream_remote}/main",
                                 force=args.reuse_branch)

    # Reset the llvm-project submodule to track upstream.
    # This will discard any cherrypicks that may have been committed locally,
    # but the assumption is that if doing a main llvm version bump, the
    # cherrypicks will be incorporated at the new commit. If not, well, ymmv
    # and you will find out.
    iree_utils.git_submodule_set_origin(
        "third_party/llvm-project",
        url="https://github.com/iree-org/iree-llvm-fork.git",
        branch="--default")

    # Remove the branch pin file, reverting us to pure upstream.
    branch_pin_file = os.path.join(
        iree_utils.get_repo_root(),
        iree_modules.MODULE_INFOS["llvm-project"].branch_pin_file)
    if os.path.exists(branch_pin_file):
        os.remove(branch_pin_file)

    # Update the LLVM submodule.
    llvm_commit = args.llvm_commit
    print(f"Updating LLVM submodule to {llvm_commit}")
    llvm_root = iree_utils.get_submodule_root("llvm-project")
    iree_utils.git_fetch(repository="origin",
        ref="refs/heads/main", repo_dir=llvm_root)
    if llvm_commit == "HEAD":
        llvm_commit = "origin/main"
    iree_utils.git_reset(llvm_commit, repo_dir=llvm_root)
    llvm_commit, llvm_summary = iree_utils.git_current_commit(
        repo_dir=llvm_root)
    print(f"LLVM submodule reset to:\n  {llvm_summary}\n")

    # Create a commit.
    print("Create commit...")
    iree_utils.git_create_commit(
        message=(f"Integrate llvm-project at {llvm_commit}\n\n"
                 f"* Reset third_party/llvm-project: {llvm_summary}"),
        add_all=True)

    # Push.
    print("Pushing...")
    iree_utils.git_push_branch(args.upstream_remote, branch_name)


def parse_arguments(argv):
    parser = argparse.ArgumentParser(description="IREE LLVM-bump-inator")
    parser.add_argument("--upstream-remote",
                        help="Upstream remote",
                        default="UPSTREAM_AUTOMATION")
    parser.add_argument("--upstream-repository",
                        help="Upstream repository URL",
                        default="git@github.com:iree-org/iree.git")
    parser.add_argument("--disable-setup-remote",
                        help="Disable remote setup",
                        action="store_true",
                        default=False)
    parser.add_argument("--llvm-commit",
                        help="LLVM commit sha",
                        default="HEAD")
    parser.add_argument("--branch-name",
                        help="Integrate branch to create",
                        default=None)
    parser.add_argument("--reuse-branch",
                        help="Allow re-use of an existing branch",
                        action="store_true",
                        default=False)
    args = parser.parse_args(argv)
    return args


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