blob: 6bf8cd33638b06281fdbf6cf6b2bbd9f08dda7e8 [file] [log] [blame]
Hirthanan Subenderan3e884d62020-01-23 13:12:45 -08001#!/usr/bin/env python3
2# -*- coding: utf-8 -*-"
3#
4# Copyright 2020 The Chromium OS Authors. All rights reserved.
5# Use of this source code is governed by a BSD-style license that can be
6# found in the LICENSE file.
7
8"""Module containing shared helper methods."""
9
10from __future__ import print_function
Hirthanan Subenderan3e884d62020-01-23 13:12:45 -080011import os
Hirthanan Subenderan3e884d62020-01-23 13:12:45 -080012import re
Hirthanan Subenderancfada212020-02-28 15:12:39 -080013from enum import Enum
Hirthanan Subenderancd9cbcb2020-03-25 19:43:12 -070014import subprocess
Hirthanan Subenderancfada212020-02-28 15:12:39 -080015import MySQLdb
16
17import initdb_upstream
18import initdb_stable
19import initdb_chromeos
Hirthanan Subenderan3e884d62020-01-23 13:12:45 -080020
Hirthanan Subenderan00f18042020-02-11 17:24:38 -080021
22KERNEL_SITE = 'https://git.kernel.org/'
23UPSTREAM_REPO = KERNEL_SITE + 'pub/scm/linux/kernel/git/torvalds/linux'
24STABLE_REPO = KERNEL_SITE + 'pub/scm/linux/kernel/git/stable/linux-stable'
25
26CHROMIUM_SITE = 'https://chromium.googlesource.com/'
Hirthanan Subenderanc44a0b32020-03-11 22:34:39 -070027CHROMEOS_KERNEL_DIR = 'chromiumos/third_party/kernel'
28CHROMEOS_REPO = os.path.join(CHROMIUM_SITE, CHROMEOS_KERNEL_DIR)
Hirthanan Subenderan40368002020-03-10 15:36:48 -070029CHROMIUM_REVIEW_BASEURL = 'https://chromium-review.googlesource.com/a'
Hirthanan Subenderan00f18042020-02-11 17:24:38 -080030
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -080031# Order SUPPORTED_BRANCHES from oldest to newest
32SUPPORTED_BRANCHES = ['4.4', '4.14', '4.19', '5.4']
33UPSTREAM_START_BRANCH = 'v%s' % SUPPORTED_BRANCHES[0]
Hirthanan Subenderan00f18042020-02-11 17:24:38 -080034
Hirthanan Subenderan7d15b282020-03-02 16:29:08 -080035CHROMEOS_PATH = 'linux_chrome'
36STABLE_PATH = 'linux_stable'
37UPSTREAM_PATH = 'linux_upstream'
Hirthanan Subenderan00f18042020-02-11 17:24:38 -080038
Hirthanan Subenderan3e884d62020-01-23 13:12:45 -080039WORKDIR = os.getcwd()
Hirthanan Subenderan40368002020-03-10 15:36:48 -070040GIT_COOKIE_PATH = os.path.join(WORKDIR, '.git-credential-cache/cookie')
41
Hirthanan Subenderan3e884d62020-01-23 13:12:45 -080042
Hirthanan Subenderanb81acc22020-03-03 16:34:20 -080043class Status(Enum):
44 """Text representation of database enum to track status of gerrit CL."""
45 OPEN = 1 # Gerrit ticket was created for clean fix patch
46 MERGED = 2 # Gerrit ticket was merged and closed
47 ABANDONED = 3 # Gerrit ticket was abandoned
48 CONFLICT = 4 # Gerrit ticket NOT created since patch doesn't apply properly
49
50
Hirthanan Subenderancfada212020-02-28 15:12:39 -080051class Kernel(Enum):
52 """Enum representing which Kernel we are representing."""
53 linux_stable = 1
54 linux_chrome = 2
55 linux_upstream = 3
Hirthanan Subenderan3e884d62020-01-23 13:12:45 -080056
Hirthanan Subenderan00f18042020-02-11 17:24:38 -080057
Hirthanan Subenderan53dac7d2020-02-28 15:34:06 -080058class KernelMetadata(object):
59 """Object to group kernel Metadata."""
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -080060 path = None
61 repo = None
Hirthanan Subenderan53dac7d2020-02-28 15:34:06 -080062 kernel_fixes_table = None
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -080063 branches = None
64 tag_template = None
Hirthanan Subenderan53dac7d2020-02-28 15:34:06 -080065 get_kernel_branch = None
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -080066 update_table = None
Hirthanan Subenderan53dac7d2020-02-28 15:34:06 -080067
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -080068 def __init__(self, _path, _repo, _kernel_fixes_table, _branches, _tag_template,
69 _get_kernel_branch, _update_table):
70 self.path = _path
71 self.repo = _repo
Hirthanan Subenderan53dac7d2020-02-28 15:34:06 -080072 self.kernel_fixes_table = _kernel_fixes_table
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -080073 self.branches = _branches
74 self.tag_template = _tag_template
Hirthanan Subenderan53dac7d2020-02-28 15:34:06 -080075 self.get_kernel_branch = _get_kernel_branch
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -080076 self.update_table = _update_table
Hirthanan Subenderan53dac7d2020-02-28 15:34:06 -080077
78
Hirthanan Subenderan3e884d62020-01-23 13:12:45 -080079def stable_branch(version):
80 """Stable branch name"""
81 return 'linux-%s.y' % version
82
83
84def chromeos_branch(version):
85 """Chromeos branch name"""
86 return 'chromeos-%s' % version
87
Hirthanan Subenderancd9cbcb2020-03-25 19:43:12 -070088def search_upstream_sha(kernel_sha):
89 """Search for upstream sha that kernel_sha is cherry-picked from.
90
91 If found, return upstream_sha, otherwise return None.
92 """
93 usha = None
94 desc = subprocess.check_output(['git', 'show', '-s', kernel_sha],
95 encoding='utf-8', errors='ignore')
96
97 # "commit" is sometimes seen multiple times, such as with commit 6093aabdd0ee
98 m = re.findall(r'cherry picked from (commit )+([0-9a-f]+)', desc, re.M)
99 if not m:
100 m = re.findall(r'^\s*(commit )+([a-f0-9]+) upstream', desc, re.M)
101 if not m:
102 m = re.findall(r'^\s*\[\s*Upstream (commit )+([0-9a-f]+)\s*\]', desc, re.M)
103 if m:
104 # The patch may have been picked multiple times; only record the first entry.
105 usha = m.group(2)[:12]
106 return usha
107 return usha
Hirthanan Subenderan3e884d62020-01-23 13:12:45 -0800108
109def patch_link(changeID):
110 """Link to patch on gerrit"""
111 return 'https://chromium-review.googlesource.com/q/%s' % changeID
112
Hirthanan Subenderancfada212020-02-28 15:12:39 -0800113def update_previous_fetch(db, kernel, branch, last_sha):
114 """Updates the previous_fetch table for a kernel branch."""
115 c = db.cursor()
116 q = """UPDATE previous_fetch
117 SET sha_tip = %s
118 WHERE linux = %s AND branch = %s"""
119 c.execute(q, [last_sha, kernel.name, branch])
Hirthanan Subenderan3e884d62020-01-23 13:12:45 -0800120
Hirthanan Subenderancfada212020-02-28 15:12:39 -0800121 db.commit()
Hirthanan Subenderan3e884d62020-01-23 13:12:45 -0800122
Hirthanan Subenderandc721602020-03-13 15:48:10 -0700123def get_kernel_absolute_path(repo_name):
124 """Returns absolute path to kernel repositories"""
125 return os.path.join(WORKDIR, 'kernel_repositories', repo_name)
126
Hirthanan Subenderan3e884d62020-01-23 13:12:45 -0800127
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -0800128def update_kernel_db(db, kernel_metadata):
Hirthanan Subenderancfada212020-02-28 15:12:39 -0800129 """Update (upstream/stable/chrome) previous_fetch, fixes and commits SQL tables."""
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -0800130 path = kernel_metadata.path
Hirthanan Subenderandc721602020-03-13 15:48:10 -0700131 os.chdir(get_kernel_absolute_path(path))
Hirthanan Subenderancfada212020-02-28 15:12:39 -0800132
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -0800133 for branch in kernel_metadata.branches:
134 start = kernel_metadata.tag_template % branch
Hirthanan Subenderancfada212020-02-28 15:12:39 -0800135
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -0800136 print('Handling %s' % kernel_metadata.get_kernel_branch(branch))
Hirthanan Subenderancfada212020-02-28 15:12:39 -0800137
138 try:
139 c = db.cursor()
140 q = """SELECT sha_tip
141 FROM previous_fetch
142 WHERE linux = %s AND branch = %s"""
143 c.execute(q, [path, branch])
144 sha = c.fetchone()
145 if sha and sha[0]:
146 start = sha[0]
147 else:
148 q = """INSERT INTO previous_fetch (linux, branch, sha_tip)
149 VALUES (%s, %s, %s)"""
150 c.execute(q, [path, branch, start])
151 except MySQLdb.Error as e: # pylint: disable=no-member
152 print('Make sure the tables have been initialized in \
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -0800153 ./scripts/sql/initialize_sql_tables.sql')
154 raise e
Hirthanan Subenderan3e884d62020-01-23 13:12:45 -0800155
156
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -0800157 kernel_metadata.update_table(branch, start, db)
158 db.commit()
Hirthanan Subenderan3e884d62020-01-23 13:12:45 -0800159
Hirthanan Subenderancfada212020-02-28 15:12:39 -0800160 os.chdir(WORKDIR)
Hirthanan Subenderan53dac7d2020-02-28 15:34:06 -0800161
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -0800162def get_kernel_metadata(kernel):
163 """Returns KernelMetadata for each Kernel Enum"""
164 stable_kernel_metadata = KernelMetadata(STABLE_PATH, STABLE_REPO, 'stable_fixes',
165 SUPPORTED_BRANCHES, 'v%s', stable_branch, initdb_stable.update_stable_table)
166 chrome_kernel_metadata = KernelMetadata(CHROMEOS_PATH, CHROMEOS_REPO, 'chrome_fixes',
167 SUPPORTED_BRANCHES, 'v%s', chromeos_branch, initdb_chromeos.update_chrome_table)
Hirthanan Subenderandc721602020-03-13 15:48:10 -0700168 upstream_kernel_metadata = KernelMetadata(UPSTREAM_PATH, UPSTREAM_REPO, 'upstream_fixes',
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -0800169 [UPSTREAM_START_BRANCH], '%s', lambda *args: 'master',
170 initdb_upstream.update_upstream_table)
171
172 kernel_metadata_lookup = {
173 Kernel.linux_stable: stable_kernel_metadata,
174 Kernel.linux_chrome: chrome_kernel_metadata,
175 Kernel.linux_upstream: upstream_kernel_metadata
176 }
177
178 try:
179 return kernel_metadata_lookup[kernel]
180 except KeyError as e:
181 raise KeyError('Conditionals should match Kernel Enum types.', e)