Add a preupload hook to forbid use of "required" keyword in protobuf

Test: make a commit which adds 'required' keyword to some fields in
update_metadata.proto, do repo upload, make sure preupload hook fails

Change-Id: I98296130dbea3c711482a7c9488a73d3005c15ba
diff --git a/protobuflint.py b/protobuflint.py
new file mode 100755
index 0000000..02ccdbe
--- /dev/null
+++ b/protobuflint.py
@@ -0,0 +1,56 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2021 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.
+#
+
+"""CLI script for linting .proto files inside update_engine."""
+
+import sys
+import re
+import subprocess
+
+def check_proto_file(commit_hash, filename):
+  """Check if |filename| is consistnet with our protobuf guidelines
+
+    Args:
+      commit_hash: Hash of the git commit to look
+      filename: A filesystem path to a .proto file
+    Returns:
+      True if this file passes linting check, False otherwise
+  """
+  output = subprocess.check_output(
+      ["git", "diff", commit_hash+"~", commit_hash, "--", filename])
+  output = output.decode()
+  p = re.compile(r"^[+]?\s*required .*$", re.M)
+  m = p.search(output)
+  if m:
+    print("File", filename,
+          "contains 'required' keyword. Usage of required",
+          "is strongly discouraged in protobuf", m.group())
+    return False
+  return True
+
+def main():
+  if len(sys.argv) < 2:
+    print("Usage:", sys.argv[0], "commit_hash", "<file1>", "<file2>", "...")
+    sys.exit(1)
+  commit_hash = sys.argv[1]
+  for filename in sys.argv[2:]:
+    if filename.endswith(".proto"):
+      if not check_proto_file(commit_hash, filename):
+        sys.exit(1)
+
+if __name__ == "__main__":
+  main()