hooks: add alint support

In order to roll it out to all Android, Alint needs to have a method to
run it in hooks.py

Bug: 433460364
Test: unittests
Change-Id: I301736d2946b5bcb8fb2663229745958d9386c6d
Reviewed-on: https://gerrit-review.googlesource.com/c/git-repohooks/+/494721
Reviewed-by: Damian Turczynski <damtur@google.com>
Commit-Queue: Doğancan Emek <dogancanemek@google.com>
Reviewed-by: Mike Frysinger <vapier@google.com>
Tested-by: Doğancan Emek <dogancanemek@google.com>
diff --git a/README.md b/README.md
index 26bd812..40afc20 100644
--- a/README.md
+++ b/README.md
@@ -178,6 +178,7 @@
 canned hooks already included geared towards AOSP style guidelines.
 
 * `aidl_format`: Run AIDL files (.aidl) through `aidl-format`.
+* `alint`: Run AyeAye (Google Android service) analyzers on the CL to be uploaded.
 * `aosp_license`: Check if all new-added file have valid AOSP license headers.
 * `android_test_mapping_format`: Validate TEST_MAPPING files in Android source
   code. Refer to go/test-mapping for more details.
@@ -280,6 +281,7 @@
 distros/versions.  The following tools are recognized:
 
 * `aidl-format`: used for the `aidl_format` builtin hook.
+* `alint`: used for the `alint` builtin hook.
 * `android-test-mapping-format`: used for the `android_test_mapping_format`
   builtin hook.
 * `black`: used for the `black` builtin hook.
diff --git a/rh/hooks.py b/rh/hooks.py
index 8f128b0..97c744f 100644
--- a/rh/hooks.py
+++ b/rh/hooks.py
@@ -1288,10 +1288,23 @@
     return ret
 
 
+def check_alint(project, commit, _desc, diff, options=None):
+    """Runs alint on the commit."""
+    if options.args():
+        raise ValueError("alint check takes no options")
+
+    alint_path = options.tool_path("alint")
+
+    cmd = [alint_path] + options.args((), diff) + ["--commit", commit]
+
+    return _check_cmd("alint", project, commit, cmd)
+
+
 # Hooks that projects can opt into.
 # Note: Make sure to keep the top level README.md up to date when adding more!
 BUILTIN_HOOKS = {
     "aidl_format": check_aidl_format,
+    "alint": check_alint,
     "android_test_mapping_format": check_android_test_mapping,
     "aosp_license": check_aosp_license,
     "black": check_black,
@@ -1320,6 +1333,7 @@
 # Note: Make sure to keep the top level README.md up to date when adding more!
 TOOL_PATHS = {
     "aidl-format": "aidl-format",
+    "alint": "alint",
     "android-test-mapping-format": os.path.join(
         TOOLS_DIR, "android_test_mapping_format.py"
     ),
diff --git a/rh/hooks_unittest.py b/rh/hooks_unittest.py
index 77a1880..382911e 100755
--- a/rh/hooks_unittest.py
+++ b/rh/hooks_unittest.py
@@ -1174,6 +1174,18 @@
         )
         self.assertIsNotNone(ret)
 
+    def test_alint(self, mock_check, mock_run):
+        """Verify the alint builtin hook."""
+        commit = """Add test to the manifest
+        Bug: 11111
+        Test: ...
+        Flag: ..."""
+        diff = [rh.git.RawDiffEntry(file="file.txt", status="A")]
+        ret = rh.hooks.check_alint(
+            self.project, commit, "desc", diff, options=self.options
+        )
+        self.assertIsNotNone(ret)
+
 
 if __name__ == "__main__":
     unittest.main()