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