tdesktop/Telegram/build/set_version.py

154 lines
5.1 KiB
Python

'''
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.
For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
'''
import sys, os, re, subprocess, io
def finish(code):
global executePath
os.chdir(executePath)
sys.exit(code)
if sys.platform == 'win32' and not 'COMSPEC' in os.environ:
print('[ERROR] COMSPEC environment variable is not set.')
finish(1)
executePath = os.getcwd()
scriptPath = os.path.dirname(os.path.realpath(__file__))
inputVersion = ''
versionOriginal = ''
versionMajor = ''
versionMinor = ''
versionPatch = ''
versionAlpha = '0'
versionBeta = False
for arg in sys.argv:
match = re.match(r'^\s*(\d+)\.(\d+)(\.(\d+)(\.(\d+|beta))?)?\s*$', arg)
if match:
inputVersion = arg
versionOriginal = inputVersion
versionMajor = match.group(1)
versionMinor = match.group(2)
versionPatch = match.group(4) if match.group(4) else '0'
versionAlphaBeta = match.group(5) if match.group(5) else ''
if len(versionAlphaBeta) > 0:
if match.group(6) == 'beta':
versionBeta = True
else:
versionAlpha = match.group(6)
if not len(versionMajor):
print("Wrong version parameter")
finish(1)
def checkVersionPart(part):
cleared = int(part) % 1000 if len(part) > 0 else 0
if str(cleared) != part:
print("Bad version part: " + part)
finish(1)
checkVersionPart(versionMajor)
checkVersionPart(versionMinor)
checkVersionPart(versionPatch)
checkVersionPart(versionAlpha)
versionFull = str(int(versionMajor) * 1000000 + int(versionMinor) * 1000 + int(versionPatch))
versionFullAlpha = '0'
if versionAlpha != '0':
versionFullAlpha = str(int(versionFull) * 1000 + int(versionAlpha))
versionStr = versionMajor + '.' + versionMinor + '.' + versionPatch
versionStrSmall = versionStr if versionPatch != '0' else versionMajor + '.' + versionMinor
if versionBeta:
print('Setting version: ' + versionStr + ' beta')
elif versionAlpha != '0':
print('Setting version: ' + versionStr + '.' + versionAlpha + ' closed alpha')
else:
print('Setting version: ' + versionStr + ' stable')
#def replaceInFile(path, replaces):
def checkChangelog():
global scriptPath, versionStr, versionStrSmall
count = 0
with io.open(scriptPath + '/../../changelog.txt', encoding='utf-8') as f:
for line in f:
if line.startswith(versionStr + ' ') or line.startswith(versionStrSmall + ' '):
count = count + 1
if count == 0:
print('Changelog entry not found!')
finish(1)
elif count != 1:
print('Wrong changelog entries count found: ' + count)
finish(1)
checkChangelog()
def replaceInFile(path, replacements):
content = ''
foundReplacements = {}
updated = False
with open(path, 'r') as f:
for line in f:
for replacement in replacements:
if re.search(replacement[0], line):
changed = re.sub(replacement[0], replacement[1], line)
if changed != line:
line = changed
updated = True
foundReplacements[replacement[0]] = True
content = content + line
for replacement in replacements:
if not replacement[0] in foundReplacements:
print('Could not find "' + replacement[0] + '" in "' + path + '".')
finish(1)
if updated:
with open(path, 'w') as f:
f.write(content)
print('Patching build/version...')
replaceInFile(scriptPath + '/version', [
[ r'(AppVersion\s+)\d+', r'\g<1>' + versionFull ],
[ r'(AppVersionStrMajor\s+)\d[\d\.]*', r'\g<1>' + versionMajor + '.' + versionMinor ],
[ r'(AppVersionStrSmall\s+)\d[\d\.]*', r'\g<1>' + versionStrSmall ],
[ r'(AppVersionStr\s+)\d[\d\.]*', r'\g<1>' + versionStr ],
[ r'(BetaChannel\s+)\d', r'\g<1>' + ('1' if versionBeta else '0') ],
[ r'(AlphaVersion\s+)\d+', r'\g<1>' + versionFullAlpha ],
[ r'(AppVersionOriginal\s+)\d[\d\.beta]*', r'\g<1>' + versionOriginal ],
])
print('Patching core/version.h...')
replaceInFile(scriptPath + '/../SourceFiles/core/version.h', [
[ r'(TDESKTOP_REQUESTED_ALPHA_VERSION\s+)\(\d+ULL\)', r'\g<1>(' + versionFullAlpha + 'ULL)' ],
[ r'(AppVersion\s+=\s+)\d+', r'\g<1>' + versionFull ],
[ r'(AppVersionStr\s+=\s+)[^;]+', r'\g<1>"' + versionStrSmall + '"' ],
[ r'(AppBetaVersion\s+=\s+)[a-z]+', r'\g<1>' + ('true' if versionBeta else 'false') ],
])
parts = [versionMajor, versionMinor, versionPatch, versionAlpha]
withcomma = ','.join(parts)
withdot = '.'.join(parts)
rcReplaces = [
[ r'(FILEVERSION\s+)\d+,\d+,\d+,\d+', r'\g<1>' + withcomma ],
[ r'(PRODUCTVERSION\s+)\d+,\d+,\d+,\d+', r'\g<1>' + withcomma ],
[ r'("FileVersion",\s+)"\d+\.\d+\.\d+\.\d+"', r'\g<1>"' + withdot + '"' ],
[ r'("ProductVersion",\s+)"\d+\.\d+\.\d+\.\d+"', r'\g<1>"' + withdot + '"' ],
]
print('Patching Telegram.rc...')
replaceInFile(scriptPath + '/../Resources/winrc/Telegram.rc', rcReplaces)
print('Patching Updater.rc...')
replaceInFile(scriptPath + '/../Resources/winrc/Updater.rc', rcReplaces)
print('Patching appxmanifest.xml...')
replaceInFile(scriptPath + '/../Resources/uwp/AppX/AppxManifest.xml', [
[ r'( Version=)"\d+\.\d+\.\d+\.\d+"', r'\g<1>"' + withdot + '"' ],
])