gstreamer-rs/generator.py

210 lines
5.7 KiB
Python
Raw Normal View History

#!/usr/bin/env python3
2019-06-18 10:10:24 +00:00
2020-11-24 11:16:54 +00:00
from pathlib import Path
import argparse
2020-10-29 09:26:05 +00:00
import subprocess
2019-06-18 10:10:24 +00:00
import sys
2020-10-29 09:26:05 +00:00
NOTHING_TO_BE_DONE = 0
NEED_UPDATE = 1
FAILURE = 2
DEFAULT_GIR_FILES_DIRECTORY = Path("./gir-files")
DEFAULT_GST_GIR_FILES_DIRECTORY = Path("./gst-gir-files")
DEFAULT_GIR_DIRECTORY = Path("./gir/")
DEFAULT_GIR_PATH = DEFAULT_GIR_DIRECTORY / "target/release/gir"
2020-11-24 11:16:54 +00:00
2020-10-29 09:26:05 +00:00
def run_command(command, folder=None):
if folder is None:
folder = "."
2020-11-24 11:16:54 +00:00
ret = subprocess.run(command, cwd=folder)
if ret.returncode != 0:
print("Command `{}` failed with `{}`...".format(command, ret))
2020-10-29 09:26:05 +00:00
return False
return True
2019-06-18 10:10:24 +00:00
def update_workspace():
return run_command(["cargo", "build", "--release"], "gir")
2019-06-18 10:10:24 +00:00
2020-11-19 17:51:59 +00:00
def ask_yes_no_question(question, conf):
question = "{} [y/N] ".format(question)
2020-11-24 11:16:54 +00:00
if conf.yes:
print(question + "y")
2020-11-19 17:51:59 +00:00
return True
2020-11-24 14:21:51 +00:00
line = input(question)
return line.strip().lower() == "y"
2020-11-19 17:51:59 +00:00
def def_check_submodule(submodule_path, conf):
2020-11-24 11:16:54 +00:00
if any(submodule_path.iterdir()):
2020-10-29 09:26:05 +00:00
return NOTHING_TO_BE_DONE
print("=> Initializing {} submodule...".format(submodule_path))
if not run_command(["git", "submodule", "update", "--init", submodule_path]):
2020-10-29 09:26:05 +00:00
return FAILURE
print("<= Done!")
2019-06-18 10:10:24 +00:00
if ask_yes_no_question(
"Do you want to update {} submodule?".format(submodule_path), conf
):
print("=> Updating submodule...")
if not run_command(["git", "reset", "--hard", "HEAD"], submodule_path):
2020-10-29 09:26:05 +00:00
return FAILURE
if not run_command(["git", "pull", "-f", "origin", "master"], submodule_path):
2020-10-29 09:26:05 +00:00
return FAILURE
print("<= Done!")
2020-10-29 09:26:05 +00:00
return NEED_UPDATE
return NOTHING_TO_BE_DONE
def build_gir_if_needed(updated_submodule):
if updated_submodule == FAILURE:
return False
print("=> Building gir...")
2020-11-24 11:16:54 +00:00
if update_workspace():
print("<= Done!")
else:
print("<= Failed...")
return False
2020-10-29 09:26:05 +00:00
return True
2020-11-19 17:51:59 +00:00
2020-11-24 11:16:54 +00:00
def regen_crates(path, conf):
if path.is_dir():
for entry in path.rglob("Gir*.toml"):
if not regen_crates(entry, conf):
return False
elif path.match("Gir*.toml"):
print('==> Regenerating "{}"...'.format(path))
args = [
conf.gir_path,
"-c",
path,
"-o",
path.parent,
] + [d for path in conf.gir_files_paths for d in ("-d", path)]
error = False
2020-11-24 11:16:54 +00:00
if path.parent.name.endswith("sys"):
args.extend(["-m", "sys"])
else:
# Update docs/**/docs.md for non-sys crates
# doc-target-path is relative to `-c`
path_depth = len(path.parent.parts)
doc_path = (
Path(*[".."] * path_depth, "docs")
.joinpath(path.parent)
.joinpath("docs.md")
)
print("==> Docs into {}".format(doc_path))
doc_args = args + [
"-m",
"doc",
"--doc-target-path",
doc_path,
]
error |= not run_command(doc_args)
2020-11-24 11:16:54 +00:00
try:
error |= not run_command(args)
2020-11-24 11:16:54 +00:00
except Exception as err:
print("The following error occurred: {}".format(err))
2020-11-24 11:16:54 +00:00
error = True
if error:
if not ask_yes_no_question("Do you want to continue?", conf):
return False
print("<== Done!")
2020-11-24 11:16:54 +00:00
else:
print("==> {} is not a valid Gir*.toml file".format(path))
2020-11-24 11:16:54 +00:00
return False
return True
2020-10-29 09:26:05 +00:00
2020-11-19 17:51:59 +00:00
2020-11-24 11:16:54 +00:00
def valid_path(path):
path = Path(path)
if not path.exists():
raise argparse.ArgumentTypeError("`{}` no such file or directory".format(path))
return path
2020-11-19 17:51:59 +00:00
2020-11-24 11:16:54 +00:00
def directory_path(path):
path = Path(path)
if not path.is_dir():
raise argparse.ArgumentTypeError("`{}` directory not found".format(path))
return path
def file_path(path):
path = Path(path)
if not path.is_file():
raise argparse.ArgumentTypeError("`{}` file not found".format(path))
return path
2020-11-19 17:51:59 +00:00
2020-10-29 09:26:05 +00:00
2020-11-24 11:16:54 +00:00
def parse_args():
parser = argparse.ArgumentParser(
description="Helper to regenerate gtk-rs crates using gir.",
formatter_class=argparse.ArgumentDefaultsHelpFormatter,
)
parser.add_argument(
"path",
nargs="*",
default=[Path(".")],
type=valid_path,
help="Paths in which to look for Gir.toml files",
)
parser.add_argument(
"--gir-files-directories",
nargs="*",
dest="gir_files_paths",
default=[DEFAULT_GIR_FILES_DIRECTORY, DEFAULT_GST_GIR_FILES_DIRECTORY],
type=directory_path,
help="Path of the gir-files folder",
)
parser.add_argument(
"--gir-path",
default=DEFAULT_GIR_PATH,
type=file_path,
help="Path of the gir executable to run",
)
parser.add_argument(
"--yes",
action="store_true",
help=" Always answer `yes` to any question asked by the script",
)
parser.add_argument(
"--no-fmt",
action="store_true",
help="If set, this script will not run `cargo fmt`",
)
2020-11-24 11:16:54 +00:00
return parser.parse_args()
def main():
conf = parse_args()
if conf.gir_path == DEFAULT_GIR_PATH:
if not build_gir_if_needed(def_check_submodule(DEFAULT_GIR_DIRECTORY, conf)):
2020-11-19 17:51:59 +00:00
return 1
print("=> Regenerating crates...")
2020-11-24 11:16:54 +00:00
for path in conf.path:
print("=> Looking in path `{}`".format(path))
2020-11-24 11:16:54 +00:00
if not regen_crates(path, conf):
return 1
if not conf.no_fmt and not run_command(["cargo", "fmt"]):
2020-10-29 09:26:05 +00:00
return 1
print("<= Done!")
2020-10-29 09:26:05 +00:00
print("Don't forget to check if everything has been correctly generated!")
return 0
2019-06-18 10:10:24 +00:00
2020-10-29 09:26:05 +00:00
if __name__ == "__main__":
sys.exit(main())