1# Copyright 2016 gRPC authors. 2# 3# Licensed under the Apache License, Version 2.0 (the "License"); 4# you may not use this file except in compliance with the License. 5# You may obtain a copy of the License at 6# 7# http://www.apache.org/licenses/LICENSE-2.0 8# 9# Unless required by applicable law or agreed to in writing, software 10# distributed under the License is distributed on an "AS IS" BASIS, 11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12# See the License for the specific language governing permissions and 13# limitations under the License. 14"""Buildgen package version plugin 15 16This parses the list of targets from the yaml build file, and creates 17a custom version string for each language's package. 18 19""" 20 21import re 22 23LANGUAGES = [ 24 "core", 25 "cpp", 26 "csharp", 27 "node", 28 "objc", 29 "php", 30 "python", 31 "ruby", 32] 33 34 35class Version: 36 def __init__(self, version_str, override_major=None): 37 self.tag = None 38 if "-" in version_str: 39 version_str, self.tag = version_str.split("-") 40 self.major, self.minor, self.patch = [ 41 int(x) for x in version_str.split(".") 42 ] 43 if override_major: 44 self.major = override_major 45 46 def __str__(self): 47 """Version string in a somewhat idiomatic style for most languages""" 48 version_str = "%d.%d.%d" % (self.major, self.minor, self.patch) 49 if self.tag: 50 version_str += "-%s" % self.tag 51 return version_str 52 53 def pep440(self): 54 """Version string in Python PEP440 style""" 55 s = "%d.%d.%d" % (self.major, self.minor, self.patch) 56 if self.tag: 57 # we need to translate from grpc version tags to pep440 version 58 # tags; this code is likely to be a little ad-hoc 59 if self.tag == "dev": 60 s += ".dev0" 61 elif len(self.tag) >= 3 and self.tag[0:3] == "pre": 62 s += "rc%d" % int(self.tag[3:]) 63 else: 64 raise Exception( 65 'Don\'t know how to translate version tag "%s" to pep440' 66 % self.tag 67 ) 68 return s 69 70 def ruby(self): 71 """Version string in Ruby style""" 72 if self.tag: 73 return "%d.%d.%d.%s" % ( 74 self.major, 75 self.minor, 76 self.patch, 77 self.tag, 78 ) 79 else: 80 return "%d.%d.%d" % (self.major, self.minor, self.patch) 81 82 def php(self): 83 """Version string for PHP PECL package""" 84 s = "%d.%d.%d" % (self.major, self.minor, self.patch) 85 if self.tag: 86 if self.tag == "dev": 87 s += "dev" 88 elif len(self.tag) >= 3 and self.tag[0:3] == "pre": 89 s += "RC%d" % int(self.tag[3:]) 90 else: 91 raise Exception( 92 'Don\'t know how to translate version tag "%s" to PECL' 93 " version" % self.tag 94 ) 95 return s 96 97 def php_stability(self): 98 """stability string for PHP PECL package.xml file""" 99 if self.tag: 100 return "beta" 101 else: 102 return "stable" 103 104 def php_composer(self): 105 """Version string for PHP Composer package""" 106 return "%d.%d.%d" % (self.major, self.minor, self.patch) 107 108 def php_current_version(self): 109 return "8.1" 110 111 def php_debian_version(self): 112 return "buster" 113 114 115def mako_plugin(dictionary): 116 """Expand version numbers: 117 - for each language, ensure there's a language_version tag in 118 settings (defaulting to the master version tag) 119 - expand version strings to major, minor, patch, and tag 120 """ 121 122 settings = dictionary["settings"] 123 version_str = settings["version"] 124 master_version = Version(version_str) 125 settings["version"] = master_version 126 for language in LANGUAGES: 127 version_tag = "%s_version" % language 128 override_major = settings.get("%s_major_version" % language, None) 129 if version_tag in settings: 130 settings[version_tag] = Version( 131 settings[version_tag], override_major=override_major 132 ) 133 else: 134 settings[version_tag] = Version( 135 version_str, override_major=override_major 136 ) 137