at 24.11-pre 172 lines 5.6 kB view raw
1#!/usr/bin/env python 2 3# run with: 4# $ nix run .\#vimPluginsUpdater 5# format: 6# $ nix run nixpkgs#python3Packages.black -- update.py 7# type-check: 8# $ nix run nixpkgs#python3Packages.mypy -- update.py 9# linted: 10# $ nix run nixpkgs#python3Packages.flake8 -- --ignore E501,E265,E402 update.py 11 12# If you see `HTTP Error 429: too many requests` errors while running this 13# script, refer to: 14# 15# https://github.com/NixOS/nixpkgs/blob/master/doc/languages-frameworks/vim.section.md#updating-plugins-in-nixpkgs-updating-plugins-in-nixpkgs 16# 17# (or the equivalent file /doc/languages-frameworks/vim.section.md 18# from Nixpkgs master tree). 19# 20 21import inspect 22import os 23import logging 24import textwrap 25import json 26import subprocess 27from typing import List, Tuple 28from pathlib import Path 29 30 31log = logging.getLogger("vim-updater") 32 33sh = logging.StreamHandler() 34formatter = logging.Formatter("%(name)s:%(levelname)s: %(message)s") 35sh.setFormatter(formatter) 36log.addHandler(sh) 37 38# Import plugin update library from maintainers/scripts/pluginupdate.py 39ROOT = Path(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe())))) 40import pluginupdate 41import importlib 42from pluginupdate import run_nix_expr, PluginDesc 43import treesitter 44 45 46HEADER = ( 47 "# GENERATED by ./pkgs/applications/editors/vim/plugins/update.py. Do not edit!" 48) 49 50NIXPKGS_NVIMTREESITTER_FOLDER = "pkgs/applications/editors/vim/plugins/nvim-treesitter" 51 52 53class VimEditor(pluginupdate.Editor): 54 nvim_treesitter_updated = False 55 56 def generate_nix( 57 self, plugins: List[Tuple[PluginDesc, pluginupdate.Plugin]], outfile: str 58 ): 59 sorted_plugins = sorted(plugins, key=lambda v: v[0].name.lower()) 60 nvim_treesitter_rev = pluginupdate.run_nix_expr( 61 "(import <localpkgs> { }).vimPlugins.nvim-treesitter.src.rev", self.nixpkgs 62 ) 63 64 with open(outfile, "w+") as f: 65 f.write(HEADER) 66 f.write( 67 textwrap.dedent( 68 """ 69 { lib, buildVimPlugin, buildNeovimPlugin, fetchFromGitHub, fetchgit }: 70 71 final: prev: 72 { 73 """ 74 ) 75 ) 76 for pdesc, plugin in sorted_plugins: 77 content = self.plugin2nix(pdesc, plugin) 78 f.write(content) 79 if ( 80 plugin.name == "nvim-treesitter" 81 and plugin.commit != nvim_treesitter_rev 82 ): 83 self.nvim_treesitter_updated = True 84 f.write("\n}\n") 85 print(f"updated {outfile}") 86 87 def plugin2nix(self, pdesc: PluginDesc, plugin: pluginupdate.Plugin) -> str: 88 GET_PLUGINS_LUA = """ 89 with import <localpkgs> {}; 90 lib.attrNames lua51Packages""" 91 luaPlugins = run_nix_expr(GET_PLUGINS_LUA, self.nixpkgs) 92 93 repo = pdesc.repo 94 95 def _isNeovimPlugin(plug: pluginupdate.Plugin) -> bool: 96 """ 97 Whether it's a neovim-only plugin 98 We can check if it's available in lua packages 99 """ 100 # global luaPlugins 101 if plug.normalized_name in luaPlugins: 102 log.debug("%s is a neovim plugin", plug) 103 return True 104 return False 105 106 isNeovim = _isNeovimPlugin(plugin) 107 108 content = f" {plugin.normalized_name} = " 109 src_nix = repo.as_nix(plugin) 110 content += """{buildFn} {{ 111 pname = "{plugin.name}"; 112 version = "{plugin.version}"; 113 src = {src_nix}; 114 meta.homepage = "{repo.uri}"; 115 }}; 116 117""".format( 118 buildFn="buildNeovimPlugin" if isNeovim else "buildVimPlugin", 119 plugin=plugin, 120 src_nix=src_nix, 121 repo=repo, 122 ) 123 log.debug(content) 124 return content 125 126 def update(self, args): 127 pluginupdate.update_plugins(self, args) 128 129 # TODO this should probably be skipped when running outside a nixpkgs checkout 130 if self.nvim_treesitter_updated: 131 print("updating nvim-treesitter grammars") 132 cmd = [ 133 "nix", "build", 134 "vimPlugins.nvim-treesitter.src", "-f", self.nixpkgs 135 , "--print-out-paths" 136 ] 137 log.debug("Running command: %s", " ".join(cmd)) 138 nvim_treesitter_dir = subprocess.check_output(cmd, text=True, timeout=90).strip() 139 140 generated = treesitter.update_grammars(nvim_treesitter_dir) 141 treesitter_generated_nix_path = os.path.join( 142 NIXPKGS_NVIMTREESITTER_FOLDER, 143 "generated.nix" 144 ) 145 open(os.path.join(args.nixpkgs, treesitter_generated_nix_path), "w").write(generated) 146 147 if self.nixpkgs_repo: 148 index = self.nixpkgs_repo.index 149 for diff in index.diff(None): 150 if diff.a_path == treesitter_generated_nix_path: 151 msg = "vimPlugins.nvim-treesitter: update grammars" 152 print(f"committing to nixpkgs: {msg}") 153 index.add([treesitter_generated_nix_path]) 154 index.commit(msg) 155 return 156 print("no updates to nvim-treesitter grammars") 157 158 159def main(): 160 global luaPlugins 161 162 log.debug(f"Loading from {ROOT}/../get-plugins.nix") 163 with open(f"{ROOT}/../get-plugins.nix") as f: 164 GET_PLUGINS = f.read() 165 editor = VimEditor( 166 "vim", Path("pkgs/applications/editors/vim/plugins"), GET_PLUGINS 167 ) 168 editor.run() 169 170 171if __name__ == "__main__": 172 main()