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

"""Report branches including the provided fix(es)
"""

import argparse
import re
import subprocess
import sys


STABLE_URLS = [
    'git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git',
]

UPSTREAM_URLS = [
    'git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git',
    'https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git',
    'https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux.git',
]

STABLE_QUEUE_URLS = [
    'git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git'
]

CHROMEOS_URLS = [
    'https://chromium.googlesource.com/chromiumos/third_party/kernel'
]

BRANCHES = ('6.6', '6.1', '5.15', '5.10', '5.4', '4.19', '4.14')

MIN_RELEASE = 114

def _git(args, stdin=None, encoding='utf-8'):
    """Calls a git subcommand.

    Similar to subprocess.check_output.

    Args:
        args: subcommand + args passed to 'git'.
        stdin: a string or bytes (depending on encoding) that will be passed
            to the git subcommand.
        encoding: either 'utf-8' (default) or None. Override it to None if
            you want both stdin and stdout to be raw bytes.

    Returns:
        the stdout of the git subcommand, same type as stdin. The output is
        also run through strip to make sure there's no extra whitespace.

    Raises:
        subprocess.CalledProcessError: when return code is not zero.
            The exception has a .returncode attribute.
    """

    try:
        # print(['git'] + args)
        return subprocess.run(
            ['git'] + args,
            encoding=encoding,
            input=stdin,
            stdout=subprocess.PIPE,
            stderr=subprocess.DEVNULL,
            check=True,
        ).stdout.strip()
    except subprocess.CalledProcessError:
        return None


def release_branches(chromeos_remote, baseline):
    """Return existing release branches."""

    command = ['branch', '-r', '--list', '%s/release-R*-chromeos-%s' % (chromeos_remote, baseline)]

    releases = []

    branches = _git(command).splitlines()

    for branch in branches:
        release = re.match(r' *%s/release-(R([0-9]+)-[0-9]+\.B)-.*' % chromeos_remote, branch)
        if release and int(release[2]) >= MIN_RELEASE:
            releases += [release[1]]

    return releases


def _find_remote(urls):
    """Find a remote pointing to a given repository."""

    # https remotes may end with or without '/'. Cover both variants.
    _urls = []
    for url in urls:
        _urls.append(url)
        if url.startswith('https://'):
            if url.endswith('/'):
                _urls.append(url.rstrip('/'))
            else:
                _urls.append(url + '/')

    for remote in _git(['remote']).splitlines():
        try:
            if _git(['remote', 'get-url', remote]) in _urls:
                return remote
        except subprocess.CalledProcessError:
            # Kinda weird, get-url failing on an item that git just gave us.
            continue
    return None


def integrated(sha):
    """Find tag at which a given SHA was integrated"""
    fixed = _git(['describe', '--match', 'v*', '--contains', sha])
    if fixed:
        fixed = fixed.split('~')[0]
    else:
        # This patch may not be upstream.
        upstream = _find_remote(UPSTREAM_URLS)
        gitcommand = ['merge-base', '--is-ancestor', sha, f'{upstream}/master']
        if _git(gitcommand) is not None:
            fixed = "ToT"
        else:
            fixed = None

    return fixed


def compare_releases(r1, r2):
    """Compare two releases.

    Return 0 if equal, <0 if r1 is older than r2, >0 if r1 is newer than r2
    """

    s1 = 0
    s2 = 0

    if r1 == r2:
        return 0
    if r1 == 'ToT':
        return 1
    if r2 == 'ToT':
        return -1

    m = re.match(r'(?:v)(\d+).(\d+)(?:\.(\d+))?.*', r1)
    if m:
        s1 = int(m.group(1)) * 1000000
        s1 += int(m.group(2)) * 1000
        if m.group(3) is not None:
            s1 += int(m.group(3))

    m = re.match(r'(?:v)?(\d+).(\d+)(?:\.(\d+))?.*', r2)
    if m:
        s2 = int(m.group(1)) * 1000000
        s2 += int(m.group(2)) * 1000
        if m.group(3) is not None:
            s2 += int(m.group(3))

    if s1 == s2:
        return 0
    if s1 < s2:
        return -1
    return 1


def getcommit(sha):
    """Get commit message for given SHA"""

    gitcommand = ['show', sha]
    return _git(gitcommand)


def get_patch_id(sha):
    """Get patch ID for given SHA"""

    commit = getcommit(sha)
    if not commit:
        return None

    gitcommand = ['patch-id']
    spid = _git(gitcommand, stdin=commit)
    if not spid:
        return None
    return spid.split(" ", 1)[0]


def get_fixes(sha):

    commit = getcommit(sha)
    if not commit:
        return None

    return re.findall(r'Fixes: (.*)', commit)


