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