[PATCH RFC 08/10] [RFC] scripts/get_abi.py: add support for symbol search

From: Mauro Carvalho Chehab
Date: Fri Jan 17 2025 - 13:01:13 EST


Add support for searching an ABI symbol

Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@xxxxxxxxxx>
---
scripts/get_abi.py | 73 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 73 insertions(+)

diff --git a/scripts/get_abi.py b/scripts/get_abi.py
index 64a0ec8b1d89..6a461f7cef32 100755
--- a/scripts/get_abi.py
+++ b/scripts/get_abi.py
@@ -498,6 +498,56 @@ class AbiParser:
self.log.warning("%s is defined %d times: %s",
what, len(f), "; ".join(f))

+ def search_symbols(self, expr):
+ """ Searches for ABI symbols """
+
+ regex = re.compile(expr, re.I)
+
+ found_keys = 0
+ for key, v in sorted(self.data.items(), key=lambda x: [0]):
+ wtype = v.get("type", "")
+ if wtype == "File":
+ continue
+
+ for what in v.get("what", [""]):
+ if regex.search(what):
+ found_keys += 1
+
+ kernelversion = v.get("kernelversion", "").strip(" \t\n")
+ date = v.get("date", "").strip(" \t\n")
+ contact = v.get("contact", "").strip(" \t\n")
+ users = v.get("users", "").strip(" \t\n")
+ desc = v.get("description", "").strip(" \t\n")
+
+ files = []
+ for f in v.get("file", ()):
+ files.append(f[0])
+
+ what = str(found_keys) + ". " + what
+ bar = "-" * len(what)
+
+ print(f"\n{what}\n{bar}\n")
+
+ if kernelversion:
+ print(f"Kernel version:\t\t{kernelversion}")
+
+ if date:
+ print(f"Date:\t\t\t{date}")
+
+ if contact:
+ print(f"Contact:\t\t{contact}")
+
+ if users:
+ print(f"Users:\t\t\t{users}")
+
+ print(f"Defined on file{'s'[:len(files) ^ 1]}:\t{", ".join(files)}")
+
+ if desc:
+ print(f"\n{desc.strip("\n")}\n")
+
+ if not found_keys:
+ print(f"Regular expression /{expr}/ not found.")
+

class AbiRest:
"""Initialize an argparse subparser for rest output"""
@@ -546,6 +596,28 @@ class AbiValidate:
args.parser.check_issues()


+class AbiSearch:
+ """Initialize an argparse subparser for ABI search"""
+
+ def __init__(self, subparsers):
+ """Initialize argparse subparsers"""
+
+ parser = subparsers.add_parser("search",
+ formatter_class=argparse.ArgumentDefaultsHelpFormatter,
+ description="Search ABI using a regular expression")
+
+ parser.add_argument("expression",
+ help="Case-insensitive search pattern for the ABI symbol")
+
+ parser.set_defaults(func=self.run)
+
+ def run(self, args):
+ """Run subparser"""
+
+ args.parser.parse_abi()
+ args.parser.search_symbols(args.expression)
+
+
def main():
"""Main program"""

@@ -560,6 +632,7 @@ def main():

AbiRest(subparsers)
AbiValidate(subparsers)
+ AbiSearch(subparsers)

args = parser.parse_args()

--
2.47.1