| # 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.2' |
| |
| def php_debian_version(self): |
| return 'stretch' |
| |
| |
| 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])) |