expand_version.py 4.3 KB

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