mirror of
https://github.com/NixOS/nixpkgs.git
synced 2025-06-12 12:45:27 +03:00

The nixpkgs documentation mentions how to update out of tree plugins but one problem is that it requires a nixpkgs clone. This makes it more convenient. I've had the need to generate vim plugins and lua overlays for other projects unrelated to nix and this will make updates easier (aka just run `nix run nixpkgs#vimPluginsUpdater -- --proc=1` or with the legacy commands: `nix-shell -p vimPluginsUpdater --run vim-plugins-updater`. I added an optional "nixpkgs" argument to command line parser, which is the path towards a nixpkgs checkout. By default the current folder. update-luarocks-packages: format with black
160 lines
4.9 KiB
Python
Executable file
160 lines
4.9 KiB
Python
Executable file
#!/usr/bin/env python
|
|
|
|
# run with:
|
|
# $ nix run .\#vimPluginsUpdater
|
|
# format:
|
|
# $ nix run nixpkgs#python3Packages.black -- update.py
|
|
# type-check:
|
|
# $ nix run nixpkgs#python3Packages.mypy -- update.py
|
|
# linted:
|
|
# $ nix run nixpkgs#python3Packages.flake8 -- --ignore E501,E265,E402 update.py
|
|
|
|
# If you see `HTTP Error 429: too many requests` errors while running this
|
|
# script, refer to:
|
|
#
|
|
# https://github.com/NixOS/nixpkgs/blob/master/doc/languages-frameworks/vim.section.md#updating-plugins-in-nixpkgs-updating-plugins-in-nixpkgs
|
|
#
|
|
# (or the equivalent file /doc/languages-frameworks/vim.section.md
|
|
# from Nixpkgs master tree).
|
|
#
|
|
|
|
import inspect
|
|
import os
|
|
import logging
|
|
import textwrap
|
|
import json
|
|
from typing import List, Tuple
|
|
from pathlib import Path
|
|
|
|
|
|
log = logging.getLogger()
|
|
|
|
sh = logging.StreamHandler()
|
|
formatter = logging.Formatter("%(name)s:%(levelname)s: %(message)s")
|
|
sh.setFormatter(formatter)
|
|
log.addHandler(sh)
|
|
|
|
# Import plugin update library from maintainers/scripts/pluginupdate.py
|
|
ROOT = Path(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))))
|
|
import pluginupdate
|
|
import importlib
|
|
from pluginupdate import run_nix_expr, PluginDesc
|
|
from treesitter import update_grammars
|
|
|
|
|
|
HEADER = (
|
|
"# GENERATED by ./pkgs/applications/editors/vim/plugins/update.py. Do not edit!"
|
|
)
|
|
|
|
NVIM_TREESITTER_GENERATED_NIX = \
|
|
"pkgs/applications/editors/vim/plugins/nvim-treesitter/generated.nix"
|
|
|
|
|
|
class VimEditor(pluginupdate.Editor):
|
|
nvim_treesitter_updated = False
|
|
|
|
def generate_nix(
|
|
self, plugins: List[Tuple[PluginDesc, pluginupdate.Plugin]], outfile: str
|
|
):
|
|
sorted_plugins = sorted(plugins, key=lambda v: v[0].name.lower())
|
|
nvim_treesitter_rev = pluginupdate.run_nix_expr(
|
|
"(import <localpkgs> { }).vimPlugins.nvim-treesitter.src.rev",
|
|
self.nixpkgs
|
|
)
|
|
|
|
with open(outfile, "w+") as f:
|
|
f.write(HEADER)
|
|
f.write(
|
|
textwrap.dedent(
|
|
"""
|
|
{ lib, buildVimPlugin, buildNeovimPlugin, fetchFromGitHub, fetchgit }:
|
|
|
|
final: prev:
|
|
{
|
|
"""
|
|
)
|
|
)
|
|
for pdesc, plugin in sorted_plugins:
|
|
content = self.plugin2nix(pdesc, plugin)
|
|
f.write(content)
|
|
if (
|
|
plugin.name == "nvim-treesitter" and plugin.commit != nvim_treesitter_rev
|
|
):
|
|
self.nvim_treesitter_updated = True
|
|
f.write("\n}\n")
|
|
print(f"updated {outfile}")
|
|
|
|
def plugin2nix(self, pdesc: PluginDesc, plugin: pluginupdate.Plugin) -> str:
|
|
GET_PLUGINS_LUA = """
|
|
with import <localpkgs> {};
|
|
lib.attrNames lua51Packages"""
|
|
luaPlugins = run_nix_expr(GET_PLUGINS_LUA, self.nixpkgs)
|
|
|
|
repo = pdesc.repo
|
|
|
|
def _isNeovimPlugin(plug: pluginupdate.Plugin) -> bool:
|
|
"""
|
|
Whether it's a neovim-only plugin
|
|
We can check if it's available in lua packages
|
|
"""
|
|
# global luaPlugins
|
|
if plug.normalized_name in luaPlugins:
|
|
log.debug("%s is a neovim plugin", plug)
|
|
return True
|
|
return False
|
|
|
|
isNeovim = _isNeovimPlugin(plugin)
|
|
|
|
content = f" {plugin.normalized_name} = "
|
|
src_nix = repo.as_nix(plugin)
|
|
content += """{buildFn} {{
|
|
pname = "{plugin.name}";
|
|
version = "{plugin.version}";
|
|
src = {src_nix};
|
|
meta.homepage = "{repo.uri}";
|
|
}};
|
|
|
|
""".format(
|
|
buildFn="buildNeovimPlugin" if isNeovim else "buildVimPlugin",
|
|
plugin=plugin,
|
|
src_nix=src_nix,
|
|
repo=repo,
|
|
)
|
|
log.debug(content)
|
|
return content
|
|
|
|
def update(self, args):
|
|
pluginupdate.update_plugins(self, args)
|
|
|
|
if self.nvim_treesitter_updated:
|
|
print("updating nvim-treesitter grammars")
|
|
nvim_treesitter_dir = ROOT.joinpath("nvim-treesitter")
|
|
lockfile = json.load(open(args.nixpkgs.join(NVIM_TREESITTER_GENERATED_FILE, "lockfile.json")))
|
|
|
|
nvim_treesitter.update_grammars(lockfile)
|
|
|
|
if self.nixpkgs_repo:
|
|
index = self.nixpkgs_repo.index
|
|
for diff in index.diff(None):
|
|
if diff.a_path == NVIM_TREESITTER_GENERATED_NIX:
|
|
msg = "vimPlugins.nvim-treesitter: update grammars"
|
|
print(f"committing to nixpkgs: {msg}")
|
|
index.add([str(nvim_treesitter_dir.joinpath("generated.nix"))])
|
|
index.commit(msg)
|
|
return
|
|
print("no updates to nvim-treesitter grammars")
|
|
|
|
|
|
def main():
|
|
|
|
global luaPlugins
|
|
|
|
log.debug(f"Loading from {ROOT}/../get-plugins.nix")
|
|
with open(f"{ROOT}/../get-plugins.nix") as f:
|
|
GET_PLUGINS = f.read()
|
|
editor = VimEditor("vim", Path("pkgs/applications/editors/vim/plugins"), GET_PLUGINS)
|
|
editor.run()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|