|  | #!/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() |