Saturday, October 12, 2024

FIX: editors/neovim broken treesitter parsers

Hi,

Last week I received an email from Thanos Tsouanas (in CC) pointing out
something fishy in the Neovim package we shipped with 7.6.

In summary, we were not installing the treesitter parsers in our neovim package
and this meant that (unless you install the treesitter plugin using a nvim
package manager), you'd get a big ol' Lua stacktrace about a missing parser
when you opened a file written in a language that ought to have a parser
bundled (e.g. Lua).

I never noticed this because my personal config uses the treesitter plugin,
which automagically installs the parsers if they are absent.

I discussed with upstream here:
https://github.com/neovim/neovim/issues/30761

The diff below is the minimal fix, adapted from FreeBSD ports. It should
probably be backported to -stable after a period of testing in -current.

Fixes one failing test too.

Please test. Comments, OK?

P.S.

Applying this fix has forced me to revisit the neovim build system, and I think
it may actually be possible to simplify the port quite a bit, but that's a
larger change that should be handled separately.

P.P.S.:

Why does lld take so long to link nvim?


Index: Makefile
===================================================================
RCS file: /cvs/ports/editors/neovim/Makefile,v
diff -u -p -r1.48 Makefile
--- Makefile 10 Oct 2024 13:41:09 -0000 1.48
+++ Makefile 12 Oct 2024 12:28:04 -0000
@@ -12,6 +12,7 @@ EMBED_LUAJIT = No
COMMENT = continuation and extension of Vim

DIST_TUPLE = github neovim neovim v0.10.2 .
+REVISION = 0

# embedded luajit
USE_NOBTCFI = Yes
@@ -27,6 +28,18 @@ DIST_TUPLE += github LuaJIT LuaJIT 75e92
${STATIC_DEPS_WRKSRC}/luajit
DIST_TUPLE += github keplerproject lua-compat-5.3 v0.13 \
${STATIC_DEPS_WRKSRC}/lua-compat-5.3
+DIST_TUPLE += github tree-sitter tree-sitter-c v0.21.3 \
+ ${STATIC_DEPS_WRKSRC}/parsers/treesitter_c
+DIST_TUPLE += github tree-sitter-grammars tree-sitter-lua v0.1.0 \
+ ${STATIC_DEPS_WRKSRC}/parsers/treesitter_lua
+DIST_TUPLE += github neovim tree-sitter-vim v0.4.0 \
+ ${STATIC_DEPS_WRKSRC}/parsers/treesitter_vim
+DIST_TUPLE += github neovim tree-sitter-vimdoc v3.0.0 \
+ ${STATIC_DEPS_WRKSRC}/parsers/treesitter_vimdoc
+DIST_TUPLE += github tree-sitter-grammars tree-sitter-query v0.4.0 \
+ ${STATIC_DEPS_WRKSRC}/parsers/treesitter_query
+DIST_TUPLE += github MDeiml tree-sitter-markdown v0.2.3 \
+ ${STATIC_DEPS_WRKSRC}/parsers/treesitter_markdown

