You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
205 lines
4.7 KiB
205 lines
4.7 KiB
#!/usr/bin/env python
|
|
"""
|
|
Generates a helix ebuild, run from a git clone with a tag checked out
|
|
"""
|
|
import re
|
|
import os
|
|
import string
|
|
import pathlib
|
|
import datetime
|
|
import tempfile
|
|
import subprocess
|
|
|
|
import tomli
|
|
|
|
EBUILD_TEMPLATE = """
|
|
# Copyright ${copyright} Gentoo Authors
|
|
# Distributed under the terms of the GNU General Public License v2
|
|
|
|
# Auto-Generated by helix_ebuild.py (see FILESDIR)
|
|
|
|
EAPI=8
|
|
|
|
CRATES="
|
|
${CRATES}
|
|
"
|
|
|
|
LANGUAGES=(
|
|
${LANGUAGES}
|
|
)
|
|
|
|
inherit bash-completion-r1 cargo
|
|
|
|
DESCRIPTION="A post-modern text editor."
|
|
HOMEPAGE="
|
|
https://helix-editor.com/
|
|
https://github.com/helix-editor/helix
|
|
"
|
|
SRC_URI="
|
|
https://github.com/helix-editor/helix/archive/refs/tags/$${PV}.tar.gz -> $${P}.tar.gz
|
|
$$(cargo_crate_uris)
|
|
"
|
|
|
|
LICENSE="${LICENSE}"
|
|
SLOT="0"
|
|
KEYWORDS="~amd64"
|
|
IUSE="doc +grammar"
|
|
|
|
QA_FLAGS_IGNORED="
|
|
usr/bin/hx
|
|
usr/share/helix/runtime/grammars/.*\\.so
|
|
"
|
|
|
|
DOCS=(
|
|
README.md
|
|
CHANGELOG.md
|
|
book/
|
|
docs/
|
|
)
|
|
|
|
language_uris() {
|
|
local line
|
|
|
|
for line in "$${LANGUAGES[@]}"; do
|
|
read -r name url commit <<< "$${line}"
|
|
|
|
printf '%s/archive/%s.tar.gz -> %s-%s.tar.gz\\n' "$${url}" "$${commit}" "$${url##*/}" "$${commit}"
|
|
done
|
|
}
|
|
|
|
SRC_URI+="grammar? ( $$(language_uris) )"
|
|
|
|
src_prepare() {
|
|
local line
|
|
|
|
if use grammar; then
|
|
for line in "$${LANGUAGES[@]}"; do
|
|
read -r name url commit <<< "$${line}"
|
|
|
|
mkdir -p "$${S}"/runtime/grammars/sources/$${name} || die
|
|
cp --reflink=auto --recursive \\
|
|
"$${WORKDIR}"/$${url##*/}-$${commit}/* \\
|
|
"$${S}"/runtime/grammars/sources/$${name} || die
|
|
done
|
|
fi
|
|
|
|
eapply_user
|
|
}
|
|
|
|
src_compile() {
|
|
local -x HELIX_DISABLE_AUTO_GRAMMAR_BUILD=1
|
|
local -x HELIX_RUNTIME="$${S}/runtime"
|
|
|
|
cargo_src_compile
|
|
|
|
if use grammar; then
|
|
target/release/hx --grammar build || die
|
|
fi
|
|
}
|
|
|
|
src_install() {
|
|
if use grammar; then
|
|
rm -rf "$${S}"/runtime/grammars/sources || die
|
|
fi
|
|
|
|
insinto /usr/share/helix
|
|
doins -r runtime
|
|
|
|
use doc && dodoc -r "$${DOCS[@]}"
|
|
|
|
cargo_src_install --path helix-term
|
|
|
|
newbashcomp contrib/completion/hx.bash hx
|
|
|
|
insinto /usr/share/zsh/site-functions
|
|
newins contrib/completion/hx.zsh _hx
|
|
|
|
insinto /usr/share/fish/vendor_completions.d
|
|
doins contrib/completion/hx.fish
|
|
}
|
|
"""
|
|
LANGUAGES_FILE = pathlib.Path("languages.toml")
|
|
LICENSE_RE = r"[\s]*LICENSE=['\"](?P<licenses>[^\"']*)[\"'].*"
|
|
|
|
|
|
def main():
|
|
workdir = pathlib.Path().resolve()
|
|
os.chdir("helix-term")
|
|
cargo_ebuild_proc = subprocess.run(
|
|
("cargo", "ebuild", "--noaudit"), check=True, capture_output=True, text=True
|
|
)
|
|
os.chdir(workdir)
|
|
|
|
tag_process = subprocess.run(
|
|
("git", "describe", "--tags"), check=True, capture_output=True, text=True
|
|
)
|
|
if not (
|
|
cargo_ebuild := pathlib.Path(
|
|
"helix-term",
|
|
cargo_ebuild_proc.stdout.split("\n")[-2].partition(":")[2].strip(),
|
|
)
|
|
).exists():
|
|
raise RuntimeError(f"Can't find ebuild {cargo_ebuild}")
|
|
|
|
new_ebuild = pathlib.Path(f"helix-{tag_process.stdout.strip()}.ebuild")
|
|
|
|
with LANGUAGES_FILE.open("rb") as languages_file:
|
|
language_list = tomli.load(languages_file)
|
|
|
|
license_re = re.compile(LICENSE_RE)
|
|
with (
|
|
tempfile.TemporaryFile("wt+") as tmpfile,
|
|
cargo_ebuild.open("rt+", encoding="utf-8") as cargo_ebuild_file,
|
|
):
|
|
cargo_ebuild.unlink()
|
|
|
|
crates = ""
|
|
licenses = None
|
|
in_crates = False
|
|
for line in cargo_ebuild_file.readlines():
|
|
if (license_match := license_re.match(line)) is not None:
|
|
licenses = license_match.group("licenses")
|
|
licenses = " ".join((lc for lc in licenses.split(" ") if lc != "MPL-2.0+"))
|
|
|
|
elif line.startswith("CRATES="):
|
|
in_crates = True
|
|
continue
|
|
|
|
elif in_crates:
|
|
if line.strip() == "":
|
|
continue
|
|
|
|
elif line.strip() == '"':
|
|
in_crates = False
|
|
continue
|
|
|
|
crates += line
|
|
|
|
languages = ""
|
|
for language in language_list.get("grammar", []):
|
|
if source := language.get("source"):
|
|
languages += f'\n\t"{language["name"]} {source["git"]} {source["rev"]}"'
|
|
|
|
tmpfile.seek(0)
|
|
|
|
year = datetime.datetime.now().year
|
|
copyright_date = f"2023-{year}" if year > 2022 else "2023"
|
|
|
|
template = string.Template(EBUILD_TEMPLATE.lstrip("\n"))
|
|
with new_ebuild.open("wt", encoding="utf-8") as output_file:
|
|
output_file.write(
|
|
template.substitute(
|
|
CRATES=crates.strip("\n"),
|
|
LANGUAGES=languages.strip("\n"),
|
|
LICENSE=licenses,
|
|
copyright=copyright_date,
|
|
),
|
|
)
|
|
|
|
print("\n".join(cargo_ebuild_proc.stdout.split("\n")[:-2]))
|
|
print(f"Wrote: {new_ebuild}")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|