blob: 4142acd1952f1ae5d6fd29aed3287b85056639f7 [file] [log] [blame]
#!/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 # pylint: disable=import-error
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',
charset='utf8mb4')
kernel_metadata = common.get_kernel_metadata(common.Kernel.linux_stable)
common.update_kernel_db(cloudsql_db, kernel_metadata)
cloudsql_db.close()