mirror of
https://github.com/neovim/neovim.git
synced 2026-09-09 07:25:51 +00:00
Problem: LuaLS struggles with the generics used in Nvim's runtime, requiring broad diagnostic suppressions. Indexing is also slow. Solution: Use EmmyLua for type checks in the build and CI. It offers more sophisticated type checking, substantially better support for generics, and much better flow analysis. Correct the affected annotations. Use `@internal`, supported directly by EmmyLua, instead of `@nodoc` for shared internal declarations, and support it in the help parser. AI-assisted
376 lines
13 KiB
YAML
376 lines
13 KiB
YAML
name: test
|
|
on:
|
|
push:
|
|
branches:
|
|
- 'master'
|
|
- 'release-[0-9]+.[0-9]+'
|
|
pull_request:
|
|
branches:
|
|
- 'master'
|
|
- 'release-[0-9]+.[0-9]+'
|
|
workflow_dispatch:
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.ref }}
|
|
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
|
|
|
env:
|
|
ASAN_OPTIONS: detect_leaks=1:check_initialization_order=1:log_path=${{ github.workspace }}/build/log/asan:intercept_tls_get_addr=0
|
|
BIN_DIR: ${{ github.workspace }}/bin
|
|
BUILD_DIR: ${{ github.workspace }}/build
|
|
INSTALL_PREFIX: ${{ github.workspace }}/nvim-install
|
|
LOG_DIR: ${{ github.workspace }}/build/log
|
|
NVIM_LOG_FILE: ${{ github.workspace }}/build/nvim.log
|
|
TSAN_OPTIONS: log_path=${{ github.workspace }}/build/log/tsan
|
|
VALGRIND_LOG: ${{ github.workspace }}/build/log/valgrind-%p.log
|
|
# TEST_FILE: test/functional/core/startup_spec.lua
|
|
# TEST_FILTER: foo
|
|
|
|
jobs:
|
|
lintc:
|
|
runs-on: ubuntu-24.04
|
|
timeout-minutes: 20
|
|
env:
|
|
NVIM_LOG_FILE: ${{ github.workspace }}/zig-out/nvim.log
|
|
OPTS: -Doptimize=ReleaseFast -Dci-build
|
|
steps:
|
|
- uses: actions/checkout@v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- uses: ./.github/actions/setup
|
|
|
|
- uses: mlugg/setup-zig@d1434d08867e3ee9daa34448df10607b98908d29 # v2.2.1
|
|
with:
|
|
version: 0.16.0
|
|
- run: sudo apt-get install -y inotify-tools
|
|
|
|
- name: nvim_bin
|
|
id: nvim_bin
|
|
run: zig build nvim_bin $OPTS
|
|
|
|
- if: success() || failure() && steps.nvim_bin.outcome == 'success'
|
|
name: clint.lua
|
|
run: zig build lintc-clint $OPTS
|
|
|
|
- if: success() || failure() && steps.nvim_bin.outcome == 'success'
|
|
name: clang-tidy
|
|
run: zig build lintc-clang-tidy $OPTS
|
|
|
|
- if: success() || failure() && steps.nvim_bin.outcome == 'success'
|
|
name: uncrustify
|
|
run: zig build lintc-uncrustify $OPTS
|
|
|
|
lint:
|
|
runs-on: ubuntu-24.04-arm
|
|
timeout-minutes: 10
|
|
env:
|
|
CC: clang
|
|
steps:
|
|
- uses: actions/checkout@v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- uses: ./.github/actions/setup
|
|
|
|
- name: Install stylua
|
|
run: |
|
|
wget --directory-prefix="$BIN_DIR" https://github.com/JohnnyMorganz/StyLua/releases/latest/download/stylua-linux-aarch64.zip
|
|
(cd "$BIN_DIR"; unzip stylua*.zip)
|
|
|
|
- name: Install ts_query_ls
|
|
run: |
|
|
wget --directory-prefix="$BIN_DIR" https://github.com/ribru17/ts_query_ls/releases/latest/download/ts_query_ls-aarch64-unknown-linux-gnu.tar.gz
|
|
(cd "$BIN_DIR"; tar -xzvf ts_query_ls-aarch64-unknown-linux-gnu.tar.gz)
|
|
|
|
- name: Build third-party deps
|
|
run: |
|
|
cmake -S cmake.deps -B .deps -G Ninja
|
|
cmake --build .deps
|
|
|
|
- run: cmake -B build -G Ninja -D CI_LINT=ON
|
|
|
|
- if: "!cancelled()"
|
|
name: Determine if run should be aborted
|
|
id: abort_job
|
|
env:
|
|
JOB_STATUS: ${{ job.status }}
|
|
run: echo "status=${JOB_STATUS}" >> $GITHUB_OUTPUT
|
|
|
|
- if: success() || failure() && steps.abort_job.outputs.status == 'success'
|
|
name: stylua
|
|
run: cmake --build build --target lintlua-stylua
|
|
|
|
- if: success() || failure() && steps.abort_job.outputs.status == 'success'
|
|
name: emmylua
|
|
run: cmake --build build --target emmylua-check
|
|
|
|
- if: success() || failure() && steps.abort_job.outputs.status == 'success'
|
|
name: lintsh
|
|
run: cmake --build build --target lintsh
|
|
|
|
- if: success() || failure() && steps.abort_job.outputs.status == 'success'
|
|
name: lintquery
|
|
run: cmake --build build --target lintquery
|
|
|
|
clang-analyzer:
|
|
runs-on: ubuntu-24.04-arm
|
|
timeout-minutes: 20
|
|
env:
|
|
CC: clang
|
|
steps:
|
|
- uses: actions/checkout@v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- uses: ./.github/actions/setup
|
|
- name: Build third-party deps
|
|
run: |
|
|
cmake -S cmake.deps --preset ci
|
|
cmake --build .deps
|
|
cmake --preset ci
|
|
- run: cmake --build build --target clang-analyzer
|
|
|
|
posix:
|
|
name: ${{ matrix.build.os }} ${{ matrix.build.flavor }} ${{ matrix.build.cc }} ${{ matrix.test }}
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
# The `os` field is not needed to differentiate between the different
|
|
# matrix builds. It is needed to not change the required checks (which
|
|
# uses jobs names) each time we bump the runner version. It may be
|
|
# possible to remove if we e.g. start using `-latest` runner versions
|
|
# or if github introduces a wildcard for required checks in the future.
|
|
build:
|
|
[
|
|
{ runner: ubuntu-24.04, os: ubuntu, flavor: asan, cc: clang, flags: -D ENABLE_ASAN_UBSAN=ON },
|
|
{ runner: ubuntu-24.04, os: ubuntu, flavor: tsan, cc: clang, flags: -D ENABLE_TSAN=ON },
|
|
{ runner: ubuntu-24.04, os: ubuntu, flavor: release, cc: gcc, flags: -D CMAKE_BUILD_TYPE=Release -D ENABLE_TRANSLATIONS=ON },
|
|
{ runner: ubuntu-24.04-arm, os: ubuntu, flavor: arm, cc: clang, flags: -D CMAKE_BUILD_TYPE=RelWithDebInfo },
|
|
{ runner: macos-15-intel, os: macos, flavor: intel, cc: clang, flags: -D CMAKE_FIND_FRAMEWORK=NEVER, deps_flags: -D CMAKE_FIND_FRAMEWORK=NEVER },
|
|
{ runner: macos-26, os: macos, flavor: arm, cc: clang, flags: -D CMAKE_FIND_FRAMEWORK=NEVER, deps_flags: -D CMAKE_FIND_FRAMEWORK=NEVER },
|
|
{ runner: ubuntu-24.04, os: ubuntu, flavor: puc-lua, cc: gcc, deps_flags: -D USE_BUNDLED_LUAJIT=OFF -D USE_BUNDLED_LUA=ON, flags: -D PREFER_LUA=ON },
|
|
]
|
|
test: [unittest, functionaltest, oldtest]
|
|
exclude:
|
|
- test: unittest
|
|
build: { flavor: tsan }
|
|
- test: unittest
|
|
build: { flavor: puc-lua }
|
|
- test: oldtest
|
|
build: { flavor: tsan }
|
|
- test: oldtest
|
|
build: { runner: ubuntu-24.04-arm }
|
|
runs-on: ${{ matrix.build.runner }}
|
|
timeout-minutes: 45
|
|
env:
|
|
CC: ${{ matrix.build.cc }}
|
|
NVIM_TEST_INTEG: ${{ matrix.build.flavor == 'release' && '1' || '0' }}
|
|
steps:
|
|
- uses: actions/checkout@v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- uses: ./.github/actions/setup
|
|
with:
|
|
install_flags: "--test"
|
|
|
|
- name: Create log dir
|
|
run: mkdir -p "$LOG_DIR"
|
|
|
|
- if: ${{ matrix.test != 'unittest' }}
|
|
name: Set up interpreter packages
|
|
run: |
|
|
echo "Install neovim RubyGem."
|
|
gem install --no-document --bindir "$BIN_DIR" --user-install --pre neovim
|
|
|
|
sudo cpanm -n Neovim::Ext || cat "$HOME/.cpanm/build.log"
|
|
perl -W -e 'use Neovim::Ext; print $Neovim::Ext::VERSION'
|
|
|
|
- name: Remove .git directory
|
|
if: ${{ matrix.build.os == 'ubuntu' }}
|
|
run: cmake -E rm -rf -- .git
|
|
|
|
- name: Build third-party deps
|
|
env:
|
|
BUILD_DEPS_FLAGS: ${{ matrix.build.deps_flags }}
|
|
run: |
|
|
cmake -S cmake.deps --preset ci -D CMAKE_BUILD_TYPE=Debug $BUILD_DEPS_FLAGS
|
|
cmake --build .deps
|
|
|
|
- name: Build
|
|
env:
|
|
BUILD_FLAGS: ${{ matrix.build.flags }}
|
|
run: |
|
|
cmake --preset ci -D CMAKE_BUILD_TYPE=Debug -D CMAKE_INSTALL_PREFIX:PATH=$INSTALL_PREFIX $BUILD_FLAGS
|
|
cmake --build build
|
|
|
|
- if: ${{ matrix.test == 'unittest' }}
|
|
name: unittest
|
|
timeout-minutes: 20
|
|
run: cmake --build build --target unittest
|
|
|
|
- if: ${{ matrix.test == 'functionaltest' }}
|
|
name: functionaltest
|
|
timeout-minutes: 20
|
|
env:
|
|
# With parallel tests, use shorter timeout for a single group.
|
|
TEST_TIMEOUT: 600
|
|
run: |
|
|
set +e
|
|
# `-k 0` tells ninja to continue running all targets even if some fail.
|
|
cmake --build build --target functionaltest-parallel -j 2 -- -k 0
|
|
exit_code="$?"
|
|
cmake --build build --target functionaltest-summary
|
|
exit "$exit_code"
|
|
|
|
- if: ${{ matrix.test == 'oldtest' }}
|
|
name: oldtest
|
|
timeout-minutes: 20
|
|
run: make -C test/old/testdir NVIM_PRG=$(realpath build)/bin/nvim
|
|
|
|
- name: Install
|
|
run: |
|
|
cmake --install build
|
|
"$INSTALL_PREFIX/bin/nvim" -V1 --version
|
|
if ! "$INSTALL_PREFIX/bin/nvim" -u NONE -e -c ':help' -c ':qall'; then
|
|
echo "Running ':help' in the installed nvim failed."
|
|
echo "Maybe the helptags have not been generated properly."
|
|
echo 'Failed running :help'
|
|
exit 1
|
|
fi
|
|
|
|
# Check that all runtime files were installed
|
|
for file in $(git -C runtime ls-files '*.vim' '*.ps' '*.dict' '*.py' '*.tutor' '*.awk' '*.sh' '*.bat'); do
|
|
if ! test -e "$INSTALL_PREFIX/share/nvim/runtime/$file"; then
|
|
printf "It appears that %s is not installed." "$file"
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
# Check that generated syntax file has function names, #5060.
|
|
genvimsynf=syntax/vim/generated.vim
|
|
gpat='syn keyword vimFuncName .*eval'
|
|
if ! grep -q "$gpat" "$INSTALL_PREFIX/share/nvim/runtime/$genvimsynf"; then
|
|
echo "It appears that $genvimsynf does not contain $gpat."
|
|
exit 1
|
|
fi
|
|
|
|
- if: '!cancelled()'
|
|
name: Show logs
|
|
run: cat $(find "$LOG_DIR" -type f)
|
|
|
|
# TODO: matrixify
|
|
zig-build-linux:
|
|
runs-on: ubuntu-24.04
|
|
timeout-minutes: 45
|
|
name: build using zig build (linux)
|
|
env:
|
|
# NB: tests assume there is a chosen install path, but nothing needs to be actually installed
|
|
OPTS: -Doptimize=ReleaseSafe -Dinstall-path=/usr/
|
|
steps:
|
|
- uses: actions/checkout@v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- uses: mlugg/setup-zig@d1434d08867e3ee9daa34448df10607b98908d29 # v2.2.1
|
|
with:
|
|
version: 0.16.0
|
|
- run: sudo apt-get install -y inotify-tools
|
|
|
|
- run: zig fmt --check . # run first, otherwise it will descend into zig-pkg..
|
|
- run: mkdir -p build/ # build/ is used for shared log paths, see global ENV defs
|
|
- run: zig build $OPTS test_nlua0
|
|
- run: zig build $OPTS nvim_bin && ./zig-out/bin/nvim --version
|
|
- run: zig build $OPTS unittest
|
|
- run: zig build $OPTS functionaltest
|
|
- run: zig build $OPTS oldtest
|
|
# `zig build` uses a lua script for doctags in order to support cross-compiling
|
|
# compare with the builtin generator that they match
|
|
- run: cd runtime; ../zig-out/bin/nvim -u NONE -i NONE -e --headless -c "helptags ++t doc" -c quit
|
|
- run: diff -u runtime/doc/tags zig-out/runtime/doc/tags
|
|
|
|
zig-build-macos-15:
|
|
runs-on: macos-15
|
|
timeout-minutes: 45
|
|
name: build using zig build (macos 15)
|
|
env:
|
|
OPTS: -Dinstall-path=/usr/
|
|
steps:
|
|
- uses: actions/checkout@v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- uses: mlugg/setup-zig@d1434d08867e3ee9daa34448df10607b98908d29 # v2.2.1
|
|
with:
|
|
version: 0.16.0
|
|
|
|
- run: mkdir -p build/ # build/ is used for shared log paths, see global ENV defs
|
|
- run: zig build $OPTS test_nlua0
|
|
- run: zig build $OPTS nvim_bin && ./zig-out/bin/nvim --version
|
|
- run: zig build $OPTS functionaltest
|
|
- run: zig build $OPTS oldtest
|
|
|
|
zig-build-windows:
|
|
runs-on: windows-2025
|
|
timeout-minutes: 45
|
|
name: build using zig build (windows)
|
|
steps:
|
|
- uses: actions/checkout@v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- uses: mlugg/setup-zig@d1434d08867e3ee9daa34448df10607b98908d29 # v2.2.1
|
|
with:
|
|
version: 0.16.0
|
|
|
|
- run: mkdir -p build/ # build/ is used for shared log paths, see global ENV defs
|
|
- run: zig build test_nlua0
|
|
- run: zig build nvim_bin
|
|
- run: ./zig-out/bin/nvim --version
|
|
# TODO: support entire test suite
|
|
- run: zig build functionaltest -- test/functional/api/buffer_spec.lua
|
|
|
|
windows:
|
|
uses: ./.github/workflows/test_windows.yml
|
|
|
|
with-external-deps:
|
|
runs-on: ubuntu-24.04-arm
|
|
timeout-minutes: 10
|
|
env:
|
|
CC: gcc
|
|
steps:
|
|
- uses: actions/checkout@v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- uses: ./.github/actions/setup
|
|
|
|
- name: Install dependencies
|
|
run: |
|
|
sudo apt-get install -y \
|
|
libluajit-5.1-dev \
|
|
libunibilium-dev \
|
|
libuv1-dev \
|
|
lua-filesystem \
|
|
lua-lpeg \
|
|
luajit \
|
|
lua-luv-dev
|
|
# libtree-sitter-dev \
|
|
|
|
# Remove comments from packages once we start using these external
|
|
# dependencies.
|
|
|
|
- name: Build third-party deps
|
|
run: |
|
|
cmake -S cmake.deps --preset external_deps
|
|
cmake --build .deps
|
|
|
|
- name: Build
|
|
run: |
|
|
cmake --preset ci
|
|
cmake --build build
|