1*9e965d6fSRomain Jobredeaux# Copyright 2023 The Bazel Authors. All rights reserved. 2*9e965d6fSRomain Jobredeaux# 3*9e965d6fSRomain Jobredeaux# Licensed under the Apache License, Version 2.0 (the "License"); 4*9e965d6fSRomain Jobredeaux# you may not use this file except in compliance with the License. 5*9e965d6fSRomain Jobredeaux# You may obtain a copy of the License at 6*9e965d6fSRomain Jobredeaux# 7*9e965d6fSRomain Jobredeaux# http://www.apache.org/licenses/LICENSE-2.0 8*9e965d6fSRomain Jobredeaux# 9*9e965d6fSRomain Jobredeaux# Unless required by applicable law or agreed to in writing, software 10*9e965d6fSRomain Jobredeaux# distributed under the License is distributed on an "AS IS" BASIS, 11*9e965d6fSRomain Jobredeaux# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*9e965d6fSRomain Jobredeaux# See the License for the specific language governing permissions and 13*9e965d6fSRomain Jobredeaux# limitations under the License. 14*9e965d6fSRomain Jobredeaux 15*9e965d6fSRomain Jobredeaux"""Parse and compare Android revision strings.""" 16*9e965d6fSRomain Jobredeaux 17*9e965d6fSRomain Jobredeaux# TODO(katre): support preview versions. 18*9e965d6fSRomain JobredeauxAndroidRevisionInfo = provider( 19*9e965d6fSRomain Jobredeaux "Information about Android revision specifications.", 20*9e965d6fSRomain Jobredeaux fields = { 21*9e965d6fSRomain Jobredeaux "major": "The major version number", 22*9e965d6fSRomain Jobredeaux "minor": "The minor version number, or 0 if unset.", 23*9e965d6fSRomain Jobredeaux "micro": "The micro version number, or 0 if unset.", 24*9e965d6fSRomain Jobredeaux "version": "The version string.", 25*9e965d6fSRomain Jobredeaux "dir": "The directory where the revision would exist in an Android SDK.", 26*9e965d6fSRomain Jobredeaux }, 27*9e965d6fSRomain Jobredeaux) 28*9e965d6fSRomain Jobredeaux 29*9e965d6fSRomain Jobredeauxdef parse_android_revision(input): 30*9e965d6fSRomain Jobredeaux """Parse and Android revision string and return an AndroidRevisionInfo. 31*9e965d6fSRomain Jobredeaux 32*9e965d6fSRomain Jobredeaux Args: 33*9e965d6fSRomain Jobredeaux input: The raw revision string to parse. 34*9e965d6fSRomain Jobredeaux 35*9e965d6fSRomain Jobredeaux Returns: 36*9e965d6fSRomain Jobredeaux An AndroidRevisionInfo provider representing the input. 37*9e965d6fSRomain Jobredeaux """ 38*9e965d6fSRomain Jobredeaux input = input.strip() 39*9e965d6fSRomain Jobredeaux parts = input.split(".") 40*9e965d6fSRomain Jobredeaux if len(parts) < 1: 41*9e965d6fSRomain Jobredeaux fail("Invalid Android revision %s" % input) 42*9e965d6fSRomain Jobredeaux major = int(parts[0]) if len(parts) >= 1 else 0 43*9e965d6fSRomain Jobredeaux minor = int(parts[1]) if len(parts) >= 2 else 0 44*9e965d6fSRomain Jobredeaux micro = int(parts[2]) if len(parts) >= 3 else 0 45*9e965d6fSRomain Jobredeaux 46*9e965d6fSRomain Jobredeaux return AndroidRevisionInfo( 47*9e965d6fSRomain Jobredeaux version = input, 48*9e965d6fSRomain Jobredeaux dir = input, 49*9e965d6fSRomain Jobredeaux major = major, 50*9e965d6fSRomain Jobredeaux minor = minor, 51*9e965d6fSRomain Jobredeaux micro = micro, 52*9e965d6fSRomain Jobredeaux ) 53*9e965d6fSRomain Jobredeaux 54*9e965d6fSRomain Jobredeauxdef _compare_android_revision_field(first, second, name): 55*9e965d6fSRomain Jobredeaux first_val = getattr(first, name) 56*9e965d6fSRomain Jobredeaux second_val = getattr(second, name) 57*9e965d6fSRomain Jobredeaux if first_val > second_val: 58*9e965d6fSRomain Jobredeaux return first 59*9e965d6fSRomain Jobredeaux elif first_val < second_val: 60*9e965d6fSRomain Jobredeaux return second 61*9e965d6fSRomain Jobredeaux return None 62*9e965d6fSRomain Jobredeaux 63*9e965d6fSRomain Jobredeauxdef compare_android_revisions(first, second): 64*9e965d6fSRomain Jobredeaux """Compares two AndroidRevisionInfo providers and returns the one with the highest version. 65*9e965d6fSRomain Jobredeaux 66*9e965d6fSRomain Jobredeaux Args: 67*9e965d6fSRomain Jobredeaux first: The first revision to compare. 68*9e965d6fSRomain Jobredeaux second: The first revision to compare. 69*9e965d6fSRomain Jobredeaux 70*9e965d6fSRomain Jobredeaux Returns: 71*9e965d6fSRomain Jobredeaux The revision with the higher version number, or the first if they are equal. 72*9e965d6fSRomain Jobredeaux """ 73*9e965d6fSRomain Jobredeaux if first == None and second == None: 74*9e965d6fSRomain Jobredeaux return None 75*9e965d6fSRomain Jobredeaux if first != None and second == None: 76*9e965d6fSRomain Jobredeaux return first 77*9e965d6fSRomain Jobredeaux if first == None and second != None: 78*9e965d6fSRomain Jobredeaux return second 79*9e965d6fSRomain Jobredeaux highest = _compare_android_revision_field(first, second, "major") 80*9e965d6fSRomain Jobredeaux if highest != None: 81*9e965d6fSRomain Jobredeaux return highest 82*9e965d6fSRomain Jobredeaux highest = _compare_android_revision_field(first, second, "minor") 83*9e965d6fSRomain Jobredeaux if highest != None: 84*9e965d6fSRomain Jobredeaux return highest 85*9e965d6fSRomain Jobredeaux highest = _compare_android_revision_field(first, second, "micro") 86*9e965d6fSRomain Jobredeaux if highest != None: 87*9e965d6fSRomain Jobredeaux return highest 88*9e965d6fSRomain Jobredeaux return first 89