# Copyright 2016 gRPC authors. # # 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. """Buildgen package version plugin This parses the list of targets from the yaml build file, and creates a custom version string for each language's package. """ import re LANGUAGES = [ "core", "cpp", "csharp", "node", "objc", "php", "python", "ruby", ] class Version: def __init__(self, version_str, override_major=None): self.tag = None if "-" in version_str: version_str, self.tag = version_str.split("-") self.major, self.minor, self.patch = [ int(x) for x in version_str.split(".") ] if override_major: self.major = override_major def __str__(self): """Version string in a somewhat idiomatic style for most languages""" version_str = "%d.%d.%d" % (self.major, self.minor, self.patch) if self.tag: version_str += "-%s" % self.tag return version_str def pep440(self): """Version string in Python PEP440 style""" s = "%d.%d.%d" % (self.major, self.minor, self.patch) if self.tag: # we need to translate from grpc version tags to pep440 version # tags; this code is likely to be a little ad-hoc if self.tag == "dev": s += ".dev0" elif len(self.tag) >= 3 and self.tag[0:3] == "pre": s += "rc%d" % int(self.tag[3:]) else: raise Exception( 'Don\'t know how to translate version tag "%s" to pep440' % self.tag ) return s def ruby(self): """Version string in Ruby style""" if self.tag: return "%d.%d.%d.%s" % ( self.major, self.minor, self.patch, self.tag, ) else: return "%d.%d.%d" % (self.major, self.minor, self.patch) def php(self): """Version string for PHP PECL package""" s = "%d.%d.%d" % (self.major, self.minor, self.patch) if self.tag: if self.tag == "dev": s += "dev" elif len(self.tag) >= 3 and self.tag[0:3] == "pre": s += "RC%d" % int(self.tag[3:]) else: raise Exception( 'Don\'t know how to translate version tag "%s" to PECL' " version" % self.tag ) return s def php_stability(self): """stability string for PHP PECL package.xml file""" if self.tag: return "beta" else: return "stable" def php_composer(self): """Version string for PHP Composer package""" return "%d.%d.%d" % (self.major, self.minor, self.patch) def php_current_version(self): return "7.4" def php_debian_version(self): return "buster" def mako_plugin(dictionary): """Expand version numbers: - for each language, ensure there's a language_version tag in settings (defaulting to the master version tag) - expand version strings to major, minor, patch, and tag """ settings = dictionary["settings"] version_str = settings["version"] master_version = Version(version_str) settings["version"] = master_version for language in LANGUAGES: version_tag = "%s_version" % language override_major = settings.get("%s_major_version" % language, None) if version_tag in settings: settings[version_tag] = Version( settings[version_tag], override_major=override_major ) else: settings[version_tag] = Version( version_str, override_major=override_major ) settings["protobuf_major_minor_version"] = ".".join( settings["protobuf_version"].split(".")[:2] )