You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
3.5 KiB
Python
112 lines
3.5 KiB
Python
#!/usr/bin/env python3
|
|
|
|
# Copyright (C) 2021-2022 Intel Corporation
|
|
# Copyright (C) 2022 CVAT.ai Corporation
|
|
#
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
import shutil
|
|
import subprocess
|
|
import tarfile
|
|
import tempfile
|
|
from pathlib import Path
|
|
|
|
import git
|
|
import toml
|
|
from packaging import version
|
|
|
|
# the initial version for the documentation site
|
|
MINIMUM_VERSION = version.Version("1.5.0")
|
|
|
|
|
|
def prepare_tags(repo):
|
|
tags = {}
|
|
for tag in repo.tags:
|
|
tag_version = version.parse(tag.name)
|
|
if tag_version >= MINIMUM_VERSION and not tag_version.is_prerelease:
|
|
release_version = (tag_version.major, tag_version.minor)
|
|
if release_version not in tags or tag_version > version.parse(
|
|
tags[release_version].name
|
|
):
|
|
tags[release_version] = tag
|
|
|
|
return tags.values()
|
|
|
|
|
|
def generate_versioning_config(filename, versions, url_prefix=""):
|
|
def write_version_item(file_object, version, url):
|
|
file_object.write("[[params.versions]]\n")
|
|
file_object.write('version = "{}"\n'.format(version))
|
|
file_object.write('url = "{}"\n\n'.format(url))
|
|
|
|
with open(filename, "w") as f:
|
|
write_version_item(f, "Latest version", "{}/".format(url_prefix))
|
|
for v in versions:
|
|
write_version_item(f, v, "{}/{}".format(url_prefix, v))
|
|
|
|
|
|
def git_checkout(tagname, repo, temp_dir):
|
|
subdirs = ["site/content/en/docs", "site/content/en/images"]
|
|
|
|
for subdir in subdirs:
|
|
shutil.rmtree(temp_dir / subdir)
|
|
|
|
with tempfile.TemporaryFile() as archive:
|
|
# `git checkout` doesn't work for this, as it modifies the index.
|
|
# `git restore` would work, but it's only available since Git 2.23.
|
|
repo.git.archive(tagname, "--", subdir, output_stream=archive)
|
|
archive.seek(0)
|
|
with tarfile.open(fileobj=archive) as tar:
|
|
tar.extractall(temp_dir)
|
|
|
|
|
|
def change_version_menu_toml(filename, version):
|
|
data = toml.load(filename)
|
|
data["params"]["version_menu"] = version
|
|
|
|
with open(filename, "w") as f:
|
|
toml.dump(data, f)
|
|
|
|
|
|
def generate_docs(repo, output_dir, tags):
|
|
repo_root = Path(repo.working_tree_dir)
|
|
|
|
with tempfile.TemporaryDirectory() as temp_dir:
|
|
content_loc = Path(temp_dir, "site")
|
|
shutil.copytree(repo_root / "site", content_loc, symlinks=True)
|
|
|
|
def run_hugo(destination_dir):
|
|
subprocess.run( # nosec
|
|
[
|
|
"hugo",
|
|
"--destination",
|
|
str(destination_dir),
|
|
"--config",
|
|
"config.toml,versioning.toml",
|
|
],
|
|
cwd=content_loc,
|
|
check=True,
|
|
)
|
|
|
|
versioning_toml_path = content_loc / "versioning.toml"
|
|
|
|
# Handle the develop version
|
|
generate_versioning_config(versioning_toml_path, (t.name for t in tags))
|
|
change_version_menu_toml(versioning_toml_path, "develop")
|
|
run_hugo(output_dir)
|
|
|
|
generate_versioning_config(versioning_toml_path, (t.name for t in tags), "/..")
|
|
for tag in tags:
|
|
git_checkout(tag.name, repo, Path(temp_dir))
|
|
change_version_menu_toml(versioning_toml_path, tag.name)
|
|
run_hugo(output_dir / tag.name)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
repo_root = Path(__file__).resolve().parents[1]
|
|
output_dir = repo_root / "public"
|
|
|
|
with git.Repo(repo_root) as repo:
|
|
tags = prepare_tags(repo)
|
|
generate_docs(repo, output_dir, tags)
|