xref: /qemu/python/scripts/vendor.py (revision 2274817f6c499fd31081d7973b7cbfdca17c44a8)
1*2274817fSJohn Snow#!/usr/bin/env python3
2*2274817fSJohn Snow"""
3*2274817fSJohn Snowvendor - QEMU python vendoring utility
4*2274817fSJohn Snow
5*2274817fSJohn Snowusage: vendor [-h]
6*2274817fSJohn Snow
7*2274817fSJohn SnowQEMU python vendoring utility
8*2274817fSJohn Snow
9*2274817fSJohn Snowoptions:
10*2274817fSJohn Snow  -h, --help  show this help message and exit
11*2274817fSJohn Snow"""
12*2274817fSJohn Snow
13*2274817fSJohn Snow# Copyright (C) 2023 Red Hat, Inc.
14*2274817fSJohn Snow#
15*2274817fSJohn Snow# Authors:
16*2274817fSJohn Snow#  John Snow <jsnow@redhat.com>
17*2274817fSJohn Snow#
18*2274817fSJohn Snow# This work is licensed under the terms of the GNU GPL, version 2 or
19*2274817fSJohn Snow# later. See the COPYING file in the top-level directory.
20*2274817fSJohn Snow
21*2274817fSJohn Snowimport argparse
22*2274817fSJohn Snowimport os
23*2274817fSJohn Snowfrom pathlib import Path
24*2274817fSJohn Snowimport subprocess
25*2274817fSJohn Snowimport sys
26*2274817fSJohn Snowimport tempfile
27*2274817fSJohn Snow
28*2274817fSJohn Snow
29*2274817fSJohn Snowdef main() -> int:
30*2274817fSJohn Snow    """Run the vendoring utility. See module-level docstring."""
31*2274817fSJohn Snow    loud = False
32*2274817fSJohn Snow    if os.environ.get("DEBUG") or os.environ.get("V"):
33*2274817fSJohn Snow        loud = True
34*2274817fSJohn Snow
35*2274817fSJohn Snow    # No options or anything for now, but I guess
36*2274817fSJohn Snow    # you'll figure that out when you run --help.
37*2274817fSJohn Snow    parser = argparse.ArgumentParser(
38*2274817fSJohn Snow        prog="vendor",
39*2274817fSJohn Snow        description="QEMU python vendoring utility",
40*2274817fSJohn Snow    )
41*2274817fSJohn Snow    parser.parse_args()
42*2274817fSJohn Snow
43*2274817fSJohn Snow    packages = {
44*2274817fSJohn Snow        "meson==0.61.5":
45*2274817fSJohn Snow        "58c2ddb5f885da0e929f15d89f38d8a7d97f981f56815bcba008414f8511f59a",
46*2274817fSJohn Snow    }
47*2274817fSJohn Snow
48*2274817fSJohn Snow    vendor_dir = Path(__file__, "..", "..", "wheels").resolve()
49*2274817fSJohn Snow
50*2274817fSJohn Snow    with tempfile.NamedTemporaryFile(mode="w", encoding="utf-8") as file:
51*2274817fSJohn Snow        for dep_spec, checksum in packages.items():
52*2274817fSJohn Snow            file.write(f"{dep_spec} --hash=sha256:{checksum}")
53*2274817fSJohn Snow        file.flush()
54*2274817fSJohn Snow
55*2274817fSJohn Snow        cli_args = [
56*2274817fSJohn Snow            "pip",
57*2274817fSJohn Snow            "download",
58*2274817fSJohn Snow            "--dest",
59*2274817fSJohn Snow            str(vendor_dir),
60*2274817fSJohn Snow            "--require-hashes",
61*2274817fSJohn Snow            "-r",
62*2274817fSJohn Snow            file.name,
63*2274817fSJohn Snow        ]
64*2274817fSJohn Snow        if loud:
65*2274817fSJohn Snow            cli_args.append("-v")
66*2274817fSJohn Snow
67*2274817fSJohn Snow        print(" ".join(cli_args))
68*2274817fSJohn Snow        subprocess.run(cli_args, check=True)
69*2274817fSJohn Snow
70*2274817fSJohn Snow    return 0
71*2274817fSJohn Snow
72*2274817fSJohn Snow
73*2274817fSJohn Snowif __name__ == "__main__":
74*2274817fSJohn Snow    sys.exit(main())
75