blob: 6374d8b3520f498e493c79c275131abd0ed34d05 [file] [log] [blame] [edit]
# Copyright (C) 2023 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Extracts the string representing the KMI from the kernel release string.
$ python3 get_kmi_string.py 5.15.123-android14-6-something
5.15-android14-6
$ python3 get_kmi_string.py --keep_sublevel 5.15.123-android14-6-something
5.15.123-android14-6
$ python3 get_kmi_string.py 6.1.55-mainline
6.1-mainline
"""
import argparse
import logging
import re
import sys
def get_kmi_string(kernel_release: str, keep_sublevel: bool) -> str:
"""Extracts the string representing the KMI from the kernel release string.
Check versioning scheme here:
https://source.android.com/docs/core/architecture/kernel/gki-versioning
Args:
kernel_release: the kernel release string to parse
keep_sublevel: whether sublevel is kept in the output
Returns:
A string representing the KMI.
>>> get_kmi_string("5.15.123", False)
'5.15'
>>> get_kmi_string("5.15.123", True)
'5.15.123'
>>> get_kmi_string("5.15.123-android14-6", True)
'5.15.123-android14-6'
>>> get_kmi_string("5.15.123-android14-6-something", True)
'5.15.123-android14-6'
>>> get_kmi_string("5.15.123-android14-6", False)
'5.15-android14-6'
>>> get_kmi_string("5.15.123-android14-6-something", False)
'5.15-android14-6'
>>> get_kmi_string("6.1.55-mainline", False)
'6.1-mainline'
>>> get_kmi_string("6.1.55-mainline-something", False)
'6.1-mainline'
>>> get_kmi_string("6.1.55-mainline-something", True)
'6.1.55-mainline'
"""
ver_pat = re.compile(
r"^(?P<version>\d+)\.(?P<patch>\d+)\.(?P<sublevel>\d+).*")
ver_mo = ver_pat.match(kernel_release)
if not ver_mo:
logging.error("Unrecognized kernel release %s. This is not a valid GKI version. See "
"https://source.android.com/docs/core/architecture/kernel/gki-versioning."
"Check early warnings in the build log for details.",
kernel_release)
sys.exit(1)
version = ver_mo.group("version")
patch_level = ver_mo.group("patch")
sublevel = ver_mo.group("sublevel")
ver_string = f"{version}.{patch_level}"
if keep_sublevel:
ver_string += f".{sublevel}"
if "mainline" in kernel_release.split("-"):
return f"{ver_string}-mainline"
kmi_pat = re.compile(
r"^(\d+)\.(\d+)\.(\d+)-(?P<release>android\d+)-(?P<gen>\d+)(?:-.*)?$")
kmi_mo = kmi_pat.match(kernel_release)
if not kmi_mo:
logging.warning("Unrecognized kernel release %s. This is not a valid GKI version. See "
"https://source.android.com/docs/core/architecture/kernel/gki-versioning."
"Check early warnings in the build log for details.",
kernel_release)
return ver_string
android_release = kmi_mo.group("release")
kmi_generation = kmi_mo.group("gen")
return f"{ver_string}-{android_release}-{kmi_generation}"
if __name__ == "__main__":
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--keep_sublevel", action="store_true")
parser.add_argument("kernel_release")
logging.basicConfig(stream=sys.stderr,
level=logging.WARNING,
format="%(levelname)s: %(message)s")
result = get_kmi_string(**vars(parser.parse_args()))
if result:
print(result)