blob: 938853baf0b927213ba5f38bc3d6bbcc869b5787 [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
14import MySQLdb
15
16import initdb_upstream
17import initdb_stable
18import initdb_chromeos
Hirthanan Subenderan3e884d62020-01-23 13:12:45 -080019
Hirthanan Subenderan00f18042020-02-11 17:24:38 -080020
21KERNEL_SITE = 'https://git.kernel.org/'
22UPSTREAM_REPO = KERNEL_SITE + 'pub/scm/linux/kernel/git/torvalds/linux'
23STABLE_REPO = KERNEL_SITE + 'pub/scm/linux/kernel/git/stable/linux-stable'
24
25CHROMIUM_SITE = 'https://chromium.googlesource.com/'
26CHROMEOS_REPO = CHROMIUM_SITE + 'chromiumos/third_party/kernel'
Hirthanan Subenderan40368002020-03-10 15:36:48 -070027CHROMIUM_REVIEW_BASEURL = 'https://chromium-review.googlesource.com/a'
Hirthanan Subenderan00f18042020-02-11 17:24:38 -080028
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -080029# Order SUPPORTED_BRANCHES from oldest to newest
30SUPPORTED_BRANCHES = ['4.4', '4.14', '4.19', '5.4']
31UPSTREAM_START_BRANCH = 'v%s' % SUPPORTED_BRANCHES[0]
Hirthanan Subenderan00f18042020-02-11 17:24:38 -080032
Hirthanan Subenderan7d15b282020-03-02 16:29:08 -080033CHROMEOS_PATH = 'linux_chrome'
34STABLE_PATH = 'linux_stable'
35UPSTREAM_PATH = 'linux_upstream'
Hirthanan Subenderan00f18042020-02-11 17:24:38 -080036
Hirthanan Subenderan3e884d62020-01-23 13:12:45 -080037WORKDIR = os.getcwd()
Hirthanan Subenderan40368002020-03-10 15:36:48 -070038GIT_COOKIE_PATH = os.path.join(WORKDIR, '.git-credential-cache/cookie')
39
Hirthanan Subenderan3e884d62020-01-23 13:12:45 -080040
41# "commit" is sometimes seen multiple times, such as with commit 6093aabdd0ee
42CHERRYPICK = re.compile(r'cherry picked from (commit )+([0-9a-f]+)')
43STABLE = re.compile(r'^\s*(commit )+([a-f0-9]+) upstream')
44STABLE2 = re.compile(r'^\s*\[\s*Upstream (commit )+([0-9a-f]+)\s*\]')
45
46
Hirthanan Subenderanb81acc22020-03-03 16:34:20 -080047class Status(Enum):
48 """Text representation of database enum to track status of gerrit CL."""
49 OPEN = 1 # Gerrit ticket was created for clean fix patch
50 MERGED = 2 # Gerrit ticket was merged and closed
51 ABANDONED = 3 # Gerrit ticket was abandoned
52 CONFLICT = 4 # Gerrit ticket NOT created since patch doesn't apply properly
53
54
Hirthanan Subenderancfada212020-02-28 15:12:39 -080055class Kernel(Enum):
56 """Enum representing which Kernel we are representing."""
57 linux_stable = 1
58 linux_chrome = 2
59 linux_upstream = 3
Hirthanan Subenderan3e884d62020-01-23 13:12:45 -080060
Hirthanan Subenderan00f18042020-02-11 17:24:38 -080061
Hirthanan Subenderan53dac7d2020-02-28 15:34:06 -080062class KernelMetadata(object):
63 """Object to group kernel Metadata."""
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -080064 path = None
65 repo = None
Hirthanan Subenderan53dac7d2020-02-28 15:34:06 -080066 kernel_fixes_table = None
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -080067 branches = None
68 tag_template = None
Hirthanan Subenderan53dac7d2020-02-28 15:34:06 -080069 get_kernel_branch = None
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -080070 update_table = None
Hirthanan Subenderan53dac7d2020-02-28 15:34:06 -080071
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -080072 def __init__(self, _path, _repo, _kernel_fixes_table, _branches, _tag_template,
73 _get_kernel_branch, _update_table):
74 self.path = _path
75 self.repo = _repo
Hirthanan Subenderan53dac7d2020-02-28 15:34:06 -080076 self.kernel_fixes_table = _kernel_fixes_table
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -080077 self.branches = _branches
78 self.tag_template = _tag_template
Hirthanan Subenderan53dac7d2020-02-28 15:34:06 -080079 self.get_kernel_branch = _get_kernel_branch
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -080080 self.update_table = _update_table
Hirthanan Subenderan53dac7d2020-02-28 15:34:06 -080081
82
Hirthanan Subenderan3e884d62020-01-23 13:12:45 -080083def stable_branch(version):
84 """Stable branch name"""
85 return 'linux-%s.y' % version
86
87
88def chromeos_branch(version):
89 """Chromeos branch name"""
90 return 'chromeos-%s' % version
91
92
93def patch_link(changeID):
94 """Link to patch on gerrit"""
95 return 'https://chromium-review.googlesource.com/q/%s' % changeID
96
Hirthanan Subenderancfada212020-02-28 15:12:39 -080097def update_previous_fetch(db, kernel, branch, last_sha):
98 """Updates the previous_fetch table for a kernel branch."""
99 c = db.cursor()
100 q = """UPDATE previous_fetch
101 SET sha_tip = %s
102 WHERE linux = %s AND branch = %s"""
103 c.execute(q, [last_sha, kernel.name, branch])
Hirthanan Subenderan3e884d62020-01-23 13:12:45 -0800104
Hirthanan Subenderancfada212020-02-28 15:12:39 -0800105 db.commit()
Hirthanan Subenderan3e884d62020-01-23 13:12:45 -0800106
107
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -0800108def update_kernel_db(db, kernel_metadata):
Hirthanan Subenderancfada212020-02-28 15:12:39 -0800109 """Update (upstream/stable/chrome) previous_fetch, fixes and commits SQL tables."""
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -0800110 path = kernel_metadata.path
Hirthanan Subenderancfada212020-02-28 15:12:39 -0800111
112 os.chdir(path)
113
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -0800114 for branch in kernel_metadata.branches:
115 start = kernel_metadata.tag_template % branch
Hirthanan Subenderancfada212020-02-28 15:12:39 -0800116
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -0800117 print('Handling %s' % kernel_metadata.get_kernel_branch(branch))
Hirthanan Subenderancfada212020-02-28 15:12:39 -0800118
119 try:
120 c = db.cursor()
121 q = """SELECT sha_tip
122 FROM previous_fetch
123 WHERE linux = %s AND branch = %s"""
124 c.execute(q, [path, branch])
125 sha = c.fetchone()
126 if sha and sha[0]:
127 start = sha[0]
128 else:
129 q = """INSERT INTO previous_fetch (linux, branch, sha_tip)
130 VALUES (%s, %s, %s)"""
131 c.execute(q, [path, branch, start])
132 except MySQLdb.Error as e: # pylint: disable=no-member
133 print('Make sure the tables have been initialized in \
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -0800134 ./scripts/sql/initialize_sql_tables.sql')
135 raise e
Hirthanan Subenderan3e884d62020-01-23 13:12:45 -0800136
137
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -0800138 kernel_metadata.update_table(branch, start, db)
139 db.commit()
Hirthanan Subenderan3e884d62020-01-23 13:12:45 -0800140
Hirthanan Subenderancfada212020-02-28 15:12:39 -0800141 os.chdir(WORKDIR)
Hirthanan Subenderan53dac7d2020-02-28 15:34:06 -0800142
Hirthanan Subenderanc77dee32020-03-04 12:07:56 -0800143def get_kernel_metadata(kernel):
144 """Returns KernelMetadata for each Kernel Enum"""
145 stable_kernel_metadata = KernelMetadata(STABLE_PATH, STABLE_REPO, 'stable_fixes',
146 SUPPORTED_BRANCHES, 'v%s', stable_branch, initdb_stable.update_stable_table)
147 chrome_kernel_metadata = KernelMetadata(CHROMEOS_PATH, CHROMEOS_REPO, 'chrome_fixes',
148 SUPPORTED_BRANCHES, 'v%s', chromeos_branch, initdb_chromeos.update_chrome_table)
149 upstream_kernel_metadata = KernelMetadata(UPSTREAM_PATH, 'upstream_fixes', UPSTREAM_REPO,
150 [UPSTREAM_START_BRANCH], '%s', lambda *args: 'master',
151 initdb_upstream.update_upstream_table)
152
153 kernel_metadata_lookup = {
154 Kernel.linux_stable: stable_kernel_metadata,
155 Kernel.linux_chrome: chrome_kernel_metadata,
156 Kernel.linux_upstream: upstream_kernel_metadata
157 }
158
159 try:
160 return kernel_metadata_lookup[kernel]
161 except KeyError as e:
162 raise KeyError('Conditionals should match Kernel Enum types.', e)