xref: /aosp_15_r20/external/openscreen/tools/download-yajsv.py (revision 3f982cf4871df8771c9d4abe6e9a6f8d829b2736)
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