# Neovim: Apache 2.0 + Vim License
# LuaJIT: MIT + public domain
@@ -113,6 +126,7 @@ TEST_DEPENDS = shells/bash \
# makes sense to embed it.
STATIC_DEPS_WRKBUILD=${WRKBUILD}/static-deps-build
STATIC_DEPS_INST=${WRKBUILD}/static-deps-inst
+PARSERS_WRKBUILD=${STATIC_DEPS_WRKBUILD}/parsers
.include <bsd.port.arch.mk>
.if ${PROPERTIES:Mclang}
LUAJIT_TARGET_LIBS = "-lc++abi -lpthread"
@@ -164,6 +178,24 @@ pre-configure:
cd ${STATIC_DEPS_WRKBUILD}/luv && \
${SETENV} ${MAKE_ENV} VERBOSE=1 \
${MAKE_PROGRAM} install
+
+ # Build the treesitter parsers.
+ #
+ # For this we borrow a trick from FreeBSD and re-use just the part of
+ # upstream's build system that builds the parsers.
+ mkdir -p ${PARSERS_WRKBUILD}/build/src
+ for i in ${STATIC_DEPS_WRKSRC}/parsers/*; do \
+ cp -r $${i} ${PARSERS_WRKBUILD}/build/src/$$(basename $$i); \
+ done
+ ${MAKE_ENV} ${LOCALBASE}/bin/cmake -S ${WRKSRC}/cmake.deps \
+ -B ${PARSERS_WRKBUILD} ${CONFIGURE_ARGS} \
+ -DUSE_BUNDLED_TS_PARSERS=ON \
+ -DUSE_EXISTING_SRC_DIR:BOOL=ON
+ # The following line both builds *and* installs the parsers.
+ ${MAKE_ENV} ${LOCALBASE}/bin/cmake --build ${PARSERS_WRKBUILD}
+ mkdir -p ${WRKBUILD}/lib/nvim/parser
+ cp -r ${PARSERS_WRKBUILD}/usr/lib/nvim/parser/*.so \
+ ${WRKBUILD}/lib/nvim/parser/

# These are the "old tests". There is also a new suite, but we would need the
# "busted" test suite for Lua, which is not yet ported.
Index: distinfo
===================================================================
RCS file: /cvs/ports/editors/neovim/distinfo,v
diff -u -p -r1.27 distinfo
--- distinfo 10 Oct 2024 13:41:09 -0000 1.27
+++ distinfo 11 Oct 2024 18:21:33 -0000
@@ -1,8 +1,20 @@
SHA256 (LuaJIT-LuaJIT-75e92777988017fe47c5eb290998021bbf972d1f.tar.gz) = D2kogZACTXMsZ2ReQO1bE31nqpUP7fD0SprQ89um1dI=
+SHA256 (MDeiml-tree-sitter-markdown-v0.2.3.tar.gz) = SQnWAjZD8a/DqyGVhdQDW3QD86F4SXgquAPF9zyKMdU=
SHA256 (keplerproject-lua-compat-5.3-v0.13.tar.gz) = 9dww57H9qFbuTTkr5FdkLB8MJZJkqbm/vLaAMCzoj8I=
SHA256 (luvit-luv-1.48.0-2.tar.gz) = 5kzYoBl0SSiLN99soFgSDo0jCPwwX1QxYrW/PpInOgU=
SHA256 (neovim-neovim-v0.10.2.tar.gz) = VGyy2p//u36RMmE0S79M8WInIfbFpnqndgnpdueLjok=
+SHA256 (neovim-tree-sitter-vim-v0.4.0.tar.gz) = n4Vvi0oQq0M0hVD6LTyyhGrj2OYPRYhyAFScBRxm+dU=
+SHA256 (neovim-tree-sitter-vimdoc-v3.0.0.tar.gz) = pjm/kr9Xv6HNyQyhavJ7+vJql3kGR3bdS+NMHvFFP2w=
+SHA256 (tree-sitter-grammars-tree-sitter-lua-v0.1.0.tar.gz) = Iwz8v6dO0fe4FJ6aHzTC78TFiacf4PXchWBiL4Ag1yI=
+SHA256 (tree-sitter-grammars-tree-sitter-query-v0.4.0.tar.gz) = 06Qjq2bcYrKWliXigBFmeKiiJYK1/wh3lSIhCNsvam4=
+SHA256 (tree-sitter-tree-sitter-c-v0.21.3.tar.gz) = daN4DfYRTNN0lnYcSnyf2QDHi+46Jwf1kNeMDKOiQ2g=
SIZE (LuaJIT-LuaJIT-75e92777988017fe47c5eb290998021bbf972d1f.tar.gz) = 1081633
+SIZE (MDeiml-tree-sitter-markdown-v0.2.3.tar.gz) = 418293
SIZE (keplerproject-lua-compat-5.3-v0.13.tar.gz) = 60960
SIZE (luvit-luv-1.48.0-2.tar.gz) = 134821
SIZE (neovim-neovim-v0.10.2.tar.gz) = 12801272
+SIZE (neovim-tree-sitter-vim-v0.4.0.tar.gz) = 356704
+SIZE (neovim-tree-sitter-vimdoc-v3.0.0.tar.gz) = 58110
+SIZE (tree-sitter-grammars-tree-sitter-lua-v0.1.0.tar.gz) = 56812
+SIZE (tree-sitter-grammars-tree-sitter-query-v0.4.0.tar.gz) = 42944
+SIZE (tree-sitter-tree-sitter-c-v0.21.3.tar.gz) = 366957
Index: pkg/PLIST
===================================================================
RCS file: /cvs/ports/editors/neovim/pkg/PLIST,v
diff -u -p -r1.23 PLIST
--- pkg/PLIST 10 Oct 2024 13:41:09 -0000 1.23
+++ pkg/PLIST 12 Oct 2024 11:42:43 -0000
@@ -1,5 +1,13 @@
@bin bin/nvim
lib/nvim/
+lib/nvim/parser/
+@so lib/nvim/parser/c.so
+@so lib/nvim/parser/lua.so
+@so lib/nvim/parser/markdown.so
+@so lib/nvim/parser/markdown_inline.so
+@so lib/nvim/parser/query.so
+@so lib/nvim/parser/vim.so
+@so lib/nvim/parser/vimdoc.so
@man man/man1/nvim.1
share/applications/nvim.desktop
share/doc/pkg-readmes/${PKGSTEM}

--
Best Regards
Edd Barrett

https://www.theunixzoo.co.uk

No comments:

Post a Comment