Imported Upstream version 1.27.0
[platform/upstream/grpc.git] / tools / buildgen / plugins / expand_version.py
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
16 This parses the list of targets from the yaml build file, and creates
17 a custom version string for each language's package.
18
19 """
20
21 import re
22
23 LANGUAGES = [
24     'core',
25     'cpp',
26     'csharp',
27     'node',
28     'objc',
29     'php',
30     'python',
31     'ruby',
32 ]
33
34
35 class Version:
36
37     def __init__(self, version_str, override_major=None):
38         self.tag = None
39         if '-' in version_str:
40             version_str, self.tag = version_str.split('-')
41         self.major, self.minor, self.patch = [
42             int(x) for x in version_str.split('.')
43         ]
44         if override_major:
45             self.major = override_major
46
47     def __str__(self):
48         """Version string in a somewhat idiomatic style for most languages"""
49         version_str = '%d.%d.%d' % (self.major, self.minor, self.patch)
50         if self.tag:
51             version_str += '-%s' % self.tag
52         return version_str
53
54     def pep440(self):
55         """Version string in Python PEP440 style"""
56         s = '%d.%d.%d' % (self.major, self.minor, self.patch)
57         if self.tag:
58             # we need to translate from grpc version tags to pep440 version
59             # tags; this code is likely to be a little ad-hoc
60             if self.tag == 'dev':
61                 s += '.dev0'
62             elif len(self.tag) >= 3 and self.tag[0:3] == 'pre':
63                 s += 'rc%d' % int(self.tag[3:])
64             else:
65                 raise Exception(
66                     'Don\'t know how to translate version tag "%s" to pep440' %
67                     self.tag)
68         return s
69
70     def ruby(self):
71         """Version string in Ruby style"""
72         if self.tag:
73             return '%d.%d.%d.%s' % (self.major, self.minor, self.patch,
74                                     self.tag)
75         else:
76             return '%d.%d.%d' % (self.major, self.minor, self.patch)
77
78     def php(self):
79         """Version string for PHP PECL package"""
80         s = '%d.%d.%d' % (self.major, self.minor, self.patch)
81         if self.tag:
82             if self.tag == 'dev':
83                 s += 'dev'
84             elif len(self.tag) >= 3 and self.tag[0:3] == 'pre':
85                 s += 'RC%d' % int(self.tag[3:])
86             else:
87                 raise Exception(
88                     'Don\'t know how to translate version tag "%s" to PECL version'
89                     % self.tag)
90         return s
91
92     def php_stability(self):
93         """stability string for PHP PECL package.xml file"""
94         if self.tag:
95             return 'beta'
96         else:
97             return 'stable'
98
99     def php_composer(self):
100         """Version string for PHP Composer package"""
101         return '%d.%d.%d' % (self.major, self.minor, self.patch)
102
103     def php_current_version(self):
104         return '7.2'
105
106     def php_debian_version(self):
107         return 'stretch'
108
109
110 def mako_plugin(dictionary):
111     """Expand version numbers:
112      - for each language, ensure there's a language_version tag in
113        settings (defaulting to the master version tag)
114      - expand version strings to major, minor, patch, and tag
115   """
116
117     settings = dictionary['settings']
118     version_str = settings['version']
119     master_version = Version(version_str)
120     settings['version'] = master_version
121     for language in LANGUAGES:
122         version_tag = '%s_version' % language
123         override_major = settings.get('%s_major_version' % language, None)
124         if version_tag in settings:
125             settings[version_tag] = Version(settings[version_tag],
126                                             override_major=override_major)
127         else:
128             settings[version_tag] = Version(version_str,
129                                             override_major=override_major)