protobuf/update_version.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 # Usage: ./update_version.py <MAJOR>.<MINOR>.<MICRO> [<RC version>]
3 #
4 # Example:
5 # ./update_version.py 3.7.1 2
6 # => Version will become 3.7.1-rc-2 (beta)
7 # ./update_version.py 3.7.1
8 # => Version will become 3.7.1 (stable)
9 
10 import datetime
11 import re
12 import sys
13 from xml.dom import minidom
14 
15 if len(sys.argv) < 2 or len(sys.argv) > 3:
16  print("""
17 [ERROR] Please specify a version.
18 
19 ./update_version.py <MAJOR>.<MINOR>.<MICRO> [<RC version>]
20 
21 Example:
22 ./update_version.py 3.7.1 2
23 """)
24  exit(1)
25 
26 NEW_VERSION = sys.argv[1]
27 NEW_VERSION_INFO = [int(x) for x in NEW_VERSION.split('.')]
28 if len(NEW_VERSION_INFO) != 3:
29  print("""
30 [ERROR] Version must be in the format <MAJOR>.<MINOR>.<MICRO>
31 
32 Example:
33 ./update_version.py 3.7.3
34 """)
35  exit(1)
36 
37 RC_VERSION = -1
38 if len(sys.argv) > 2:
39  RC_VERSION = int(sys.argv[2])
40 
41 
42 def Find(elem, tagname):
43  for child in elem.childNodes:
44  if child.nodeName == tagname:
45  return child
46  return None
47 
48 
49 def FindAndClone(elem, tagname):
50  return Find(elem, tagname).cloneNode(True)
51 
52 
53 def ReplaceText(elem, text):
54  elem.firstChild.replaceWholeText(text)
55 
56 
57 def GetFullVersion(rc_suffix = '-rc-'):
58  if RC_VERSION < 0:
59  return NEW_VERSION
60  else:
61  return '%s%s%s' % (NEW_VERSION, rc_suffix, RC_VERSION)
62 
63 
64 def RewriteXml(filename, rewriter, add_xml_prefix=True):
65  document = minidom.parse(filename)
66  rewriter(document)
67  # document.toxml() always prepend the XML version without inserting new line.
68  # We wants to preserve as much of the original formatting as possible, so we
69  # will remove the default XML version and replace it with our custom one when
70  # whever necessary.
71  content = document.toxml().replace('<?xml version="1.0" ?>', '')
72  file_handle = open(filename, 'wb')
73  if add_xml_prefix:
74  file_handle.write(b'<?xml version="1.0" encoding="UTF-8"?>\n')
75  file_handle.write(content.encode('utf-8'))
76  file_handle.write(b'\n')
77  file_handle.close()
78 
79 
80 def RewriteTextFile(filename, line_rewriter):
81  lines = open(filename, 'r').readlines()
82  updated_lines = []
83  for line in lines:
84  updated_lines.append(line_rewriter(line))
85  if lines == updated_lines:
86  print('%s was not updated. Please double check.' % filename)
87  f = open(filename, 'w')
88  f.write(''.join(updated_lines))
89  f.close()
90 
91 
92 def UpdateConfigure():
93  RewriteTextFile('configure.ac',
94  lambda line : re.sub(
95  r'^AC_INIT\(\[Protocol Buffers\],\[.*\],\[protobuf@googlegroups.com\],\[protobuf\]\)$',
96  ('AC_INIT([Protocol Buffers],[%s],[protobuf@googlegroups.com],[protobuf])'
97  % GetFullVersion()),
98  line))
99 
100 
101 def UpdateCpp():
102  cpp_version = '%d%03d%03d' % (
103  NEW_VERSION_INFO[0], NEW_VERSION_INFO[1], NEW_VERSION_INFO[2])
104  version_suffix = ''
105  if RC_VERSION != -1:
106  version_suffix = '-rc%s' % RC_VERSION
107  def RewriteCommon(line):
108  line = re.sub(
109  r'^#define GOOGLE_PROTOBUF_VERSION .*$',
110  '#define GOOGLE_PROTOBUF_VERSION %s' % cpp_version,
111  line)
112  line = re.sub(
113  r'^#define PROTOBUF_VERSION .*$',
114  '#define PROTOBUF_VERSION %s' % cpp_version,
115  line)
116  line = re.sub(
117  r'^#define GOOGLE_PROTOBUF_VERSION_SUFFIX .*$',
118  '#define GOOGLE_PROTOBUF_VERSION_SUFFIX "%s"' % version_suffix,
119  line)
120  line = re.sub(
121  r'^#define PROTOBUF_VERSION_SUFFIX .*$',
122  '#define PROTOBUF_VERSION_SUFFIX "%s"' % version_suffix,
123  line)
124  if NEW_VERSION_INFO[2] == 0:
125  line = re.sub(
126  r'^#define PROTOBUF_MIN_HEADER_VERSION_FOR_PROTOC .*$',
127  '#define PROTOBUF_MIN_HEADER_VERSION_FOR_PROTOC %s' % cpp_version,
128  line)
129  line = re.sub(
130  r'^#define GOOGLE_PROTOBUF_MIN_PROTOC_VERSION .*$',
131  '#define GOOGLE_PROTOBUF_MIN_PROTOC_VERSION %s' % cpp_version,
132  line)
133  line = re.sub(
134  r'^static const int kMinHeaderVersionForLibrary = .*$',
135  'static const int kMinHeaderVersionForLibrary = %s;' % cpp_version,
136  line)
137  line = re.sub(
138  r'^static const int kMinHeaderVersionForProtoc = .*$',
139  'static const int kMinHeaderVersionForProtoc = %s;' % cpp_version,
140  line)
141  return line
142 
143  def RewritePortDef(line):
144  line = re.sub(
145  r'^#define PROTOBUF_VERSION .*$',
146  '#define PROTOBUF_VERSION %s' % cpp_version,
147  line)
148  line = re.sub(
149  r'^#define PROTOBUF_VERSION_SUFFIX .*$',
150  '#define PROTOBUF_VERSION_SUFFIX "%s"' % version_suffix,
151  line)
152  if NEW_VERSION_INFO[2] == 0:
153  line = re.sub(
154  r'^#define PROTOBUF_MIN_HEADER_VERSION_FOR_PROTOC .*$',
155  '#define PROTOBUF_MIN_HEADER_VERSION_FOR_PROTOC %s' % cpp_version,
156  line)
157  line = re.sub(
158  r'^#define PROTOBUF_MIN_PROTOC_VERSION .*$',
159  '#define PROTOBUF_MIN_PROTOC_VERSION %s' % cpp_version,
160  line)
161  line = re.sub(
162  r'^#define GOOGLE_PROTOBUF_MIN_LIBRARY_VERSION .*$',
163  '#define GOOGLE_PROTOBUF_MIN_LIBRARY_VERSION %s' % cpp_version,
164  line)
165  return line
166 
167  def RewritePbH(line):
168  line = re.sub(
169  r'^#if PROTOBUF_VERSION < .*$',
170  '#if PROTOBUF_VERSION < %s' % cpp_version,
171  line)
172  line = re.sub(
173  r'^#if .* < PROTOBUF_MIN_PROTOC_VERSION$',
174  '#if %s < PROTOBUF_MIN_PROTOC_VERSION' % cpp_version,
175  line)
176  return line
177 
178  RewriteTextFile('src/google/protobuf/stubs/common.h', RewriteCommon)
179  RewriteTextFile('src/google/protobuf/port_def.inc', RewritePortDef)
180  RewriteTextFile('src/google/protobuf/any.pb.h', RewritePbH)
181  RewriteTextFile('src/google/protobuf/api.pb.h', RewritePbH)
182  RewriteTextFile('src/google/protobuf/descriptor.pb.h', RewritePbH)
183  RewriteTextFile('src/google/protobuf/duration.pb.h', RewritePbH)
184  RewriteTextFile('src/google/protobuf/empty.pb.h', RewritePbH)
185  RewriteTextFile('src/google/protobuf/field_mask.pb.h', RewritePbH)
186  RewriteTextFile('src/google/protobuf/source_context.pb.h', RewritePbH)
187  RewriteTextFile('src/google/protobuf/struct.pb.h', RewritePbH)
188  RewriteTextFile('src/google/protobuf/timestamp.pb.h', RewritePbH)
189  RewriteTextFile('src/google/protobuf/type.pb.h', RewritePbH)
190  RewriteTextFile('src/google/protobuf/wrappers.pb.h', RewritePbH)
191  RewriteTextFile('src/google/protobuf/compiler/plugin.pb.h', RewritePbH)
192 
193 
194 def UpdateCsharp():
195  RewriteXml('csharp/src/Google.Protobuf/Google.Protobuf.csproj',
196  lambda document : ReplaceText(
197  Find(Find(document.documentElement, 'PropertyGroup'), 'VersionPrefix'),
198  GetFullVersion(rc_suffix = '-rc')),
199  add_xml_prefix=False)
200 
201  RewriteXml('csharp/Google.Protobuf.Tools.nuspec',
202  lambda document : ReplaceText(
203  Find(Find(document.documentElement, 'metadata'), 'version'),
204  GetFullVersion(rc_suffix = '-rc')))
205 
206 
207 def UpdateJava():
208  RewriteXml('java/pom.xml',
209  lambda document : ReplaceText(
210  Find(document.documentElement, 'version'), GetFullVersion()))
211 
212  RewriteXml('java/bom/pom.xml',
213  lambda document : ReplaceText(
214  Find(document.documentElement, 'version'), GetFullVersion()))
215 
216  RewriteXml('java/core/pom.xml',
217  lambda document : ReplaceText(
218  Find(Find(document.documentElement, 'parent'), 'version'),
219  GetFullVersion()))
220 
221  RewriteXml('java/lite/pom.xml',
222  lambda document : ReplaceText(
223  Find(Find(document.documentElement, 'parent'), 'version'),
224  GetFullVersion()))
225 
226  RewriteXml('java/util/pom.xml',
227  lambda document : ReplaceText(
228  Find(Find(document.documentElement, 'parent'), 'version'),
229  GetFullVersion()))
230 
231  RewriteXml('java/kotlin/pom.xml',
232  lambda document : ReplaceText(
233  Find(Find(document.documentElement, 'parent'), 'version'),
234  GetFullVersion()))
235 
236  RewriteXml('java/kotlin-lite/pom.xml',
237  lambda document : ReplaceText(
238  Find(Find(document.documentElement, 'parent'), 'version'),
239  GetFullVersion()))
240 
241  RewriteXml('protoc-artifacts/pom.xml',
242  lambda document : ReplaceText(
243  Find(document.documentElement, 'version'), GetFullVersion()))
244 
245  RewriteTextFile('java/README.md',
246  lambda line : re.sub(
247  r'<version>.*</version>',
248  '<version>%s</version>' % GetFullVersion(),
249  line))
250 
251  RewriteTextFile('java/README.md',
252  lambda line : re.sub(
253  r'implementation \'com.google.protobuf:protobuf-java:.*\'',
254  'implementation \'com.google.protobuf:protobuf-java:%s\'' % GetFullVersion(),
255  line))
256 
257  RewriteTextFile('java/lite.md',
258  lambda line : re.sub(
259  r'<version>.*</version>',
260  '<version>%s</version>' % GetFullVersion(),
261  line))
262 
263 
264 def UpdateJavaScript():
265  RewriteTextFile('js/package.json',
266  lambda line : re.sub(
267  r'^ "version": ".*",$',
268  ' "version": "%s",' % GetFullVersion(rc_suffix = '-rc.'),
269  line))
270 
271 
272 def UpdateMakefile():
273  protobuf_version_offset = 11
274  expected_major_version = 3
275  if NEW_VERSION_INFO[0] != expected_major_version:
276  print("""[ERROR] Major protobuf version has changed. Please update
277 update_version.py to readjust the protobuf_version_offset and
278 expected_major_version such that the PROTOBUF_VERSION in src/Makefile.am is
279 always increasing.
280  """)
281  exit(1)
282 
283  protobuf_version_info = '%d:%d:0' % (
284  NEW_VERSION_INFO[1] + protobuf_version_offset, NEW_VERSION_INFO[2])
285  RewriteTextFile('src/Makefile.am',
286  lambda line : re.sub(
287  r'^PROTOBUF_VERSION = .*$',
288  'PROTOBUF_VERSION = %s' % protobuf_version_info,
289  line))
290 
291 
292 def UpdateObjectiveC():
293  RewriteTextFile('Protobuf.podspec',
294  lambda line : re.sub(
295  r"^ s.version = '.*'$",
296  " s.version = '%s'" % GetFullVersion(rc_suffix = '-rc'),
297  line))
298  RewriteTextFile('Protobuf-C++.podspec',
299  lambda line : re.sub(
300  r"^ s.version = '.*'$",
301  " s.version = '%s'" % GetFullVersion(rc_suffix = '-rc'),
302  line))
303 
304 
305 def UpdatePhp():
306  def Callback(document):
307  def CreateNode(tagname, indent, children):
308  elem = document.createElement(tagname)
309  indent += 1
310  for child in children:
311  elem.appendChild(document.createTextNode('\n' + (' ' * indent)))
312  elem.appendChild(child)
313  indent -= 1
314  elem.appendChild(document.createTextNode('\n' + (' ' * indent)))
315  return elem
316 
317  root = document.documentElement
318  now = datetime.datetime.now()
319  ReplaceText(Find(root, 'date'), now.strftime('%Y-%m-%d'))
320  ReplaceText(Find(root, 'time'), now.strftime('%H:%M:%S'))
321  version = Find(root, 'version')
322  ReplaceText(Find(version, 'release'), GetFullVersion(rc_suffix = 'RC'))
323  ReplaceText(Find(version, 'api'), NEW_VERSION)
324  stability = Find(root, 'stability')
325  ReplaceText(Find(stability, 'release'),
326  'stable' if RC_VERSION < 0 else 'beta')
327  ReplaceText(Find(stability, 'api'), 'stable' if RC_VERSION < 0 else 'beta')
328  changelog = Find(root, 'changelog')
329  for old_version in changelog.getElementsByTagName('version'):
330  if Find(old_version, 'release').firstChild.nodeValue == NEW_VERSION:
331  print ('[WARNING] Version %s already exists in the change log.'
332  % NEW_VERSION)
333  return
334  if RC_VERSION != 0:
335  changelog.appendChild(document.createTextNode(' '))
336  release = CreateNode('release', 2, [
337  CreateNode('version', 3, [
338  FindAndClone(version, 'release'),
339  FindAndClone(version, 'api')
340  ]),
341  CreateNode('stability', 3, [
342  FindAndClone(stability, 'release'),
343  FindAndClone(stability, 'api')
344  ]),
345  FindAndClone(root, 'date'),
346  FindAndClone(root, 'time'),
347  FindAndClone(root, 'license'),
348  CreateNode('notes', 3, []),
349  ])
350  changelog.appendChild(release)
351  changelog.appendChild(document.createTextNode('\n '))
352  RewriteXml('php/ext/google/protobuf/package.xml', Callback)
353  RewriteTextFile('php/ext/google/protobuf/protobuf.h',
354  lambda line : re.sub(
355  r'PHP_PROTOBUF_VERSION ".*"$',
356  'PHP_PROTOBUF_VERSION "%s"' % NEW_VERSION,
357  line))
358 
359  RewriteTextFile('php/ext/google/protobuf/protobuf.h',
360  lambda line : re.sub(
361  r"^#define PHP_PROTOBUF_VERSION .*$",
362  "#define PHP_PROTOBUF_VERSION \"%s\"" % GetFullVersion(rc_suffix = 'RC'),
363  line))
364 
365  RewriteTextFile('php/ext/google/protobuf/protobuf.h',
366  lambda line : re.sub(
367  r"^#define PHP_PROTOBUF_VERSION .*$",
368  "#define PHP_PROTOBUF_VERSION \"%s\"" % GetFullVersion(rc_suffix = 'RC'),
369  line))
370 
371 def UpdatePython():
372  RewriteTextFile('python/google/protobuf/__init__.py',
373  lambda line : re.sub(
374  r"^__version__ = '.*'$",
375  "__version__ = '%s'" % GetFullVersion(rc_suffix = 'rc'),
376  line))
377 
378 def UpdateRuby():
379  RewriteXml('ruby/pom.xml',
380  lambda document : ReplaceText(
381  Find(document.documentElement, 'version'), GetFullVersion()))
382  RewriteXml('ruby/pom.xml',
383  lambda document : ReplaceText(
384  Find(Find(Find(document.documentElement, 'dependencies'), 'dependency'), 'version'),
385  GetFullVersion()))
386  RewriteTextFile('ruby/google-protobuf.gemspec',
387  lambda line : re.sub(
388  r'^ s.version = ".*"$',
389  ' s.version = "%s"' % GetFullVersion(rc_suffix = '.rc.'),
390  line))
391 
393  RewriteTextFile('protobuf_version.bzl',
394  lambda line : re.sub(
395  r"^PROTOBUF_VERSION = '.*'$",
396  "PROTOBUF_VERSION = '%s'" % GetFullVersion(),
397  line))
398 
399 
401 UpdateCsharp()
402 UpdateCpp()
403 UpdateJava()
407 UpdatePhp()
408 UpdatePython()
409 UpdateRuby()
410 UpdateBazel()
update_version.ReplaceText
def ReplaceText(elem, text)
Definition: bloaty/third_party/protobuf/update_version.py:53
update_version.UpdatePhp
def UpdatePhp()
Definition: bloaty/third_party/protobuf/update_version.py:238
update_version.UpdateObjectiveC
def UpdateObjectiveC()
Definition: bloaty/third_party/protobuf/update_version.py:225
update_version.UpdateMakefile
def UpdateMakefile()
Definition: bloaty/third_party/protobuf/update_version.py:205
xds_interop_client.int
int
Definition: xds_interop_client.py:113
update_version.Find
def Find(elem, tagname)
Definition: bloaty/third_party/protobuf/update_version.py:42
update_version.RewriteXml
def RewriteXml(filename, rewriter, add_xml_prefix=True)
Definition: bloaty/third_party/protobuf/update_version.py:64
update_version.RewriteTextFile
def RewriteTextFile(filename, line_rewriter)
Definition: bloaty/third_party/protobuf/update_version.py:80
update_version.UpdateCpp
def UpdateCpp()
Definition: bloaty/third_party/protobuf/update_version.py:101
update_version.UpdateJava
def UpdateJava()
Definition: bloaty/third_party/protobuf/update_version.py:168
update_version.UpdateJavaScript
def UpdateJavaScript()
Definition: bloaty/third_party/protobuf/update_version.py:197
update_version.UpdateBazel
def UpdateBazel()
Definition: protobuf/update_version.py:392
update_version.UpdateConfigure
def UpdateConfigure()
Definition: bloaty/third_party/protobuf/update_version.py:92
update_version.UpdateRuby
def UpdateRuby()
Definition: bloaty/third_party/protobuf/update_version.py:310
open
#define open
Definition: test-fs.c:46
update_version.UpdatePython
def UpdatePython()
Definition: bloaty/third_party/protobuf/update_version.py:303
len
int len
Definition: abseil-cpp/absl/base/internal/low_level_alloc_test.cc:46
update_version.UpdateCsharp
def UpdateCsharp()
Definition: bloaty/third_party/protobuf/update_version.py:155
update_version.GetFullVersion
def GetFullVersion(rc_suffix='-rc-')
Definition: bloaty/third_party/protobuf/update_version.py:57
update_version.FindAndClone
def FindAndClone(elem, tagname)
Definition: bloaty/third_party/protobuf/update_version.py:49


grpc
Author(s):
autogenerated on Thu Mar 13 2025 03:01:47