import argparse
from collections import namedtuple
_PACKAGE_NAMES = {
'CHROME': 0,
'CHROME_MODERN': 10,
'MONOCHROME': 20,
'TRICHROME': 30,
'TRICHROME_BETA': 40,
'TRICHROME_AUTO': 50,
'WEBVIEW_STABLE': 0,
'WEBVIEW_BETA': 10,
'WEBVIEW_DEV': 20,
}
_NEXT_BUILD_VERSION_CODE_DIFF = 50000
_APKS = {
'32': [
('CHROME', 'CHROME', '32'),
('CHROME_MODERN', 'CHROME_MODERN', '32'),
('MONOCHROME', 'MONOCHROME', '32'),
('TRICHROME', 'TRICHROME', '32'),
('TRICHROME_BETA', 'TRICHROME_BETA', '32'),
('WEBVIEW_STABLE', 'WEBVIEW_STABLE', '32'),
('WEBVIEW_BETA', 'WEBVIEW_BETA', '32'),
('WEBVIEW_DEV', 'WEBVIEW_DEV', '32'),
],
'64': [
('CHROME', 'CHROME', '64'),
('CHROME_MODERN', 'CHROME_MODERN', '64'),
('MONOCHROME', 'MONOCHROME', '32_64'),
('MONOCHROME_32', 'MONOCHROME', '32'),
('MONOCHROME_32_64', 'MONOCHROME', '32_64'),
('MONOCHROME_64_32', 'MONOCHROME', '64_32'),
('MONOCHROME_64', 'MONOCHROME', '64'),
('TRICHROME', 'TRICHROME', '32_64'),
('TRICHROME_32', 'TRICHROME', '32'),
('TRICHROME_32_64', 'TRICHROME', '32_64'),
('TRICHROME_64_32', 'TRICHROME', '64_32'),
('TRICHROME_64_32_HIGH', 'TRICHROME', '64_32_high'),
('TRICHROME_64', 'TRICHROME', '64'),
('TRICHROME_64_HIGH', 'TRICHROME', '64_32_high'), ('TRICHROME_AUTO_64_32', 'TRICHROME_AUTO', '64_32'),
('TRICHROME_BETA', 'TRICHROME_BETA', '32_64'),
('TRICHROME_32_BETA', 'TRICHROME_BETA', '32'),
('TRICHROME_32_64_BETA', 'TRICHROME_BETA', '32_64'),
('TRICHROME_64_32_BETA', 'TRICHROME_BETA', '64_32'),
('TRICHROME_64_32_HIGH_BETA', 'TRICHROME_BETA', '64_32_high'),
('TRICHROME_64_BETA', 'TRICHROME_BETA', '64'),
('TRICHROME_64_HIGH_BETA', 'TRICHROME_BETA', '64_32_high'),
('WEBVIEW_STABLE', 'WEBVIEW_STABLE', '32_64'),
('WEBVIEW_BETA', 'WEBVIEW_BETA', '32_64'),
('WEBVIEW_DEV', 'WEBVIEW_DEV', '32_64'),
('WEBVIEW_32_STABLE', 'WEBVIEW_STABLE', '32'),
('WEBVIEW_32_BETA', 'WEBVIEW_BETA', '32'),
('WEBVIEW_32_DEV', 'WEBVIEW_DEV', '32'),
('WEBVIEW_64_STABLE', 'WEBVIEW_STABLE', '64'),
('WEBVIEW_64_BETA', 'WEBVIEW_BETA', '64'),
('WEBVIEW_64_DEV', 'WEBVIEW_DEV', '64'),
]
}
_ARCH_TO_MFG_AND_BITNESS = {
'arm': ('arm', '32'),
'arm64': ('arm', '64'),
'x86': ('intel', '32'),
'x64': ('intel', '64'),
}
ARCH_CHOICES = _ARCH_TO_MFG_AND_BITNESS.keys()
_ABIS_TO_DIGIT_MASK = {
'arm': {
'32': 0,
'32_64': 3,
'64_32': 4,
'64': 5,
'64_32_high': 9,
},
'intel': {
'32': 1,
'32_64': 6,
'64_32': 7,
'64': 8,
},
}
VersionCodeComponents = namedtuple('VersionCodeComponents', [
'build_number',
'patch_number',
'package_name',
'abi',
'is_next_build',
])
def TranslateVersionCode(version_code, is_webview=False):
if len(version_code) == 9:
build_number = int(version_code[:4])
else:
build_number = int(version_code[:5])
is_next_build = False
patch_number_plus_extra = int(version_code[-5:])
if patch_number_plus_extra >= _NEXT_BUILD_VERSION_CODE_DIFF:
is_next_build = True
patch_number_plus_extra -= _NEXT_BUILD_VERSION_CODE_DIFF
patch_number = patch_number_plus_extra // 100
if build_number >= 3992:
abi_digit = int(version_code[-1])
package_digit = int(version_code[-2])
else:
abi_digit = int(version_code[-2])
package_digit = int(version_code[-1])
if build_number < 4844 and package_digit >= 5:
is_next_build = True
package_digit -= 5
for package, number in _PACKAGE_NAMES.items():
if number == package_digit * 10:
if is_webview == ('WEBVIEW' in package):
package_name = package
break
for arch, bitness_to_number in _ABIS_TO_DIGIT_MASK.items():
for bitness, number in bitness_to_number.items():
if abi_digit == number:
abi = arch if arch != 'intel' else 'x86'
if bitness != '32':
abi += '_' + bitness
break
return VersionCodeComponents(build_number, patch_number, package_name, abi,
is_next_build)
def GenerateVersionCodes(version_values, arch, is_next_build):
base_version_code = int(
'%s%03d00' % (version_values['BUILD'], int(version_values['PATCH'])))
if is_next_build:
base_version_code += _NEXT_BUILD_VERSION_CODE_DIFF
mfg, bitness = _ARCH_TO_MFG_AND_BITNESS[arch]
version_codes = {}
for apk, package, abis in _APKS[bitness]:
if abis == '64_32_high' and arch != 'arm64':
continue
abi_part = _ABIS_TO_DIGIT_MASK[mfg][abis]
package_part = _PACKAGE_NAMES[package]
version_code_name = apk + '_VERSION_CODE'
version_code_val = base_version_code + package_part + abi_part
version_codes[version_code_name] = str(version_code_val)
return version_codes
def main():
parser = argparse.ArgumentParser(description='Parses version codes.')
parser.add_argument('version_code', help='Version code (e.g. 529700010).')
parser.add_argument('--webview',
action='store_true',
help='Whether this is a webview version code.')
args = parser.parse_args()
print(TranslateVersionCode(args.version_code, is_webview=args.webview))
if __name__ == '__main__':
main()