xref: /aosp_15_r20/external/grpc-grpc/tools/buildgen/plugins/expand_version.py (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
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