def findpatch(remote, branch, baseline, sha, subject):
    """ Return True if a patch is found in a branch, False otherwise"""

    release_branch = f'release-{branch}-chromeos-{baseline}'
    gitcommand = ['merge-base', '--is-ancestor', sha, f'{remote}/{release_branch}']
    result = _git(gitcommand)
    if result:
        return True

    # SHA is not in release branch. Search for it based on subject and patch ID.

    patch_id = get_patch_id(sha)
    if not patch_id:
        return False

    gitcommand = ['log', '--oneline', f'v{baseline}..{remote}/{release_branch}']
    commits = _git(gitcommand)
    if not commits:
        return False

    for commit in commits.splitlines():
        if subject in commit:
            ssha = commit.split(' ')[0]
            match_id = get_patch_id(ssha)
            if match_id == patch_id:
                return True

    return False


def check_release_branches(baseline, sha, subject):
    """Check if a patch is present in a release branch"""

    chromeos_remote = _find_remote(CHROMEOS_URLS)
    if chromeos_remote:
        contained = []
        not_contained = []
        for b in release_branches(chromeos_remote, baseline):
            release = b.split('-', maxsplit=1)[0]
            if findpatch(chromeos_remote, b, baseline, sha, subject):
                contained += [release]
            else:
                not_contained += [release]
        if not_contained:
            print('    Not in ' + ', '.join(not_contained))
        if contained:
            print('    In ' + ', '.join(contained))


def checkbranch(remote, baseline, subject, queued=False):
    """Check if a commit is present in a branch.

    Check if a commit described by its subject line is present
    in the provided remote and branch (identified by its baseline version
    number)
    """

    gitcommand = ['log', '--oneline', f'v{baseline}..{remote}/linux-{baseline}.y']
    commits = _git(gitcommand)

    # If the patch in not in an upstream stable release, try to find it in
    # a ChromeOS branch.
    if subject not in commits:
        chromeos_remote = _find_remote(CHROMEOS_URLS)
        if chromeos_remote:
            gitcommand = ['log', '--oneline', f'v{baseline}..{chromeos_remote}/chromeos-{baseline}']
            commits = _git(gitcommand)

    if not commits:
        return False

    for commit in commits.splitlines():
        if subject in commit:
            ssha = commit.split(' ')[0]
            isha = integrated(ssha)
            if not isha or isha == 'ToT':
                if queued:
                    print((f'  Expected to be fixed in chromeos-{baseline} '
                           f'with next stable release merge (sha {ssha})'))
                else:
                    print(f'  Fixed in chromeos-{baseline} (sha {ssha})')
                    check_release_branches(baseline, ssha, subject)
            elif not queued:
                print(f'  Fixed in chromeos-{baseline} with merge of {isha} (sha {ssha})')
                check_release_branches(baseline, ssha, subject)
            return True

    return False


def main(args):
    """Main entrypoint.

    Args:
        args: sys.argv[1:]

    Returns:
        An int return code.
    """

    parser = argparse.ArgumentParser()

    parser.add_argument('shas', nargs='+',
                        help='A valid SHA')

    args = vars(parser.parse_args(args))

    remote = _find_remote(STABLE_URLS)
    if remote:
        _git(['fetch', remote])
    else:
        print('Stable remote not found, results may be incomplete')

    queue_remote = _find_remote(STABLE_QUEUE_URLS)
    if queue_remote:
        _git(['fetch', queue_remote])
    else:
        print('Stable queue remote not found, results may be incomplete')

    chromeos_remote = _find_remote(CHROMEOS_URLS)
    if chromeos_remote:
        _git(['fetch', chromeos_remote])
    else:
        print('ChromeOS remote not found, results may be incomplete')

    # Try to find and fetch upstream
    upstream = _find_remote(UPSTREAM_URLS)
    if upstream:
        _git(['fetch', upstream])

    for sha in args['shas']:
        subject = _git(['show', '--pretty=format:%s', '-s', sha])
        if not subject:
            print(f'Subject not found for SHA {sha}')
            sys.exit(1)

        full_sha = _git(['show', '--pretty=format:%H', '-s', sha])
        if not full_sha:
            print(f'Failed to extract full SHA for SHA {sha}')
            sys.exit(1)

        ssha = full_sha[0:11]

        integrated_branch = integrated(ssha)
        if integrated_branch:
            print(f'Upstream commit {ssha} ("{subject}")')
            print(f'  Integrated in {integrated_branch}')
            fixes = get_fixes(ssha)
            for fix in fixes:
                print(f'  Fixes: {fix}')
                isha = fix.split(' ')[0]
                if isha:
                    introduced = integrated(isha)
                    if introduced:
                        print(f'    Introduced in {introduced}')
        else:
            # If the patch is not upstream, do not bother trying to find
            # ChromeOS branches.
            # FIXME: We should try to find non-upstream patches as well.
            print(f'Commit {ssha} ("{subject}")')
            print('  Not found in upstream kernel')
            continue

        for branch in BRANCHES:
            if compare_releases(integrated_branch, branch) > 0:
                if (not checkbranch(remote, branch, subject) and
                    (not queue_remote
                     or not checkbranch(queue_remote, branch, subject, queued=True))):
                    print(f'  Not in chromeos-{branch}')


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