Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cb8fb432 authored by Justin Yun's avatar Justin Yun
Browse files

bump.py automatically updates the code for libvintf

Vintf finalization requires adding the new API levels to the libvintf
code. Add the automation script for that with the finalization
process.
This process will be skipped if the code already has been updated.

Bug: 331696132
Test: tools/finalization/build-step-0-and-m.sh
Change-Id: Ibd6a71337d88b71708ef378e3862e6c67364b92b
parent 09315923
Loading
Loading
Loading
Loading
+56 −6
Original line number Original line Diff line number Diff line
@@ -21,7 +21,7 @@ Creates the next compatibility matrix.
import argparse
import argparse
import os
import os
import pathlib
import pathlib
import shutil
import re
import subprocess
import subprocess
import textwrap
import textwrap


@@ -44,6 +44,7 @@ class Bump(object):


        self.current_level = cmdline_args.current_level
        self.current_level = cmdline_args.current_level
        self.current_letter = cmdline_args.current_letter
        self.current_letter = cmdline_args.current_letter
        self.current_version = cmdline_args.platform_version
        self.current_module_name = f"framework_compatibility_matrix.{self.current_level}.xml"
        self.current_module_name = f"framework_compatibility_matrix.{self.current_level}.xml"
        self.current_xml = self.interfaces_dir / f"compatibility_matrices/compatibility_matrix.{self.current_level}.xml"
        self.current_xml = self.interfaces_dir / f"compatibility_matrices/compatibility_matrix.{self.current_level}.xml"
        self.device_module_name = "framework_compatibility_matrix.device.xml"
        self.device_module_name = "framework_compatibility_matrix.device.xml"
@@ -58,12 +59,13 @@ class Bump(object):
        self.copy_matrix()
        self.copy_matrix()
        self.edit_android_bp()
        self.edit_android_bp()
        self.edit_android_mk()
        self.edit_android_mk()
        self.bump_libvintf()


    def bump_kernel_configs(self):
    def bump_kernel_configs(self):
        check_call([
        check_call([
            self.top / "kernel/configs/tools/bump.py",
            self.top / "kernel/configs/tools/bump.py",
            self.current_letter,
            self.current_letter.lower(),
            self.next_letter,
            self.next_letter.lower(),
        ])
        ])


    def copy_matrix(self):
    def copy_matrix(self):
@@ -87,7 +89,7 @@ class Bump(object):
        next_kernel_configs = check_output(
        next_kernel_configs = check_output(
            """grep -rh name: | sed -E 's/^.*"(.*)".*/\\1/g'""",
            """grep -rh name: | sed -E 's/^.*"(.*)".*/\\1/g'""",
            cwd=self.top / "kernel/configs" /
            cwd=self.top / "kernel/configs" /
            self.next_letter,
            self.next_letter.lower(),
            text=True,
            text=True,
            shell=True,
            shell=True,
        ).splitlines()
        ).splitlines()
@@ -128,21 +130,69 @@ class Bump(object):
        with open(android_mk, "w") as f:
        with open(android_mk, "w") as f:
            f.write("".join(lines))
            f.write("".join(lines))


    def bump_libvintf(self):
        if not self.current_version:
            print("Skip libvintf update...")
            return
        try:
            check_call(["grep", "-h",
                        f"{self.current_letter.upper()} = {self.current_level}",
                        "system/libvintf/include/vintf/Level.h"])
        except subprocess.CalledProcessError:
            print("Adding new API level to libvintf")
            add_lines_above("system/libvintf/analyze_matrix/analyze_matrix.cpp",
                            "        case Level::UNSPECIFIED:",
                            textwrap.indent(textwrap.dedent(f"""\
                                    case Level::{self.current_letter.upper()}:
                                        return "Android {self.current_version} ({self.current_letter.upper()})";"""),
                            "    "*2))
            add_lines_above("system/libvintf/include/vintf/Level.h",
                            "    // To add new values:",
                            f"    {self.current_letter.upper()} = {self.current_level},")
            add_lines_above("system/libvintf/include/vintf/Level.h",
                            "        Level::UNSPECIFIED,",
                            f"        Level::{self.current_letter.upper()},")
            add_lines_above("system/libvintf/RuntimeInfo.cpp",
                            "            // Add more levels above this line.",
                            textwrap.indent(textwrap.dedent(f"""\
                                        case {self.current_version}: {{
                                            ret = Level::{self.current_letter.upper()};
                                        }} break;"""),
                            "    "*3))


def add_lines_above(file, pattern, lines):
    with open(file, 'r+') as f:
        text = f.read()
        split_text = re.split(rf"\n{pattern}\n", text)
        if len(split_text) != 2:
            # Only one pattern must be found, otherwise the source must be
            # changed unexpectedly.
            raise Exception(
                f'Pattern "{pattern}" not found or multiple patterns found in {file}')
        f.seek(0)
        f.write(f"\n{lines}\n{pattern}\n".join(split_text))
        f.truncate()



def main():
def main():
    parser = argparse.ArgumentParser(description=__doc__)
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument("current_level",
    parser.add_argument("current_level",
                        type=str,
                        type=str,
                        help="VINTF level of the current version (e.g. 9)")
                        help="VINTF level of the current version (e.g. 202404)")
    parser.add_argument("next_level",
    parser.add_argument("next_level",
                        type=str,
                        type=str,
                        help="VINTF level of the next version (e.g. 10)")
                        help="VINTF level of the next version (e.g. 202504)")
    parser.add_argument("current_letter",
    parser.add_argument("current_letter",
                        type=str,
                        type=str,
                        help="Letter of the API level of the current version (e.g. v)")
                        help="Letter of the API level of the current version (e.g. v)")
    parser.add_argument("next_letter",
    parser.add_argument("next_letter",
                        type=str,
                        type=str,
                        help="Letter of the API level of the next version (e.g. w)")
                        help="Letter of the API level of the next version (e.g. w)")
    parser.add_argument("platform_version",
                        type=str,
                        nargs="?",
                        help="Android release version number number (e.g. 15)")
    cmdline_args = parser.parse_args()
    cmdline_args = parser.parse_args()


    Bump(cmdline_args).run()
    Bump(cmdline_args).run()