summaryrefslogtreecommitdiff
path: root/app-editors/helix/files/helix_ebuild.py
diff options
context:
space:
mode:
Diffstat (limited to 'app-editors/helix/files/helix_ebuild.py')
-rw-r--r--app-editors/helix/files/helix_ebuild.py204
1 files changed, 204 insertions, 0 deletions
diff --git a/app-editors/helix/files/helix_ebuild.py b/app-editors/helix/files/helix_ebuild.py
new file mode 100644
index 000000000000..989641e76bcf
--- /dev/null
+++ b/app-editors/helix/files/helix_ebuild.py
@@ -0,0 +1,204 @@
+#!/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()