1*3f982cf4SFabien Sanglard#!/usr/bin/env python3 2*3f982cf4SFabien Sanglard# Copyright 2020 The Chromium Authors. All rights reserved. 3*3f982cf4SFabien Sanglard# Use of this source code is governed by a BSD-style license that can be 4*3f982cf4SFabien Sanglard# found in the LICENSE file. 5*3f982cf4SFabien Sanglard""" 6*3f982cf4SFabien SanglardThis script is used to download YAJSV (yet another json schema validator). It 7*3f982cf4SFabien Sanglardruns as a gclient hook. 8*3f982cf4SFabien Sanglard""" 9*3f982cf4SFabien Sanglard 10*3f982cf4SFabien Sanglardimport argparse 11*3f982cf4SFabien Sanglardimport curlish 12*3f982cf4SFabien Sanglardimport os 13*3f982cf4SFabien Sanglardimport stat 14*3f982cf4SFabien Sanglardimport sys 15*3f982cf4SFabien Sanglard 16*3f982cf4SFabien SanglardRELEASES_DOWNLOAD_URL = 'https://github.com/neilpa/yajsv/releases/download/' 17*3f982cf4SFabien SanglardVERSION = 'v1.4.0' 18*3f982cf4SFabien SanglardYAJSV_FLAVOR_DICT = { 19*3f982cf4SFabien Sanglard 'linux32': 'yajsv.linux.386', 20*3f982cf4SFabien Sanglard 'linux64': 'yajsv.linux.amd64', 21*3f982cf4SFabien Sanglard 'mac64': 'yajsv.darwin.amd64' 22*3f982cf4SFabien Sanglard} 23*3f982cf4SFabien Sanglard 24*3f982cf4SFabien SanglardPLATFORM_MAP = {'linux2': 'linux', 'darwin': 'mac'} 25*3f982cf4SFabien Sanglard 26*3f982cf4SFabien Sanglard 27*3f982cf4SFabien Sanglarddef get_bitness(): 28*3f982cf4SFabien Sanglard # According to the python docs, this is more reliable than 29*3f982cf4SFabien Sanglard # querying platform.architecture(). 30*3f982cf4SFabien Sanglard if sys.maxsize > 2**32: 31*3f982cf4SFabien Sanglard return '64' 32*3f982cf4SFabien Sanglard return '32' 33*3f982cf4SFabien Sanglard 34*3f982cf4SFabien Sanglard 35*3f982cf4SFabien Sanglarddef get_platform(): 36*3f982cf4SFabien Sanglard return PLATFORM_MAP.get(sys.platform, sys.platform) 37*3f982cf4SFabien Sanglard 38*3f982cf4SFabien Sanglard 39*3f982cf4SFabien Sanglarddef get_flavor(): 40*3f982cf4SFabien Sanglard return "{}{}".format(get_platform(), get_bitness()) 41*3f982cf4SFabien Sanglard 42*3f982cf4SFabien Sanglard 43*3f982cf4SFabien Sanglarddef main(): 44*3f982cf4SFabien Sanglard parser = argparse.ArgumentParser(description='Download a YAJSV release.') 45*3f982cf4SFabien Sanglard parser.add_argument('--flavor', 46*3f982cf4SFabien Sanglard help='Flavor to download (currently one of {})'.format( 47*3f982cf4SFabien Sanglard ', '.join(YAJSV_FLAVOR_DICT.keys()))) 48*3f982cf4SFabien Sanglard args = parser.parse_args() 49*3f982cf4SFabien Sanglard 50*3f982cf4SFabien Sanglard flavor = args.flavor 51*3f982cf4SFabien Sanglard if not flavor: 52*3f982cf4SFabien Sanglard flavor = get_flavor() 53*3f982cf4SFabien Sanglard if flavor in YAJSV_FLAVOR_DICT: 54*3f982cf4SFabien Sanglard print('flavor not provided, defaulting to ' + flavor) 55*3f982cf4SFabien Sanglard 56*3f982cf4SFabien Sanglard if flavor not in YAJSV_FLAVOR_DICT: 57*3f982cf4SFabien Sanglard print('could not find an appropriate flavor, "{}" is invalid'.format( 58*3f982cf4SFabien Sanglard flavor)) 59*3f982cf4SFabien Sanglard return 1 60*3f982cf4SFabien Sanglard 61*3f982cf4SFabien Sanglard output_path = os.path.abspath( 62*3f982cf4SFabien Sanglard os.path.join(os.path.dirname(os.path.relpath(__file__)), 'yajsv')) 63*3f982cf4SFabien Sanglard download_url = '{}{}/{}'.format(RELEASES_DOWNLOAD_URL, VERSION, 64*3f982cf4SFabien Sanglard YAJSV_FLAVOR_DICT[flavor]) 65*3f982cf4SFabien Sanglard result = curlish.curlish(download_url, output_path) 66*3f982cf4SFabien Sanglard 67*3f982cf4SFabien Sanglard # YAJSV isn't useful if it's not executable. 68*3f982cf4SFabien Sanglard if result: 69*3f982cf4SFabien Sanglard current_mode = os.stat(output_path).st_mode 70*3f982cf4SFabien Sanglard os.chmod(output_path, current_mode | stat.S_IEXEC) 71*3f982cf4SFabien Sanglard 72*3f982cf4SFabien Sanglard return 0 if result else 1 73*3f982cf4SFabien Sanglard 74*3f982cf4SFabien Sanglard 75*3f982cf4SFabien Sanglardif __name__ == '__main__': 76*3f982cf4SFabien Sanglard sys.exit(main()) 77