blob: 4ee76330cf1714c674921006d626329cf9261223 [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
Guenter Roeckc1cf6692020-05-08 17:45:47 -070011import logging
Hirthanan Subenderan3e884d62020-01-23 13:12:45 -080012import os
Hirthanan Subenderan3e884d62020-01-23 13:12:45 -080013import re
Hirthanan Subenderana43fd4d2020-03-30 13:01:45 -070014import time
Hirthanan Subenderancfada212020-02-28 15:12:39 -080015from enum import Enum
Hirthanan Subenderancd9cbcb2020-03-25 19:43:12 -070016import subprocess
Guenter Roecke27f0462020-06-06 07:09:11 -070017import MySQLdb # pylint: disable=import-error
Hirthanan Subenderancfada212020-02-28 15:12:39 -080018
19import initdb_upstream
20import initdb_stable
21import initdb_chromeos
Hirthanan Subenderan3e884d62020-01-23 13:12:45 -080022
Hirthanan Subenderan00f18042020-02-11 17:24:38 -080023
24KERNEL_SITE = 'https://git.kernel.org/'
25UPSTREAM_REPO = KERNEL_SITE + 'pub/scm/linux/kernel/git/torvalds/linux'
26STABLE_REPO = KERNEL_SITE + 'pub/scm/linux/kernel/git/stable/linux-stable'
Guenter Roeck760f5812020-04-18 08:49:40 -070027STABLE_RC_REPO = KERNEL_SITE + 'pub/scm/linux/kernel/git/stable/linux-stable-rc'
Hirthanan Subenderan00f18042020-02-11 17:24:38 -080028
29CHROMIUM_SITE = 'https://chromium.googlesource.com/'
Hirthanan Subenderanc44a0b32020-03-11 22:34:39 -070030CHROMEOS_KERNEL_DIR = 'chromiumos/third_party/kernel'
31CHROMEOS_REPO = os.path.join(CHROMIUM_SITE, CHROMEOS_KERNEL_DIR)
Hirthanan Subenderan40368002020-03-10 15:36:48 -070032CHROMIUM_REVIEW_BASEURL = 'https://chromium-review.googlesource.com/a'
Hirthanan Subenderan00f18042020-02-11 17:24:38 -080033
Hirthanan Subenderan1a97fab2020-04-16 08:55:03 -070034# Order BRANCHES from oldest to newest
Guenter Roeck4a4f6d42020-09-27 18:03:06 -070035CHROMEOS_BRANCHES = ['4.4', '4.14', '4.19', '5.4', '5.10']
36STABLE_BRANCHES = ['4.4', '4.9', '4.14', '4.19', '5.4', '5.10']
Hirthanan Subenderan1a97fab2020-04-16 08:55:03 -070037
38UPSTREAM_START_BRANCH = 'v%s' % CHROMEOS_BRANCHES[0]
Hirthanan Subenderan00f18042020-02-11 17:24:38 -080039
Hirthanan Subenderan7d15b282020-03-02 16:29:08 -080040CHROMEOS_PATH = 'linux_chrome'
41STABLE_PATH = 'linux_stable'
Guenter Roeck760f5812020-04-18 08:49:40 -070042STABLE_RC_PATH = 'linux_stable_rc'
Hirthanan Subenderan7d15b282020-03-02 16:29:08 -080043UPSTREAM_PATH = 'linux_upstream'
Hirthanan Subenderan00f18042020-02-11 17:24:38 -080044
Hirthanan Subenderan3e884d62020-01-23 13:12:45 -080045WORKDIR = os.getcwd()
Hirthanan Subenderan1a99a522020-04-11 00:51:50 -070046HOMEDIR = os.path.expanduser('~')
47GCE_GIT_COOKIE_PATH = os.path.join(HOMEDIR, '.git-credential-cache/cookie')
48LOCAL_GIT_COOKIE_PATH = os.path.join(HOMEDIR, '.gitcookies')
Hirthanan Subenderan40368002020-03-10 15:36:48 -070049
Hirthanan Subenderan3e884d62020-01-23 13:12:45 -080050
Hirthanan Subenderanb81acc22020-03-03 16:34:20 -080051class Status(Enum):
52 """Text representation of database enum to track status of gerrit CL."""
53 OPEN = 1 # Gerrit ticket was created for clean fix patch
54 MERGED = 2 # Gerrit ticket was merged and closed
55 ABANDONED = 3 # Gerrit ticket was abandoned
56 CONFLICT = 4 # Gerrit ticket NOT created since patch doesn't apply properly
57
58
Hirthanan Subenderancfada212020-02-28 15:12:39 -080059class Kernel(Enum):
60 """Enum representing which Kernel we are representing."""
61 linux_stable = 1
Guenter Roeck760f5812020-04-18 08:49:40 -070062 linux_stable_rc = 2
63 linux_chrome = 3
64 linux_upstream = 4
Hirthanan Subenderan3e884d62020-01-23 13:12:45 -080065
Hirthanan Subenderan00f18042020-02-11 17:24:38 -080066
Guenter Roecke27f0462020-06-06 07:09:11 -070067class KernelMetadata():
Hirthanan Subenderan53dac7d2020-02-28 15:34:06 -080068 """Object to group kernel Metadata."""
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -080069 path = None
70 repo = None
Hirthanan Subenderan53dac7d2020-02-28 15:34:06 -080071 kernel_fixes_table = None
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -080072 branches = None
73 tag_template = None
Hirthanan Subenderan53dac7d2020-02-28 15:34:06 -080074 get_kernel_branch = None
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -080075 update_table = None
Hirthanan Subenderan53dac7d2020-02-28 15:34:06 -080076
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -080077 def __init__(self, _path, _repo, _kernel_fixes_table, _branches, _tag_template,
78 _get_kernel_branch, _update_table):
79 self.path = _path
80 self.repo = _repo
Hirthanan Subenderan53dac7d2020-02-28 15:34:06 -080081 self.kernel_fixes_table = _kernel_fixes_table
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -080082 self.branches = _branches
83 self.tag_template = _tag_template
Hirthanan Subenderan53dac7d2020-02-28 15:34:06 -080084 self.get_kernel_branch = _get_kernel_branch
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -080085 self.update_table = _update_table
Hirthanan Subenderan53dac7d2020-02-28 15:34:06 -080086
87
Hirthanan Subenderana43fd4d2020-03-30 13:01:45 -070088def get_current_time():
89 """Returns DATETIME in specific time format required by SQL."""
90 return time.strftime('%Y-%m-%d %H:%M%:%S')
91
92
Hirthanan Subenderan3e884d62020-01-23 13:12:45 -080093def stable_branch(version):
94 """Stable branch name"""
95 return 'linux-%s.y' % version
96
97
98def chromeos_branch(version):
99 """Chromeos branch name"""
100 return 'chromeos-%s' % version
101
Hirthanan Subenderana43fd4d2020-03-30 13:01:45 -0700102
Hirthanan Subenderancd9cbcb2020-03-25 19:43:12 -0700103def search_upstream_sha(kernel_sha):
104 """Search for upstream sha that kernel_sha is cherry-picked from.
105
106 If found, return upstream_sha, otherwise return None.
107 """
108 usha = None
109 desc = subprocess.check_output(['git', 'show', '-s', kernel_sha],
110 encoding='utf-8', errors='ignore')
111
112 # "commit" is sometimes seen multiple times, such as with commit 6093aabdd0ee
Hirthanan Subenderand26485a2020-04-06 14:37:55 -0700113 m = re.findall(r'cherry picked from (?:commit )+([0-9a-f]+)', desc, re.M)
Hirthanan Subenderancd9cbcb2020-03-25 19:43:12 -0700114 if not m:
Hirthanan Subenderand26485a2020-04-06 14:37:55 -0700115 m = re.findall(r'^\s*(?:commit )+([a-f0-9]+) upstream', desc, re.M)
Hirthanan Subenderancd9cbcb2020-03-25 19:43:12 -0700116 if not m:
Hirthanan Subenderand26485a2020-04-06 14:37:55 -0700117 m = re.findall(r'^\s*\[\s*Upstream (?:commit )+([0-9a-f]+)\s*\]', desc, re.M)
Hirthanan Subenderancd9cbcb2020-03-25 19:43:12 -0700118 if m:
Hirthanan Subenderand26485a2020-04-06 14:37:55 -0700119 # The patch may have been picked multiple times; only record the last entry.
120 usha = m[-1]
121 return usha[:12]
Hirthanan Subenderancd9cbcb2020-03-25 19:43:12 -0700122 return usha
Hirthanan Subenderan3e884d62020-01-23 13:12:45 -0800123
Hirthanan Subenderana43fd4d2020-03-30 13:01:45 -0700124
Hirthanan Subenderan3e884d62020-01-23 13:12:45 -0800125def patch_link(changeID):
126 """Link to patch on gerrit"""
127 return 'https://chromium-review.googlesource.com/q/%s' % changeID
128
Hirthanan Subenderana43fd4d2020-03-30 13:01:45 -0700129
Hirthanan Subenderancfada212020-02-28 15:12:39 -0800130def update_previous_fetch(db, kernel, branch, last_sha):
131 """Updates the previous_fetch table for a kernel branch."""
132 c = db.cursor()
133 q = """UPDATE previous_fetch
134 SET sha_tip = %s
135 WHERE linux = %s AND branch = %s"""
136 c.execute(q, [last_sha, kernel.name, branch])
Hirthanan Subenderan3e884d62020-01-23 13:12:45 -0800137
Hirthanan Subenderancfada212020-02-28 15:12:39 -0800138 db.commit()
Hirthanan Subenderan3e884d62020-01-23 13:12:45 -0800139
Hirthanan Subenderana43fd4d2020-03-30 13:01:45 -0700140
Hirthanan Subenderandc721602020-03-13 15:48:10 -0700141def get_kernel_absolute_path(repo_name):
142 """Returns absolute path to kernel repositories"""
Hirthanan Subenderan1a99a522020-04-11 00:51:50 -0700143 return os.path.join(HOMEDIR, 'kernel_repositories', repo_name)
Hirthanan Subenderandc721602020-03-13 15:48:10 -0700144
Hirthanan Subenderan3e884d62020-01-23 13:12:45 -0800145
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -0800146def update_kernel_db(db, kernel_metadata):
Hirthanan Subenderancfada212020-02-28 15:12:39 -0800147 """Update (upstream/stable/chrome) previous_fetch, fixes and commits SQL tables."""
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -0800148 path = kernel_metadata.path
Hirthanan Subenderandc721602020-03-13 15:48:10 -0700149 os.chdir(get_kernel_absolute_path(path))
Hirthanan Subenderancfada212020-02-28 15:12:39 -0800150
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -0800151 for branch in kernel_metadata.branches:
152 start = kernel_metadata.tag_template % branch
Hirthanan Subenderancfada212020-02-28 15:12:39 -0800153
Guenter Roeckc1cf6692020-05-08 17:45:47 -0700154 logging.info('Handling %s', kernel_metadata.get_kernel_branch(branch))
Hirthanan Subenderancfada212020-02-28 15:12:39 -0800155
156 try:
157 c = db.cursor()
158 q = """SELECT sha_tip
159 FROM previous_fetch
160 WHERE linux = %s AND branch = %s"""
161 c.execute(q, [path, branch])
162 sha = c.fetchone()
163 if sha and sha[0]:
164 start = sha[0]
165 else:
166 q = """INSERT INTO previous_fetch (linux, branch, sha_tip)
167 VALUES (%s, %s, %s)"""
168 c.execute(q, [path, branch, start])
169 except MySQLdb.Error as e: # pylint: disable=no-member
Guenter Roeckc1cf6692020-05-08 17:45:47 -0700170 logging.error('Make sure the tables have been initialized in \
171 ./scripts/sql/initialize_sql_tables.sql')
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -0800172 raise e
Hirthanan Subenderan3e884d62020-01-23 13:12:45 -0800173
174
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -0800175 kernel_metadata.update_table(branch, start, db)
176 db.commit()
Hirthanan Subenderan3e884d62020-01-23 13:12:45 -0800177
Hirthanan Subenderancfada212020-02-28 15:12:39 -0800178 os.chdir(WORKDIR)
Hirthanan Subenderan53dac7d2020-02-28 15:34:06 -0800179
Hirthanan Subenderana43fd4d2020-03-30 13:01:45 -0700180
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -0800181def get_kernel_metadata(kernel):
182 """Returns KernelMetadata for each Kernel Enum"""
183 stable_kernel_metadata = KernelMetadata(STABLE_PATH, STABLE_REPO, 'stable_fixes',
Hirthanan Subenderan1a97fab2020-04-16 08:55:03 -0700184 STABLE_BRANCHES, 'v%s', stable_branch, initdb_stable.update_stable_table)
Guenter Roeck760f5812020-04-18 08:49:40 -0700185 stable_rc_kernel_metadata = KernelMetadata(STABLE_RC_PATH, STABLE_RC_REPO, 'stable_fixes',
186 STABLE_BRANCHES, 'v%s', stable_branch, initdb_stable.update_stable_table)
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -0800187 chrome_kernel_metadata = KernelMetadata(CHROMEOS_PATH, CHROMEOS_REPO, 'chrome_fixes',
Hirthanan Subenderan1a97fab2020-04-16 08:55:03 -0700188 CHROMEOS_BRANCHES, 'v%s', chromeos_branch, initdb_chromeos.update_chrome_table)
Hirthanan Subenderandc721602020-03-13 15:48:10 -0700189 upstream_kernel_metadata = KernelMetadata(UPSTREAM_PATH, UPSTREAM_REPO, 'upstream_fixes',
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -0800190 [UPSTREAM_START_BRANCH], '%s', lambda *args: 'master',
191 initdb_upstream.update_upstream_table)
192
193 kernel_metadata_lookup = {
194 Kernel.linux_stable: stable_kernel_metadata,
Guenter Roeck760f5812020-04-18 08:49:40 -0700195 Kernel.linux_stable_rc: stable_rc_kernel_metadata,
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -0800196 Kernel.linux_chrome: chrome_kernel_metadata,
197 Kernel.linux_upstream: upstream_kernel_metadata
198 }
199
200 try:
201 return kernel_metadata_lookup[kernel]
202 except KeyError as e:
Guenter Roeck4a4f6d42020-09-27 18:03:06 -0700203 raise KeyError('Conditionals should match Kernel Enum types.', e) from e