| # Copyright 2023 The Bazel Authors. All rights reserved. | |
| # | |
| # 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. | |
| """Parse and compare Android revision strings.""" | |
| # TODO(katre): support preview versions. | |
| AndroidRevisionInfo = provider( | |
| "Information about Android revision specifications.", | |
| fields = { | |
| "major": "The major version number", | |
| "minor": "The minor version number, or 0 if unset.", | |
| "micro": "The micro version number, or 0 if unset.", | |
| "version": "The version string.", | |
| "dir": "The directory where the revision would exist in an Android SDK.", | |
| }, | |
| ) | |
| def is_android_revision(input): | |
| return all([c.isdigit() for c in input.strip().split(".")]) | |
| def parse_android_revision(input): | |
| """Parse and Android revision string and return an AndroidRevisionInfo. | |
| Args: | |
| input: The raw revision string to parse. | |
| Returns: | |
| An AndroidRevisionInfo provider representing the input. | |
| """ | |
| if not is_android_revision(input): | |
| fail("Invalid Android revision %s" % input) | |
| parts = input.strip().split(".") | |
| major = int(parts[0]) if len(parts) >= 1 else 0 | |
| minor = int(parts[1]) if len(parts) >= 2 else 0 | |
| micro = int(parts[2]) if len(parts) >= 3 else 0 | |
| return AndroidRevisionInfo( | |
| version = input, | |
| dir = input, | |
| major = major, | |
| minor = minor, | |
| micro = micro, | |
| ) | |
| def _compare_android_revision_field(first, second, name): | |
| first_val = getattr(first, name) | |
| second_val = getattr(second, name) | |
| if first_val > second_val: | |
| return first | |
| elif first_val < second_val: | |
| return second | |
| return None | |
| def compare_android_revisions(first, second): | |
| """Compares two AndroidRevisionInfo providers and returns the one with the highest version. | |
| Args: | |
| first: The first revision to compare. | |
| second: The first revision to compare. | |
| Returns: | |
| The revision with the higher version number, or the first if they are equal. | |
| """ | |
| if first == None and second == None: | |
| return None | |
| if first != None and second == None: | |
| return first | |
| if first == None and second != None: | |
| return second | |
| highest = _compare_android_revision_field(first, second, "major") | |
| if highest != None: | |
| return highest | |
| highest = _compare_android_revision_field(first, second, "minor") | |
| if highest != None: | |
| return highest | |
| highest = _compare_android_revision_field(first, second, "micro") | |
| if highest != None: | |
| return highest | |
| return first |