Trying to reuse the update scripts used by kakoune/vim to provide the user with an unified convergence. Some stuff doesn't work yet (parallel download, caching) but I (anyone else welcome to try too) will improve it in other PRs.
180 lines
4.7 KiB
Plaintext
Executable file
180 lines
4.7 KiB
Plaintext
Executable file
#!/usr/bin/env nix-shell
|
|
#!nix-shell -p nix-prefetch-git luarocks-nix python3 python3Packages.GitPython nix -i python3
|
|
|
|
# format:
|
|
# $ nix run nixpkgs.python3Packages.black -c black update.py
|
|
# type-check:
|
|
# $ nix run nixpkgs.python3Packages.mypy -c mypy update.py
|
|
# linted:
|
|
# $ nix run nixpkgs.python3Packages.flake8 -c flake8 --ignore E501,E265,E402 update.py
|
|
|
|
import inspect
|
|
import os
|
|
import tempfile
|
|
import shutil
|
|
from dataclasses import dataclass
|
|
import subprocess
|
|
import csv
|
|
import logging
|
|
|
|
from typing import List
|
|
from pathlib import Path
|
|
|
|
LOG_LEVELS = {
|
|
logging.getLevelName(level): level for level in [
|
|
logging.DEBUG, logging.INFO, logging.WARN, logging.ERROR ]
|
|
}
|
|
|
|
log = logging.getLogger()
|
|
log.addHandler(logging.StreamHandler())
|
|
|
|
ROOT = Path(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))).parent.parent
|
|
from pluginupdate import Editor, parse_args, update_plugins, PluginDesc, CleanEnvironment
|
|
|
|
PKG_LIST="maintainers/scripts/luarocks-packages.csv"
|
|
TMP_FILE="$(mktemp)"
|
|
GENERATED_NIXFILE="pkgs/development/lua-modules/generated-packages.nix"
|
|
LUAROCKS_CONFIG="$NIXPKGS_PATH/maintainers/scripts/luarocks-config.lua"
|
|
|
|
HEADER = """
|
|
/* {GENERATED_NIXFILE} is an auto-generated file -- DO NOT EDIT!
|
|
Regenerate it with:
|
|
nixpkgs$ ./maintainers/scripts/update-luarocks-packages
|
|
|
|
You can customize the generated packages in pkgs/development/lua-modules/overrides.nix
|
|
*/
|
|
""".format(GENERATED_NIXFILE=GENERATED_NIXFILE)
|
|
|
|
FOOTER="""
|
|
}
|
|
/* GENERATED - do not edit this file */
|
|
"""
|
|
|
|
@dataclass
|
|
class LuaPlugin:
|
|
name: str
|
|
version: str
|
|
server: str
|
|
luaversion: str
|
|
maintainers: str
|
|
|
|
@property
|
|
def normalized_name(self) -> str:
|
|
return self.name.replace(".", "-")
|
|
|
|
# rename Editor to LangUpdate/ EcosystemUpdater
|
|
class LuaEditor(Editor):
|
|
def get_current_plugins(self):
|
|
return []
|
|
|
|
def load_plugin_spec(self, input_file) -> List[PluginDesc]:
|
|
luaPackages = []
|
|
csvfilename=input_file
|
|
log.info("Loading package descriptions from %s", csvfilename)
|
|
|
|
|
|
with open(csvfilename, newline='') as csvfile:
|
|
reader = csv.DictReader(csvfile,)
|
|
for row in reader:
|
|
# name,server,version,luaversion,maintainers
|
|
plugin = LuaPlugin(**row)
|
|
luaPackages.append(plugin)
|
|
return luaPackages
|
|
|
|
@property
|
|
def attr_path(self):
|
|
return "luaPackages"
|
|
|
|
def get_update(self, input_file: str, outfile: str, _: int):
|
|
|
|
def update() -> dict:
|
|
plugin_specs = self.load_plugin_spec(input_file)
|
|
|
|
self.generate_nix(plugin_specs, outfile)
|
|
|
|
redirects = []
|
|
return redirects
|
|
|
|
return update
|
|
|
|
def rewrite_input(self, *args, **kwargs):
|
|
# not implemented yet
|
|
pass
|
|
|
|
def generate_nix(
|
|
plugins: List[LuaPlugin],
|
|
outfilename: str
|
|
):
|
|
sorted_plugins = sorted(plugins, key=lambda v: v.name.lower())
|
|
|
|
# plug = {}
|
|
# selon le manifest luarocks.org/manifest
|
|
def _generate_pkg_nix(plug):
|
|
cmd = [ "luarocks", "nix", plug.name]
|
|
if plug.server:
|
|
cmd.append(f"--only-server={plug.server}")
|
|
|
|
if plug.maintainers:
|
|
cmd.append(f"--maintainers={plug.maintainers}")
|
|
|
|
if plug.version:
|
|
cmd.append(plug.version)
|
|
|
|
if plug.luaversion:
|
|
with CleanEnvironment():
|
|
local_pkgs = str(ROOT.resolve())
|
|
cmd2 = ["nix-build", "--no-out-link", local_pkgs, "-A", f"{plug.luaversion}"]
|
|
|
|
log.debug("running %s", cmd2)
|
|
lua_drv_path=subprocess.check_output(cmd2, text=True).strip()
|
|
cmd.append(f"--lua-dir={lua_drv_path}/bin")
|
|
|
|
log.debug("running %s", cmd)
|
|
output = subprocess.check_output(cmd, text=True)
|
|
return output
|
|
|
|
with tempfile.NamedTemporaryFile("w+") as f:
|
|
f.write(HEADER)
|
|
f.write("""
|
|
{ self, stdenv, lib, fetchurl, fetchgit, ... } @ args:
|
|
self: super:
|
|
with self;
|
|
{
|
|
""")
|
|
|
|
for plugin in sorted_plugins:
|
|
|
|
nix_expr = _generate_pkg_nix(plugin)
|
|
f.write(f"{plugin.normalized_name} = {nix_expr}"
|
|
)
|
|
f.write(FOOTER)
|
|
f.flush()
|
|
|
|
# if everything went fine, move the generated file to its destination
|
|
# using copy since move doesn't work across disks
|
|
shutil.copy(f.name, outfilename)
|
|
|
|
print(f"updated {outfilename}")
|
|
|
|
def load_plugin_spec():
|
|
pass
|
|
|
|
|
|
def main():
|
|
|
|
editor = LuaEditor("lua", ROOT, '', generate_nix,
|
|
default_in = ROOT.joinpath(PKG_LIST),
|
|
default_out = ROOT.joinpath(GENERATED_NIXFILE)
|
|
)
|
|
|
|
args = parse_args(editor)
|
|
log.setLevel(LOG_LEVELS[args.debug])
|
|
|
|
update_plugins(editor)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
main()
|
|
|