Unverified Commit a31f2a7b authored by Matthieu Coudron's avatar Matthieu Coudron Committed by GitHub
Browse files

pluginupdate.py: fix bugs and add improvements; vimPlugins: sort properly (#353786)

parents 2ef132b3 e9b1d2d5
Loading
Loading
Loading
Loading
+52 −49
Original line number Diff line number Diff line
@@ -4,7 +4,7 @@
# - pkgs/development/lua-modules/updater/updater.py

# format:
# $ nix run nixpkgs#black maintainers/scripts/pluginupdate.py
# $ nix run nixpkgs#ruff maintainers/scripts/pluginupdate.py
# type-check:
# $ nix run nixpkgs#python3.pkgs.mypy maintainers/scripts/pluginupdate.py
# linted:
@@ -142,7 +142,7 @@ class Repo:
        return loaded

    def prefetch(self, ref: Optional[str]) -> str:
        print("Prefetching %s", self.uri)
        log.info("Prefetching %s", self.uri)
        loaded = self._prefetch(ref)
        return loaded["sha256"]

@@ -195,7 +195,7 @@ class RepoGitHub(Repo):
            xml = req.read()

            # Filter out illegal XML characters
            illegal_xml_regex = re.compile(b"[\x00-\x08\x0B-\x0C\x0E-\x1F\x7F]")
            illegal_xml_regex = re.compile(b"[\x00-\x08\x0b-\x0c\x0e-\x1f\x7f]")
            xml = illegal_xml_regex.sub(b"", xml)

            root = ET.fromstring(xml)
@@ -256,13 +256,7 @@ class PluginDesc:

    @property
    def name(self):
        if self.alias is None:
            return self.repo.name
        else:
            return self.alias

    def __lt__(self, other):
        return self.repo.name < other.repo.name
        return self.alias or self.repo.name

    @staticmethod
    def load_from_csv(config: FetchConfig, row: Dict[str, str]) -> "PluginDesc":
@@ -270,7 +264,12 @@ class PluginDesc:
        branch = row["branch"]
        repo = make_repo(row["repo"], branch.strip())
        repo.token = config.github_token
        return PluginDesc(repo, branch.strip(), row["alias"])
        return PluginDesc(
            repo,
            branch.strip(),
            # alias is usually an empty string
            row["alias"] if row["alias"] else None,
        )

    @staticmethod
    def load_from_string(config: FetchConfig, line: str) -> "PluginDesc":
@@ -328,12 +327,11 @@ def load_plugins_from_csv(
    return plugins



def run_nix_expr(expr, nixpkgs: str, **args):
    '''
    """
    :param expr nix expression to fetch current plugins
    :param nixpkgs Path towards a nixpkgs checkout
    '''
    """
    with CleanEnvironment(nixpkgs) as nix_path:
        cmd = [
            "nix",
@@ -382,16 +380,14 @@ class Editor:
        fetch_config = FetchConfig(args.proc, args.github_token)
        editor = self
        for plugin_line in args.add_plugins:
            log.debug("using plugin_line", plugin_line)
            log.debug("using plugin_line %s", plugin_line)
            pdesc = PluginDesc.load_from_string(fetch_config, plugin_line)
            log.debug("loaded as pdesc", pdesc)
            log.debug("loaded as pdesc %s", pdesc)
            append = [pdesc]
            editor.rewrite_input(
                fetch_config, args.input_file, editor.deprecated, append=append
            )
            plugin, _ = prefetch_plugin(
                pdesc,
            )
            plugin, _ = prefetch_plugin(pdesc)
            autocommit = not args.no_commit
            if autocommit:
                commit(
@@ -406,9 +402,9 @@ class Editor:
    # Expects arguments generated by 'update' subparser
    def update(self, args):
        """CSV spec"""
        print("the update member function should be overriden in subclasses")
        print("the update member function should be overridden in subclasses")

    def get_current_plugins(self, nixpkgs) -> List[Plugin]:
    def get_current_plugins(self, nixpkgs: str) -> List[Plugin]:
        """To fill the cache"""
        data = run_nix_expr(self.get_plugins, nixpkgs)
        plugins = []
@@ -440,6 +436,7 @@ class Editor:

            plugins, redirects = check_results(results)

            plugins = sorted(plugins, key=lambda v: v[1].normalized_name)
            self.generate_nix(plugins, outfile)

            return redirects
@@ -559,6 +556,7 @@ class Editor:
        parser = self.create_parser()
        args = parser.parse_args()
        command = args.command or "update"
        logging.basicConfig()
        log.setLevel(LOG_LEVELS[args.debug])
        log.info("Chose to run command: %s", command)
        self.nixpkgs = args.nixpkgs
@@ -591,25 +589,24 @@ def prefetch_plugin(
    p: PluginDesc,
    cache: "Optional[Cache]" = None,
) -> Tuple[Plugin, Optional[Repo]]:
    repo, branch, alias = p.repo, p.branch, p.alias
    name = alias or p.repo.name
    commit = None
    log.info(f"Fetching last commit for plugin {name} from {repo.uri}@{branch}")
    commit, date = repo.latest_commit()
    log.info(f"Fetching last commit for plugin {p.name} from {p.repo.uri}@{p.branch}")
    commit, date = p.repo.latest_commit()

    cached_plugin = cache[commit] if cache else None
    if cached_plugin is not None:
        log.debug("Cache hit !")
        cached_plugin.name = name
        log.debug(f"Cache hit for {p.name}!")
        cached_plugin.name = p.name
        cached_plugin.date = date
        return cached_plugin, repo.redirect
        return cached_plugin, p.repo.redirect

    has_submodules = repo.has_submodules()
    log.debug(f"prefetch {name}")
    sha256 = repo.prefetch(commit)
    has_submodules = p.repo.has_submodules()
    log.debug(f"prefetch {p.name}")
    sha256 = p.repo.prefetch(commit)

    return (
        Plugin(name, commit, has_submodules, sha256, date=date),
        repo.redirect,
        Plugin(p.name, commit, has_submodules, sha256, date=date),
        p.repo.redirect,
    )


@@ -624,7 +621,7 @@ def print_download_error(plugin: PluginDesc, ex: Exception):


def check_results(
    results: List[Tuple[PluginDesc, Union[Exception, Plugin], Optional[Repo]]]
    results: List[Tuple[PluginDesc, Union[Exception, Plugin], Optional[Repo]]],
) -> Tuple[List[Tuple[PluginDesc, Plugin]], Redirects]:
    """ """
    failures: List[Tuple[PluginDesc, Exception]] = []
@@ -642,10 +639,9 @@ def check_results(

    print(f"{len(results) - len(failures)} plugins were checked", end="")
    if len(failures) == 0:
        print()
        return plugins, redirects
    else:
        print(f", {len(failures)} plugin(s) could not be downloaded:\n")
        log.error(f", {len(failures)} plugin(s) could not be downloaded:\n")

        for plugin, exception in failures:
            print_download_error(plugin, exception)
@@ -738,10 +734,7 @@ def rewrite_input(
    append: List[PluginDesc] = [],
):
    log.info("Rewriting input file %s", input_file)
    plugins = load_plugins_from_csv(
        config,
        input_file,
    )
    plugins = load_plugins_from_csv(config, input_file)

    plugins.extend(append)

@@ -753,15 +746,25 @@ def rewrite_input(
            deprecations = json.load(f)
        # TODO parallelize this step
        for pdesc, new_repo in redirects.items():
            log.info("Rewriting input file %s", input_file)
            log.info("Resolving deprecated plugin %s -> %s", pdesc.name, new_repo.name)
            new_pdesc = PluginDesc(new_repo, pdesc.branch, pdesc.alias)

            old_plugin, _ = prefetch_plugin(pdesc)
            new_plugin, _ = prefetch_plugin(new_pdesc)

            if old_plugin.normalized_name != new_plugin.normalized_name:
                deprecations[old_plugin.normalized_name] = {
                    "new": new_plugin.normalized_name,
                    "date": cur_date_iso,
                }

            # remove plugin from index file, so we won't add it to deprecations again
            for i, plugin in enumerate(plugins):
                if plugin.name == pdesc.name:
                    plugins.pop(i)
                    break
            plugins.append(new_pdesc)

        with open(deprecated, "w") as f:
            json.dump(deprecations, f, indent=4, sort_keys=True)
            f.write("\n")
@@ -772,7 +775,7 @@ def rewrite_input(
        fieldnames = ["repo", "branch", "alias"]
        writer = csv.DictWriter(f, fieldnames, dialect="unix", quoting=csv.QUOTE_NONE)
        writer.writeheader()
        for plugin in sorted(plugins):
        for plugin in sorted(plugins, key=lambda x: x.name):
            writer.writerow(asdict(plugin))


@@ -792,9 +795,11 @@ def update_plugins(editor: Editor, args):

    log.info("Start updating plugins")
    if args.proc > 1 and args.github_token == None:
        log.warning("You have enabled parallel updates but haven't set a github token.\n"
        log.warning(
            "You have enabled parallel updates but haven't set a github token.\n"
            "You may be hit with `HTTP Error 429: too many requests` as a consequence."
        "Either set --proc=1 or --github-token=YOUR_TOKEN. ")
            "Either set --proc=1 or --github-token=YOUR_TOKEN. "
        )

    fetch_config = FetchConfig(args.proc, args.github_token)
    update = editor.get_update(args.input_file, args.outfile, fetch_config)
@@ -810,11 +815,9 @@ def update_plugins(editor: Editor, args):
    if autocommit:
        try:
            repo = git.Repo(os.getcwd())
            updated = datetime.now(tz=UTC).strftime('%Y-%m-%d')
            updated = datetime.now(tz=UTC).strftime("%Y-%m-%d")
            print(args.outfile)
            commit(repo,
                   f"{editor.attr_path}: update on {updated}", [args.outfile]
                   )
            commit(repo, f"{editor.attr_path}: update on {updated}", [args.outfile])
        except git.InvalidGitRepositoryError as e:
            print(f"Not in a git repository: {e}", file=sys.stderr)
            sys.exit(1)
+36 −22
Original line number Diff line number Diff line
@@ -2,17 +2,17 @@
#!nix-shell update-shell.nix -i python3

# format:
# $ nix run nixpkgs.python3Packages.black -c black update.py
# $ nix run nixpkgs#python3Packages.ruff -- update.py
# type-check:
# $ nix run nixpkgs.python3Packages.mypy -c mypy update.py
# $ nix run nixpkgs#python3Packages.mypy -- update.py
# linted:
# $ nix run nixpkgs.python3Packages.flake8 -c flake8 --ignore E501,E265,E402 update.py
# $ nix run nixpkgs#python3Packages.flake8 -- --ignore E501,E265,E402 update.py

import inspect
import os
import sys
from typing import List, Tuple
from pathlib import Path
from typing import List, Tuple

# Import plugin update library from maintainers/scripts/pluginupdate.py
ROOT = Path(os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))))  # type: ignore
@@ -21,30 +21,44 @@ sys.path.insert(
)
import pluginupdate

GET_PLUGINS = f"""(with import <localpkgs> {{}};
GET_PLUGINS = f"""(
with import <localpkgs> {{ }};
let
  inherit (kakouneUtils.override {{ }}) buildKakounePluginFrom2Nix;
  generated = callPackage {ROOT}/generated.nix {{
    inherit buildKakounePluginFrom2Nix;
  }};
  hasChecksum = value: lib.isAttrs value && lib.hasAttrByPath ["src" "outputHash"] value;
  getChecksum = name: value:
    if hasChecksum value then {{
  hasChecksum =
    value:
    lib.isAttrs value
    && lib.hasAttrByPath [
      "src"
      "outputHash"
    ] value;
  getChecksum =
    name: value:
    if hasChecksum value then
      {{
        submodules = value.src.fetchSubmodules or false;
        sha256 = value.src.outputHash;
        rev = value.src.rev;
    }} else null;
      }}
    else
      null;
  checksums = lib.mapAttrs getChecksum generated;
in lib.filterAttrs (n: v: v != null) checksums)"""

HEADER = "# This file has been generated by ./pkgs/applications/editors/kakoune/plugins/update.py. Do not edit!"

class KakouneEditor(pluginupdate.Editor):
in
lib.filterAttrs (n: v: v != null) checksums
)"""

HEADER = "# This file has been @generated by ./pkgs/applications/editors/kakoune/plugins/update.py. Do not edit!"

    def generate_nix(self, plugins: List[Tuple[pluginupdate.PluginDesc, pluginupdate.Plugin]], outfile: str):
        sorted_plugins = sorted(plugins, key=lambda v: v[1].name.lower())

class KakouneEditor(pluginupdate.Editor):
    def generate_nix(
        self,
        plugins: List[Tuple[pluginupdate.PluginDesc, pluginupdate.Plugin]],
        outfile: str,
    ):
        with open(outfile, "w+") as f:
            f.write(HEADER)
            f.write(
@@ -54,7 +68,7 @@ let
packages = ( self:
{"""
            )
            for pluginDesc, plugin in sorted_plugins:
            for pluginDesc, plugin in plugins:
                f.write(
                    f"""
  {plugin.normalized_name} = buildKakounePluginFrom2Nix {{
+401 −399

File changed.

Preview size limit exceeded, changes collapsed.

+27 −29
Original line number Diff line number Diff line
@@ -3,7 +3,7 @@
# run with:
# $ nix run .\#vimPluginsUpdater
# format:
# $ nix run nixpkgs#python3Packages.black -- update.py
# $ nix run nixpkgs#python3Packages.ruff -- update.py
# type-check:
# $ nix run nixpkgs#python3Packages.mypy -- update.py
# linted:
@@ -19,30 +19,24 @@
#

import inspect
import os
import logging
import textwrap
import json
import logging
import os
import subprocess
from typing import List, Tuple
import textwrap
from pathlib import Path

from typing import List, Tuple

log = logging.getLogger("vim-updater")

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

treesitter = importlib.import_module('nvim-treesitter.update')
import pluginupdate
from pluginupdate import PluginDesc, run_nix_expr

treesitter = importlib.import_module("nvim-treesitter.update")


HEADER = (
@@ -56,17 +50,14 @@ class VimEditor(pluginupdate.Editor):
    nvim_treesitter_updated = False

    def generate_nix(
        self,
        plugins: List[Tuple[PluginDesc, pluginupdate.Plugin]],
        outfile: str
        self, plugins: List[Tuple[PluginDesc, pluginupdate.Plugin]], outfile: str
    ):
        log.info("Generating nix code")
        sorted_plugins = sorted(plugins, key=lambda v: v[0].name.lower())
        log.debug("Loading nvim-treesitter revision from nix...")
        nvim_treesitter_rev = pluginupdate.run_nix_expr(
            "(import <localpkgs> { }).vimPlugins.nvim-treesitter.src.rev",
            self.nixpkgs,
            timeout=10
            timeout=10,
        )

        GET_PLUGINS_LUA = """
@@ -98,7 +89,7 @@ class VimEditor(pluginupdate.Editor):
                """
                )
            )
            for pdesc, plugin in sorted_plugins:
            for pdesc, plugin in plugins:
                content = self.plugin2nix(pdesc, plugin, _isNeovimPlugin(plugin))
                f.write(content)
                if (
@@ -109,8 +100,9 @@ class VimEditor(pluginupdate.Editor):
            f.write("\n}\n")
        print(f"updated {outfile}")

    def plugin2nix(self, pdesc: PluginDesc, plugin: pluginupdate.Plugin, isNeovim: bool) -> str:

    def plugin2nix(
        self, pdesc: PluginDesc, plugin: pluginupdate.Plugin, isNeovim: bool
    ) -> str:
        repo = pdesc.repo

        content = f"  {plugin.normalized_name} = "
@@ -138,19 +130,25 @@ class VimEditor(pluginupdate.Editor):
        if self.nvim_treesitter_updated:
            print("updating nvim-treesitter grammars")
            cmd = [
                "nix", "build",
                "vimPlugins.nvim-treesitter.src", "-f", self.nixpkgs
                , "--print-out-paths"
                "nix",
                "build",
                "vimPlugins.nvim-treesitter.src",
                "-f",
                self.nixpkgs,
                "--print-out-paths",
            ]
            log.debug("Running command: %s", " ".join(cmd))
            nvim_treesitter_dir = subprocess.check_output(cmd, text=True, timeout=90).strip()
            nvim_treesitter_dir = subprocess.check_output(
                cmd, text=True, timeout=90
            ).strip()

            generated = treesitter.update_grammars(nvim_treesitter_dir)
            treesitter_generated_nix_path = os.path.join(
                NIXPKGS_NVIMTREESITTER_FOLDER,
                "generated.nix"
                NIXPKGS_NVIMTREESITTER_FOLDER, "generated.nix"
            )
            open(os.path.join(args.nixpkgs, treesitter_generated_nix_path), "w").write(
                generated
            )
            open(os.path.join(args.nixpkgs, treesitter_generated_nix_path), "w").write(generated)

            if self.nixpkgs_repo:
                index = self.nixpkgs_repo.index
+19 −19
Original line number Diff line number Diff line
@@ -116,9 +116,10 @@ https://github.com/AndrewRadev/bufferize.vim/,HEAD,
https://github.com/akinsho/bufferline.nvim/,,
https://github.com/kwkarlwang/bufjump.nvim/,HEAD,
https://github.com/bullets-vim/bullets.vim/,,
https://github.com/mattn/calendar-vim/,,mattn-calendar-vim
https://github.com/itchyny/calendar.vim/,,
https://github.com/bkad/camelcasemotion/,,
https://github.com/catppuccin/nvim/,,catppuccin-nvim
https://github.com/catppuccin/vim/,HEAD,catppuccin-vim
https://github.com/tyru/caw.vim/,,
https://github.com/uga-rosa/ccc.nvim/,HEAD,
https://github.com/Eandrju/cellular-automaton.nvim/,HEAD,
@@ -299,6 +300,7 @@ https://github.com/direnv/direnv.vim/,,
https://github.com/chipsenkbeil/distant.nvim/,HEAD,
https://github.com/doki-theme/doki-theme-vim/,,
https://github.com/NTBBloodbath/doom-one.nvim/,,
https://github.com/dracula/vim/,,dracula-vim
https://github.com/Mofiqul/dracula.nvim/,HEAD,
https://github.com/stevearc/dressing.nvim/,,
https://github.com/Bekaboo/dropbar.nvim/,HEAD,
@@ -313,6 +315,7 @@ https://github.com/creativenull/efmls-configs-nvim/,,
https://github.com/elixir-tools/elixir-tools.nvim/,HEAD,
https://github.com/elmcast/elm-vim/,,
https://github.com/dmix/elvish.vim/,,
https://github.com/embark-theme/vim/,,embark-vim
https://github.com/mattn/emmet-vim/,,
https://github.com/vim-scripts/emodeline/,,
https://github.com/vim-scripts/errormarker.vim/,,
@@ -361,6 +364,7 @@ https://github.com/gfanto/fzf-lsp.nvim/,,
https://github.com/ibhagwan/fzf-lua/,HEAD,
https://github.com/junegunn/fzf.vim/,,
https://github.com/NTBBloodbath/galaxyline.nvim/,,
https://github.com/gbprod/nord.nvim/,,gbprod-nord
https://github.com/jsfaint/gen_tags.vim/,,
https://github.com/gentoo/gentoo-syntax/,,
https://github.com/ndmitchell/ghcid/,,
@@ -389,9 +393,9 @@ https://github.com/liuchengxu/graphviz.vim/,,
https://github.com/cbochs/grapple.nvim/,HEAD,
https://github.com/blazkowolf/gruber-darker.nvim/,,
https://github.com/MagicDuck/grug-far.nvim/,,
https://github.com/gruvbox-community/gruvbox/,,gruvbox-community
https://github.com/morhetz/gruvbox/,,
https://github.com/luisiacc/gruvbox-baby/,HEAD,
https://github.com/gruvbox-community/gruvbox/,,gruvbox-community
https://github.com/eddyekofo94/gruvbox-flat.nvim/,,
https://github.com/sainnhe/gruvbox-material/,,
https://github.com/f4z3r/gruvbox-material.nvim/,HEAD,
@@ -404,8 +408,8 @@ https://github.com/junegunn/gv.vim/,,
https://github.com/TheSnakeWitcher/hardhat.nvim/,HEAD,
https://github.com/m4xshen/hardtime.nvim/,HEAD,
https://git.sr.ht/~sircmpwn/hare.vim,HEAD,
https://github.com/ThePrimeagen/harpoon/,harpoon2,harpoon2
https://github.com/ThePrimeagen/harpoon/,master,
https://github.com/ThePrimeagen/harpoon/,harpoon2,harpoon2
https://github.com/kiyoon/haskell-scope-highlighting.nvim/,HEAD,
https://github.com/mrcjkb/haskell-snippets.nvim/,HEAD,
https://github.com/neovimhaskell/haskell-vim/,,
@@ -434,7 +438,6 @@ https://github.com/idris-hackers/idris-vim/,,
https://github.com/ShinKage/idris2-nvim/,,
https://github.com/edwinb/idris2-vim/,,
https://github.com/3rd/image.nvim/,HEAD,
https://github.com/samodostal/image.nvim/,HEAD,samodostal-image-nvim
https://github.com/HakonHarnes/img-clip.nvim/,HEAD,
https://github.com/lewis6991/impatient.nvim/,,
https://github.com/backdround/improved-search.nvim/,HEAD,
@@ -447,7 +450,6 @@ https://github.com/Darazaki/indent-o-matic/,,
https://github.com/Yggdroot/indentLine/,,
https://github.com/ciaranm/inkpot/,,
https://github.com/jbyuki/instant.nvim/,HEAD,
https://github.com/jbyuki/one-small-step-for-vimkind/,HEAD,
https://github.com/pta2002/intellitab.nvim/,HEAD,
https://github.com/parsonsmatt/intero-neovim/,,
https://github.com/keith/investigate.vim/,,
@@ -544,6 +546,7 @@ https://github.com/williamboman/mason.nvim/,HEAD,
https://github.com/vim-scripts/matchit.zip/,,
https://github.com/marko-cerovac/material.nvim/,,
https://github.com/kaicataldo/material.vim/,HEAD,
https://github.com/mattn/calendar-vim/,,mattn-calendar-vim
https://github.com/vim-scripts/mayansmoke/,,
https://github.com/chikamichi/mediawiki.vim/,HEAD,
https://github.com/savq/melange-nvim/,,
@@ -602,7 +605,6 @@ https://github.com/miikanissi/modus-themes.nvim/,HEAD,
https://github.com/tomasr/molokai/,,
https://github.com/benlubas/molten-nvim/,HEAD,
https://github.com/loctvl842/monokai-pro.nvim/,HEAD,
https://github.com/shaunsingh/moonlight.nvim/,,pure-lua
https://github.com/leafo/moonscript-vim/,HEAD,
https://github.com/yegappan/mru/,,
https://github.com/smoka7/multicursors.nvim/,HEAD,
@@ -673,7 +675,6 @@ https://github.com/stevanmilic/neotest-scala/,HEAD,
https://github.com/shunsambongi/neotest-testthat/,HEAD,
https://github.com/marilari88/neotest-vitest/,HEAD,
https://github.com/lawrence-laz/neotest-zig/,HEAD,
https://github.com/rose-pine/neovim/,main,rose-pine
https://github.com/Shatur/neovim-ayu/,,
https://github.com/cloudhead/neovim-fuzzy/,,
https://github.com/jeffkreeftmeijer/neovim-sensible/,,
@@ -688,6 +689,7 @@ https://github.com/fiatjaf/neuron.vim/,,
https://github.com/Olical/nfnl/,main,
https://github.com/chr4/nginx.vim/,,
https://github.com/oxfist/night-owl.nvim/,,
https://github.com/bluz71/vim-nightfly-colors/,,nightfly
https://github.com/EdenEast/nightfox.nvim/,,
https://github.com/Alexis12119/nightly.nvim/,,
https://github.com/zah/nim.vim/,,
@@ -699,7 +701,7 @@ https://github.com/shortcuts/no-neck-pain.nvim/,HEAD,
https://github.com/kartikp10/noctis.nvim/,,
https://github.com/folke/noice.nvim/,HEAD,
https://github.com/nvimtools/none-ls.nvim/,HEAD,
https://github.com/gbprod/nord.nvim/,,gbprod-nord
https://github.com/nordtheme/vim/,,nord-vim
https://github.com/shaunsingh/nord.nvim/,,
https://github.com/andersevenrud/nordic.nvim/,,
https://github.com/vigoux/notifier.nvim/,HEAD,
@@ -708,8 +710,8 @@ https://github.com/MunifTanjim/nui.nvim/,main,
https://github.com/jose-elias-alvarez/null-ls.nvim/,,
https://github.com/nacro90/numb.nvim/,,
https://github.com/nvchad/nvchad/,HEAD,
https://github.com/nvchad/ui/,HEAD,nvchad-ui
https://github.com/ChristianChiarulli/nvcode-color-schemes.vim/,,
https://github.com/catppuccin/nvim/,,catppuccin-nvim
https://github.com/AckslD/nvim-FeMaco.lua/,HEAD,
https://github.com/nathanmsmith/nvim-ale-diagnostic/,,
https://github.com/windwp/nvim-autopairs/,,
@@ -825,6 +827,7 @@ https://github.com/nomnivore/ollama.nvim/,HEAD,
https://github.com/yonlu/omni.vim/,,
https://github.com/Hoffs/omnisharp-extended-lsp.nvim/,HEAD,
https://github.com/Th3Whit3Wolf/one-nvim/,,
https://github.com/jbyuki/one-small-step-for-vimkind/,HEAD,
https://github.com/navarasu/onedark.nvim/,,
https://github.com/joshdick/onedark.vim/,,
https://github.com/LunarVim/onedarker.nvim/,,
@@ -854,6 +857,7 @@ https://github.com/olimorris/persisted.nvim/,HEAD,
https://github.com/folke/persistence.nvim/,,
https://github.com/pest-parser/pest.vim/,HEAD,
https://github.com/lifepillar/pgsql.vim/,,
https://github.com/phha/zenburn.nvim/,,phha-zenburn
https://github.com/motus/pig.vim/,,
https://github.com/weirongxu/plantuml-previewer.vim/,HEAD,
https://github.com/aklt/plantuml-syntax/,,
@@ -873,6 +877,7 @@ https://github.com/ahmedkhalf/project.nvim/,,
https://github.com/kevinhwang91/promise-async/,HEAD,
https://github.com/frigoeu/psc-ide-vim/,,
https://github.com/Shougo/pum.vim/,HEAD,
https://github.com/shaunsingh/moonlight.nvim/,,pure-lua
https://github.com/purescript-contrib/purescript-vim/,,
https://github.com/python-mode/python-mode/,,
https://github.com/vim-python/python-syntax/,,
@@ -905,6 +910,7 @@ https://github.com/gu-fan/riv.vim/,,
https://github.com/kevinhwang91/rnvimr/,,
https://github.com/mfukar/robotframework-vim/,,
https://github.com/ron-rs/ron.vim/,,
https://github.com/rose-pine/neovim/,main,rose-pine
https://github.com/jmederosalvarado/roslyn.nvim/,HEAD,
https://github.com/keith/rspec.vim/,,
https://github.com/ccarpita/rtorrent-syntax-file/,,
@@ -912,6 +918,7 @@ https://github.com/simrat39/rust-tools.nvim/,,
https://github.com/rust-lang/rust.vim/,,
https://github.com/hauleth/sad.vim/,,
https://github.com/vmware-archive/salt-vim/,,
https://github.com/samodostal/image.nvim/,HEAD,samodostal-image-nvim
https://github.com/lewis6991/satellite.nvim/,HEAD,
https://github.com/davidgranstrom/scnvim/,HEAD,
https://github.com/tiagovla/scope.nvim/,HEAD,
@@ -935,8 +942,8 @@ https://github.com/mrjones2014/smart-splits.nvim/,,
https://github.com/m4xshen/smartcolumn.nvim/,,
https://github.com/gorkunov/smartpairs.vim/,,
https://github.com/ibhagwan/smartyank.nvim/,,
https://github.com/camspiers/snap/,,
https://github.com/folke/snacks.nvim/,HEAD,
https://github.com/camspiers/snap/,,
https://github.com/norcalli/snippets.nvim/,,
https://github.com/shaunsingh/solarized.nvim/,HEAD,
https://github.com/sainnhe/sonokai/,,
@@ -1068,7 +1075,6 @@ https://github.com/jose-elias-alvarez/typescript.nvim/,,
https://github.com/MrPicklePinosaur/typst-conceal.vim/,HEAD,
https://github.com/chomosuke/typst-preview.nvim/,HEAD,
https://github.com/kaarmu/typst.vim/,HEAD,
https://github.com/nvchad/ui/,HEAD,nvchad-ui
https://github.com/altermo/ultimate-autopair.nvim/,HEAD,
https://github.com/SirVer/ultisnips/,,
https://github.com/mbbill/undotree/,,
@@ -1084,11 +1090,6 @@ https://github.com/junegunn/vader.vim/,,
https://github.com/jbyuki/venn.nvim/,,
https://github.com/vhda/verilog_systemverilog.vim/,,
https://github.com/vifm/vifm.vim/,,
https://github.com/catppuccin/vim/,HEAD,catppuccin-vim
https://github.com/dracula/vim/,,dracula-vim
https://github.com/embark-theme/vim/,,embark-vim
https://github.com/nordtheme/vim/,,nord-vim
https://github.com/inkarkat/vim-AdvancedSorters/,,vim-advanced-sorters
https://github.com/Konfekt/vim-CtrlXA/,,
https://github.com/konfekt/vim-DetectSpellLang/,,
https://github.com/dpelle/vim-LanguageTool/,,
@@ -1115,6 +1116,7 @@ https://github.com/MarcWeber/vim-addon-sql/,,
https://github.com/MarcWeber/vim-addon-syntax-checker/,,
https://github.com/MarcWeber/vim-addon-toggle-buffer/,,
https://github.com/MarcWeber/vim-addon-xdebug/,,
https://github.com/inkarkat/vim-AdvancedSorters/,,vim-advanced-sorters
https://github.com/junegunn/vim-after-object/,,
https://github.com/danilo-augusto/vim-afterglow/,HEAD,
https://github.com/msuperdock/vim-agda/,HEAD,
@@ -1191,6 +1193,7 @@ https://github.com/kristijanhusak/vim-dirvish-git/,,
https://github.com/tpope/vim-dispatch/,,
https://github.com/radenling/vim-dispatch-neovim/,,
https://github.com/jhradilek/vim-docbk/,,
https://github.com/jhradilek/vim-snippets/,,vim-docbk-snippets
https://github.com/tpope/vim-dotenv/,,
https://github.com/junegunn/vim-easy-align/,,
https://github.com/zhou13/vim-easyescape/,,
@@ -1344,7 +1347,6 @@ https://github.com/jistr/vim-nerdtree-tabs/,,
https://github.com/nfnty/vim-nftables/,,
https://github.com/kana/vim-niceblock/,,
https://github.com/nickel-lang/vim-nickel/,main,
https://github.com/bluz71/vim-nightfly-colors/,,nightfly
https://github.com/tommcdo/vim-ninja-feet/,,
https://github.com/LnL7/vim-nix/,,
https://github.com/symphorien/vim-nixhash/,,
@@ -1436,7 +1438,6 @@ https://github.com/bohlender/vim-smt2/,,
https://github.com/justinmk/vim-sneak/,,
https://github.com/garbas/vim-snipmate/,,
https://github.com/honza/vim-snippets/,,
https://github.com/jhradilek/vim-snippets/,,vim-docbk-snippets
https://github.com/lifepillar/vim-solarized8/,HEAD,
https://github.com/tomlion/vim-solidity/,,
https://github.com/christoomey/vim-sort-motion/,,
@@ -1565,7 +1566,6 @@ https://github.com/Lilja/zellij.nvim/,HEAD,
https://github.com/folke/zen-mode.nvim/,,
https://github.com/zenbones-theme/zenbones.nvim/,HEAD,
https://github.com/jnurmine/zenburn/,,
https://github.com/phha/zenburn.nvim/,,phha-zenburn
https://github.com/nvimdev/zephyr-nvim/,,
https://github.com/ziglang/zig.vim/,,
https://github.com/zk-org/zk-nvim/,HEAD,
Loading