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

"""Module parses and stores data from stable linux patch."""

from __future__ import print_function
import logging
import subprocess
import MySQLdb
import common


def update_stable_table(branch, start, db):
    """Updates the linux stable commits table.

    Also keep a reference of last parsed SHA so we don't have to index the
        entire commit log on each run.
    """
    cursor = db.cursor()

    # Pull latest changes in repository
    subprocess.check_output(['git', 'checkout', '-q', common.stable_branch(branch)])
    subprocess.check_output(['git', 'pull', '-q'])

    cmd = ['git', 'log', '--no-merges', '--abbrev=12', '--oneline',
                 '--reverse', '%s..' % start]
    commits = subprocess.check_output(cmd, encoding='utf-8', errors='ignore')

    last = None
    for commit in commits.splitlines():
        if commit:
            elem = commit.split(' ', 1)
            sha = elem[0]

            description = elem[1].rstrip('\n')

            ps = subprocess.Popen(['git', 'show', sha], stdout=subprocess.PIPE)
            spid = subprocess.check_output(['git', 'patch-id', '--stable'],
                            stdin=ps.stdout, encoding='utf-8', errors='ignore')
            patch_id = spid.split(' ', 1)[0]

            # Do nothing if the sha is already in the database
            q = """SELECT sha FROM linux_stable
                    WHERE sha = %s"""
            cursor.execute(q, [sha])
            found = cursor.fetchone()
            if found:
                continue

            last = sha
            usha = common.search_upstream_sha(sha)

            # The upstream SHA will not always exist, for example for commits
            # changing the Linux version number. Attempts to insert such commits
            # into linux_stable will fail, so ignore them.
            if usha is None:
                continue

            try:
                q = """INSERT INTO linux_stable
                        (sha, branch, upstream_sha, patch_id, description)
                        VALUES (%s, %s, %s, %s, %s)"""
                cursor.execute(q, [sha, branch, usha, patch_id, description])
                logging.info('Insert into linux_stable %s %s %s %s %s',
                             sha, branch, usha, patch_id, description)
            except MySQLdb.Error as e: # pylint: disable=no-member
                logging.error(
                    'Error inserting into linux_stable with values %s %s %s %s %s: error %d (%s)',
                    sha, branch, usha, patch_id, description, e.args[0], e.args[1])
            except UnicodeDecodeError as e:
                logging.error(
                    'Failed to INSERT stable sha %s with description %s: error %s',
                    sha, description, e)

    # Update previous fetch database
    if last:
        common.update_previous_fetch(db, common.Kernel.linux_stable, branch, last)

    db.commit()


if __name__ == '__main__':
    cloudsql_db = MySQLdb.Connect(user='linux_patches_robot', host='127.0.0.1', db='linuxdb')
    kernel_metadata = common.get_kernel_metadata(common.Kernel.linux_stable)
    common.update_kernel_db(cloudsql_db, kernel_metadata)
    cloudsql_db.close()
