mirror of
https://github.com/neovim/neovim.git
synced 2025-09-08 12:28:18 +00:00
Compare commits
23 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
ab2bbbf6c4 | ||
![]() |
7523eb3ce4 | ||
![]() |
8a7b6200fb | ||
![]() |
44ea903ca5 | ||
![]() |
b4028056fa | ||
![]() |
daad3a5a79 | ||
![]() |
2ccc716c4a | ||
![]() |
4e23f3e180 | ||
![]() |
8b3113ce7a | ||
![]() |
a597ab8d1b | ||
![]() |
d7b3ac029c | ||
![]() |
60e3cf6247 | ||
![]() |
edeb19d5e9 | ||
![]() |
0dd89cda9c | ||
![]() |
fc6e8a4db8 | ||
![]() |
2fbe28bc05 | ||
![]() |
b5de158fdf | ||
![]() |
e53e56d5e5 | ||
![]() |
f3260129ad | ||
![]() |
340d853585 | ||
![]() |
57e0a578f0 | ||
![]() |
83fca0ab13 | ||
![]() |
fb815bd7b7 |
@@ -74,7 +74,8 @@ jobs:
|
|||||||
- os: osx
|
- os: osx
|
||||||
compiler: gcc
|
compiler: gcc
|
||||||
osx_image: xcode9.4 # macOS 10.13
|
osx_image: xcode9.4 # macOS 10.13
|
||||||
- os: linux
|
- if: branch = master
|
||||||
|
os: linux
|
||||||
env: CI_TARGET=lint
|
env: CI_TARGET=lint
|
||||||
- stage: Flaky builds
|
- stage: Flaky builds
|
||||||
os: linux
|
os: linux
|
||||||
@@ -126,6 +127,7 @@ addons:
|
|||||||
branches:
|
branches:
|
||||||
only:
|
only:
|
||||||
- master
|
- master
|
||||||
|
- /^release-\d+\.\d+$/
|
||||||
|
|
||||||
cache:
|
cache:
|
||||||
apt: true
|
apt: true
|
||||||
|
@@ -112,7 +112,7 @@ set_property(CACHE CMAKE_BUILD_TYPE PROPERTY
|
|||||||
# version string, else they are combined with the result of `git describe`.
|
# version string, else they are combined with the result of `git describe`.
|
||||||
set(NVIM_VERSION_MAJOR 0)
|
set(NVIM_VERSION_MAJOR 0)
|
||||||
set(NVIM_VERSION_MINOR 3)
|
set(NVIM_VERSION_MINOR 3)
|
||||||
set(NVIM_VERSION_PATCH 2)
|
set(NVIM_VERSION_PATCH 4)
|
||||||
set(NVIM_VERSION_PRERELEASE "") # for package maintainers
|
set(NVIM_VERSION_PRERELEASE "") # for package maintainers
|
||||||
|
|
||||||
# API level
|
# API level
|
||||||
|
@@ -192,9 +192,9 @@ function! s:version_info(python) abort
|
|||||||
let nvim_path = s:trim(s:system([
|
let nvim_path = s:trim(s:system([
|
||||||
\ a:python, '-c',
|
\ a:python, '-c',
|
||||||
\ 'import sys; sys.path.remove(""); ' .
|
\ 'import sys; sys.path.remove(""); ' .
|
||||||
\ 'import pynvim; print(pynvim.__file__)']))
|
\ 'import neovim; print(neovim.__file__)']))
|
||||||
if s:shell_error || empty(nvim_path)
|
if s:shell_error || empty(nvim_path)
|
||||||
return [python_version, 'unable to load pynvim Python module', pypi_version,
|
return [python_version, 'unable to load neovim Python module', pypi_version,
|
||||||
\ nvim_path]
|
\ nvim_path]
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@@ -206,13 +206,13 @@ function! s:version_info(python) abort
|
|||||||
return a == b ? 0 : a > b ? 1 : -1
|
return a == b ? 0 : a > b ? 1 : -1
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Try to get pynvim.VERSION (added in 0.1.11dev).
|
" Try to get neovim.VERSION (added in 0.1.11dev).
|
||||||
let nvim_version = s:system([a:python, '-c',
|
let nvim_version = s:system([a:python, '-c',
|
||||||
\ 'from pynvim import VERSION as v; '.
|
\ 'from neovim import VERSION as v; '.
|
||||||
\ 'print("{}.{}.{}{}".format(v.major, v.minor, v.patch, v.prerelease))'],
|
\ 'print("{}.{}.{}{}".format(v.major, v.minor, v.patch, v.prerelease))'],
|
||||||
\ '', 1, 1)
|
\ '', 1, 1)
|
||||||
if empty(nvim_version)
|
if empty(nvim_version)
|
||||||
let nvim_version = 'unable to find pynvim Python module version'
|
let nvim_version = 'unable to find neovim Python module version'
|
||||||
let base = fnamemodify(nvim_path, ':h')
|
let base = fnamemodify(nvim_path, ':h')
|
||||||
let metas = glob(base.'-*/METADATA', 1, 1)
|
let metas = glob(base.'-*/METADATA', 1, 1)
|
||||||
\ + glob(base.'-*/PKG-INFO', 1, 1)
|
\ + glob(base.'-*/PKG-INFO', 1, 1)
|
||||||
@@ -258,71 +258,56 @@ function! s:check_python(version) abort
|
|||||||
call health#report_start('Python ' . a:version . ' provider (optional)')
|
call health#report_start('Python ' . a:version . ' provider (optional)')
|
||||||
|
|
||||||
let pyname = 'python'.(a:version == 2 ? '' : '3')
|
let pyname = 'python'.(a:version == 2 ? '' : '3')
|
||||||
let pyenv = resolve(exepath('pyenv'))
|
let python_exe = ''
|
||||||
let pyenv_root = exists('$PYENV_ROOT') ? resolve($PYENV_ROOT) : ''
|
|
||||||
let venv = exists('$VIRTUAL_ENV') ? resolve($VIRTUAL_ENV) : ''
|
let venv = exists('$VIRTUAL_ENV') ? resolve($VIRTUAL_ENV) : ''
|
||||||
let host_prog_var = pyname.'_host_prog'
|
let host_prog_var = pyname.'_host_prog'
|
||||||
let loaded_var = 'g:loaded_'.pyname.'_provider'
|
let loaded_var = 'g:loaded_'.pyname.'_provider'
|
||||||
let python_bin = ''
|
|
||||||
let python_multiple = []
|
let python_multiple = []
|
||||||
|
|
||||||
if exists(loaded_var) && !exists('*provider#'.pyname.'#Call')
|
if exists(loaded_var) && !exists('*provider#'.pyname.'#Call')
|
||||||
call health#report_info('Disabled ('.loaded_var.'='.eval(loaded_var).'). This might be due to some previous error.')
|
call health#report_info('Disabled ('.loaded_var.'='.eval(loaded_var).'). This might be due to some previous error.')
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if !empty(pyenv)
|
let [pyenv, pyenv_root] = s:check_for_pyenv()
|
||||||
if empty(pyenv_root)
|
|
||||||
call health#report_info(
|
|
||||||
\ 'pyenv was found, but $PYENV_ROOT is not set. `pyenv root` will be used.'
|
|
||||||
\ .' If you run into problems, try setting $PYENV_ROOT explicitly.'
|
|
||||||
\ )
|
|
||||||
let pyenv_root = s:trim(s:system([pyenv, 'root']))
|
|
||||||
endif
|
|
||||||
|
|
||||||
if !isdirectory(pyenv_root)
|
|
||||||
call health#report_error('Invalid pyenv root: '.pyenv_root)
|
|
||||||
else
|
|
||||||
call health#report_info(printf('pyenv: %s', pyenv))
|
|
||||||
call health#report_info(printf('pyenv root: %s', pyenv_root))
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
if exists('g:'.host_prog_var)
|
if exists('g:'.host_prog_var)
|
||||||
call health#report_info(printf('Using: g:%s = "%s"', host_prog_var, get(g:, host_prog_var)))
|
call health#report_info(printf('Using: g:%s = "%s"', host_prog_var, get(g:, host_prog_var)))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let [pyname, pythonx_errs] = provider#pythonx#Detect(a:version)
|
let [pyname, pythonx_errors] = provider#pythonx#Detect(a:version)
|
||||||
|
|
||||||
if empty(pyname)
|
if empty(pyname)
|
||||||
call health#report_warn('No Python interpreter was found with the pynvim '
|
call health#report_warn('No Python executable found that can `import neovim`. '
|
||||||
\ . 'module. Using the first available for diagnostics.')
|
\ . 'Using the first available executable for diagnostics.')
|
||||||
elseif exists('g:'.host_prog_var)
|
elseif exists('g:'.host_prog_var)
|
||||||
let python_bin = pyname
|
let python_exe = pyname
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if !empty(pythonx_errs)
|
" No Python executable could `import neovim`.
|
||||||
call health#report_error('Python provider error', pythonx_errs)
|
if !empty(pythonx_errors)
|
||||||
|
call health#report_error('Python provider error:', pythonx_errors)
|
||||||
|
|
||||||
elseif !empty(pyname) && empty(python_bin)
|
elseif !empty(pyname) && empty(python_exe)
|
||||||
if !exists('g:'.host_prog_var)
|
if !exists('g:'.host_prog_var)
|
||||||
call health#report_info(printf('`g:%s` is not set. Searching for '
|
call health#report_info(printf('`g:%s` is not set. Searching for '
|
||||||
\ . '%s in the environment.', host_prog_var, pyname))
|
\ . '%s in the environment.', host_prog_var, pyname))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if !empty(pyenv)
|
if !empty(pyenv)
|
||||||
let python_bin = s:trim(s:system([pyenv, 'which', pyname], '', 1))
|
let python_exe = s:trim(s:system([pyenv, 'which', pyname], '', 1))
|
||||||
|
|
||||||
if empty(python_bin)
|
if empty(python_exe)
|
||||||
call health#report_warn(printf('pyenv could not find %s.', pyname))
|
call health#report_warn(printf('pyenv could not find %s.', pyname))
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if empty(python_bin)
|
if empty(python_exe)
|
||||||
let python_bin = exepath(pyname)
|
let python_exe = exepath(pyname)
|
||||||
|
|
||||||
if exists('$PATH')
|
if exists('$PATH')
|
||||||
for path in split($PATH, has('win32') ? ';' : ':')
|
for path in split($PATH, has('win32') ? ';' : ':')
|
||||||
let path_bin = s:normalize_path(path.'/'.pyname)
|
let path_bin = s:normalize_path(path.'/'.pyname)
|
||||||
if path_bin != s:normalize_path(python_bin)
|
if path_bin != s:normalize_path(python_exe)
|
||||||
\ && index(python_multiple, path_bin) == -1
|
\ && index(python_multiple, path_bin) == -1
|
||||||
\ && executable(path_bin)
|
\ && executable(path_bin)
|
||||||
call add(python_multiple, path_bin)
|
call add(python_multiple, path_bin)
|
||||||
@@ -336,8 +321,8 @@ function! s:check_python(version) abort
|
|||||||
\ . 'Set `g:%s` to avoid surprises.', pyname, host_prog_var))
|
\ . 'Set `g:%s` to avoid surprises.', pyname, host_prog_var))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if python_bin =~# '\<shims\>'
|
if python_exe =~# '\<shims\>'
|
||||||
call health#report_warn(printf('`%s` appears to be a pyenv shim.', python_bin), [
|
call health#report_warn(printf('`%s` appears to be a pyenv shim.', python_exe), [
|
||||||
\ '`pyenv` is not in $PATH, your pyenv installation is broken. '
|
\ '`pyenv` is not in $PATH, your pyenv installation is broken. '
|
||||||
\ .'Set `g:'.host_prog_var.'` to avoid surprises.',
|
\ .'Set `g:'.host_prog_var.'` to avoid surprises.',
|
||||||
\ ])
|
\ ])
|
||||||
@@ -346,9 +331,9 @@ function! s:check_python(version) abort
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if !empty(python_bin) && !exists('g:'.host_prog_var)
|
if !empty(python_exe) && !exists('g:'.host_prog_var)
|
||||||
if empty(venv) && !empty(pyenv)
|
if empty(venv) && !empty(pyenv)
|
||||||
\ && !empty(pyenv_root) && resolve(python_bin) !~# '^'.pyenv_root.'/'
|
\ && !empty(pyenv_root) && resolve(python_exe) !~# '^'.pyenv_root.'/'
|
||||||
call health#report_warn('pyenv is not set up optimally.', [
|
call health#report_warn('pyenv is not set up optimally.', [
|
||||||
\ printf('Create a virtualenv specifically '
|
\ printf('Create a virtualenv specifically '
|
||||||
\ . 'for Neovim using pyenv, and set `g:%s`. This will avoid '
|
\ . 'for Neovim using pyenv, and set `g:%s`. This will avoid '
|
||||||
@@ -362,7 +347,7 @@ function! s:check_python(version) abort
|
|||||||
let venv_root = fnamemodify(venv, ':h')
|
let venv_root = fnamemodify(venv, ':h')
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if resolve(python_bin) !~# '^'.venv_root.'/'
|
if resolve(python_exe) !~# '^'.venv_root.'/'
|
||||||
call health#report_warn('Your virtualenv is not set up optimally.', [
|
call health#report_warn('Your virtualenv is not set up optimally.', [
|
||||||
\ printf('Create a virtualenv specifically '
|
\ printf('Create a virtualenv specifically '
|
||||||
\ . 'for Neovim and use `g:%s`. This will avoid '
|
\ . 'for Neovim and use `g:%s`. This will avoid '
|
||||||
@@ -373,16 +358,16 @@ function! s:check_python(version) abort
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if empty(python_bin) && !empty(pyname)
|
if empty(python_exe) && !empty(pyname)
|
||||||
" An error message should have already printed.
|
" An error message should have already printed.
|
||||||
call health#report_error(printf('`%s` was not found.', pyname))
|
call health#report_error(printf('`%s` was not found.', pyname))
|
||||||
elseif !empty(python_bin) && !s:check_bin(python_bin)
|
elseif !empty(python_exe) && !s:check_bin(python_exe)
|
||||||
let python_bin = ''
|
let python_exe = ''
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" Check if $VIRTUAL_ENV is valid.
|
" Check if $VIRTUAL_ENV is valid.
|
||||||
if exists('$VIRTUAL_ENV') && !empty(python_bin)
|
if exists('$VIRTUAL_ENV') && !empty(python_exe)
|
||||||
if $VIRTUAL_ENV ==# matchstr(python_bin, '^\V'.$VIRTUAL_ENV)
|
if $VIRTUAL_ENV ==# matchstr(python_exe, '^\V'.$VIRTUAL_ENV)
|
||||||
call health#report_info('$VIRTUAL_ENV matches executable')
|
call health#report_info('$VIRTUAL_ENV matches executable')
|
||||||
else
|
else
|
||||||
call health#report_warn(
|
call health#report_warn(
|
||||||
@@ -393,7 +378,7 @@ function! s:check_python(version) abort
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
" Diagnostic output
|
" Diagnostic output
|
||||||
call health#report_info('Executable: ' . (empty(python_bin) ? 'Not found' : python_bin))
|
call health#report_info('Executable: ' . (empty(python_exe) ? 'Not found' : python_exe))
|
||||||
if len(python_multiple)
|
if len(python_multiple)
|
||||||
for path_bin in python_multiple
|
for path_bin in python_multiple
|
||||||
call health#report_info('Other python executable: ' . path_bin)
|
call health#report_info('Other python executable: ' . path_bin)
|
||||||
@@ -402,30 +387,39 @@ function! s:check_python(version) abort
|
|||||||
|
|
||||||
let pip = 'pip' . (a:version == 2 ? '' : '3')
|
let pip = 'pip' . (a:version == 2 ? '' : '3')
|
||||||
|
|
||||||
if !empty(python_bin)
|
if empty(python_exe)
|
||||||
let [pyversion, current, latest, status] = s:version_info(python_bin)
|
" No Python executable can import 'neovim'. Check if any Python executable
|
||||||
|
" can import 'pynvim'. If so, that Python failed to import 'neovim' as
|
||||||
|
" well, which is most probably due to a failed pip upgrade:
|
||||||
|
" https://github.com/neovim/neovim/wiki/Following-HEAD#20181118
|
||||||
|
let [pynvim_exe, errors] = provider#pythonx#DetectByModule('pynvim', a:version)
|
||||||
|
if !empty(pynvim_exe)
|
||||||
|
call health#report_error(
|
||||||
|
\ 'Detected pip upgrade failure: Python executable can import "pynvim" but '
|
||||||
|
\ . 'not "neovim": '. pynvim_exe,
|
||||||
|
\ "Use that Python version to reinstall \"pynvim\" and optionally \"neovim\".\n"
|
||||||
|
\ . pip ." uninstall pynvim neovim\n"
|
||||||
|
\ . pip ." install pynvim\n"
|
||||||
|
\ . pip ." install neovim # only if needed by third-party software")
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
let [pyversion, current, latest, status] = s:version_info(python_exe)
|
||||||
|
|
||||||
if a:version != str2nr(pyversion)
|
if a:version != str2nr(pyversion)
|
||||||
call health#report_warn('Unexpected Python version.' .
|
call health#report_warn('Unexpected Python version.' .
|
||||||
\ ' This could lead to confusing error messages.')
|
\ ' This could lead to confusing error messages.')
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if a:version == 3 && str2float(pyversion) < 3.3
|
if a:version == 3 && str2float(pyversion) < 3.3
|
||||||
call health#report_warn('Python 3.3+ is recommended.')
|
call health#report_warn('Python 3.3+ is recommended.')
|
||||||
endif
|
endif
|
||||||
|
|
||||||
call health#report_info('Python version: ' . pyversion)
|
call health#report_info('Python version: ' . pyversion)
|
||||||
|
|
||||||
if s:is_bad_response(status)
|
if s:is_bad_response(status)
|
||||||
call health#report_info(printf('pynvim version: %s (%s)', current, status))
|
call health#report_info(printf('pynvim version: %s (%s)', current, status))
|
||||||
else
|
else
|
||||||
call health#report_info(printf('pynvim version: %s', current))
|
call health#report_info(printf('pynvim version: %s', current))
|
||||||
let [module_found, _msg] = provider#pythonx#CheckForModule(python_bin,
|
|
||||||
\ 'neovim', a:version)
|
|
||||||
if !module_found
|
|
||||||
call health#report_error('Importing "neovim" failed.',
|
|
||||||
\ "Reinstall \"pynvim\" and optionally \"neovim\" packages.\n" .
|
|
||||||
\ pip ." uninstall pynvim neovim\n" .
|
|
||||||
\ pip ." install pynvim\n" .
|
|
||||||
\ pip ." install neovim # only if needed by third-party software")
|
|
||||||
endif
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if s:is_bad_response(current)
|
if s:is_bad_response(current)
|
||||||
@@ -443,7 +437,37 @@ function! s:check_python(version) abort
|
|||||||
call health#report_ok(printf('Latest pynvim is installed.'))
|
call health#report_ok(printf('Latest pynvim is installed.'))
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Check if pyenv is available and a valid pyenv root can be found, then return
|
||||||
|
" their respective paths. If either of those is invalid, return two empty
|
||||||
|
" strings, effectivly ignoring pyenv.
|
||||||
|
function! s:check_for_pyenv() abort
|
||||||
|
let pyenv_path = resolve(exepath('pyenv'))
|
||||||
|
|
||||||
|
if empty(pyenv_path)
|
||||||
|
return ['', '']
|
||||||
|
endif
|
||||||
|
|
||||||
|
call health#report_info('pyenv: Path: '. pyenv_path)
|
||||||
|
|
||||||
|
let pyenv_root = exists('$PYENV_ROOT') ? resolve($PYENV_ROOT) : ''
|
||||||
|
|
||||||
|
if empty(pyenv_root)
|
||||||
|
let pyenv_root = s:trim(s:system([pyenv_path, 'root']))
|
||||||
|
call health#report_info('pyenv: $PYENV_ROOT is not set. Infer from `pyenv root`.')
|
||||||
|
endif
|
||||||
|
|
||||||
|
if !isdirectory(pyenv_root)
|
||||||
|
call health#report_warn(
|
||||||
|
\ printf('pyenv: Root does not exist: %s. '
|
||||||
|
\ . 'Ignoring pyenv for all following checks.', pyenv_root))
|
||||||
|
return ['', '']
|
||||||
|
endif
|
||||||
|
|
||||||
|
call health#report_info('pyenv: Root: '.pyenv_root)
|
||||||
|
|
||||||
|
return [pyenv_path, pyenv_root]
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:check_ruby() abort
|
function! s:check_ruby() abort
|
||||||
|
@@ -10,7 +10,7 @@ function! provider#pythonx#Require(host) abort
|
|||||||
|
|
||||||
" Python host arguments
|
" Python host arguments
|
||||||
let prog = (ver == '2' ? provider#python#Prog() : provider#python3#Prog())
|
let prog = (ver == '2' ? provider#python#Prog() : provider#python3#Prog())
|
||||||
let args = [prog, '-c', 'import sys; sys.path.remove(""); import pynvim; pynvim.start_host()']
|
let args = [prog, '-c', 'import sys; sys.path.remove(""); import neovim; neovim.start_host()']
|
||||||
|
|
||||||
" Collect registered Python plugins into args
|
" Collect registered Python plugins into args
|
||||||
let python_plugins = remote#host#PluginsForHost(a:host.name)
|
let python_plugins = remote#host#PluginsForHost(a:host.name)
|
||||||
@@ -21,37 +21,45 @@ function! provider#pythonx#Require(host) abort
|
|||||||
return provider#Poll(args, a:host.orig_name, '$NVIM_PYTHON_LOG_FILE')
|
return provider#Poll(args, a:host.orig_name, '$NVIM_PYTHON_LOG_FILE')
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! provider#pythonx#Detect(major_ver) abort
|
function! s:get_python_executable_from_host_var(major_version) abort
|
||||||
if a:major_ver == 2
|
return expand(get(g:, 'python'.(a:major_version == 3 ? '3' : '').'_host_prog', ''))
|
||||||
if exists('g:python_host_prog')
|
endfunction
|
||||||
return [expand(g:python_host_prog), '']
|
|
||||||
else
|
function! s:get_python_candidates(major_version) abort
|
||||||
let progs = ['python2', 'python2.7', 'python2.6', 'python']
|
return {
|
||||||
endif
|
\ 2: ['python2', 'python2.7', 'python2.6', 'python'],
|
||||||
else
|
\ 3: ['python3', 'python3.7', 'python3.6', 'python3.5', 'python3.4', 'python3.3',
|
||||||
if exists('g:python3_host_prog')
|
\ 'python']
|
||||||
return [expand(g:python3_host_prog), '']
|
\ }[a:major_version]
|
||||||
else
|
endfunction
|
||||||
let progs = ['python3', 'python3.7', 'python3.6', 'python3.5',
|
|
||||||
\ 'python3.4', 'python3.3', 'python']
|
" Returns [path_to_python_executable, error_message]
|
||||||
endif
|
function! provider#pythonx#Detect(major_version) abort
|
||||||
|
return provider#pythonx#DetectByModule('neovim', a:major_version)
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
" Returns [path_to_python_executable, error_message]
|
||||||
|
function! provider#pythonx#DetectByModule(module, major_version) abort
|
||||||
|
let python_exe = s:get_python_executable_from_host_var(a:major_version)
|
||||||
|
|
||||||
|
if !empty(python_exe)
|
||||||
|
return [python_exe, '']
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
let candidates = s:get_python_candidates(a:major_version)
|
||||||
let errors = []
|
let errors = []
|
||||||
|
|
||||||
for prog in progs
|
for exe in candidates
|
||||||
let [result, err] = provider#pythonx#CheckForModule(prog, 'pynvim', a:major_ver)
|
let [result, error] = provider#pythonx#CheckForModule(exe, a:module, a:major_version)
|
||||||
if result
|
if result
|
||||||
return [prog, err]
|
return [exe, error]
|
||||||
endif
|
endif
|
||||||
" Accumulate errors in case we don't find
|
" Accumulate errors in case we don't find any suitable Python executable.
|
||||||
" any suitable Python interpreter.
|
call add(errors, error)
|
||||||
call add(errors, err)
|
|
||||||
endfor
|
endfor
|
||||||
|
|
||||||
" No suitable Python interpreter found.
|
" No suitable Python executable found.
|
||||||
return ['', 'provider/pythonx: Could not load Python ' . a:major_ver
|
return ['', 'provider/pythonx: Could not load Python '.a:major_version.":\n".join(errors, "\n")]
|
||||||
\ . ":\n" . join(errors, "\n")]
|
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
" Returns array: [prog_exitcode, prog_version]
|
" Returns array: [prog_exitcode, prog_version]
|
||||||
@@ -75,12 +83,12 @@ function! provider#pythonx#CheckForModule(prog, module, major_version) abort
|
|||||||
|
|
||||||
let min_version = (a:major_version == 2) ? '2.6' : '3.3'
|
let min_version = (a:major_version == 2) ? '2.6' : '3.3'
|
||||||
|
|
||||||
" Try to load pynvim module, and output Python version.
|
" Try to load module, and output Python version.
|
||||||
" Exit codes:
|
" Exit codes:
|
||||||
" 0 pynvim module can be loaded.
|
" 0 module can be loaded.
|
||||||
" 2 pynvim module cannot be loaded.
|
" 2 module cannot be loaded.
|
||||||
" Otherwise something else went wrong (e.g. 1 or 127).
|
" Otherwise something else went wrong (e.g. 1 or 127).
|
||||||
let [prog_exitcode, prog_version] = s:import_module(a:prog, 'pynvim')
|
let [prog_exitcode, prog_version] = s:import_module(a:prog, a:module)
|
||||||
|
|
||||||
if prog_exitcode == 2 || prog_exitcode == 0
|
if prog_exitcode == 2 || prog_exitcode == 0
|
||||||
" Check version only for expected return codes.
|
" Check version only for expected return codes.
|
||||||
@@ -94,7 +102,7 @@ function! provider#pythonx#CheckForModule(prog, module, major_version) abort
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
if prog_exitcode == 2
|
if prog_exitcode == 2
|
||||||
return [0, prog_path.' does not have the "pynvim" module. :help provider-python']
|
return [0, prog_path.' does not have the "' . a:module . '" module. :help provider-python']
|
||||||
elseif prog_exitcode == 127
|
elseif prog_exitcode == 127
|
||||||
" This can happen with pyenv's shims.
|
" This can happen with pyenv's shims.
|
||||||
return [0, prog_path . ' does not exist: ' . prog_version]
|
return [0, prog_path . ' does not exist: ' . prog_version]
|
||||||
|
@@ -1,6 +1,8 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
# Shows a log with changes grouped next to their merge-commit.
|
# Prints a nicely-formatted commit history.
|
||||||
|
# - Commits are grouped below their merge-commit.
|
||||||
|
# - Issue numbers are moved next to the commit-id.
|
||||||
#
|
#
|
||||||
# Parameters:
|
# Parameters:
|
||||||
# $1 "since" commit
|
# $1 "since" commit
|
||||||
@@ -19,14 +21,32 @@ is_merge_commit() {
|
|||||||
git log $1^2 >/dev/null 2>&1 && return 0 || return 1
|
git log $1^2 >/dev/null 2>&1 && return 0 || return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Removes parens from issue/ticket/PR numbers.
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
# in: 3340e08becbf foo (#9423)
|
||||||
|
# out: 3340e08becbf foo #9423
|
||||||
|
_deparen() {
|
||||||
|
sed 's/(\(\#[0-9]\{3,\}\))/\1/g'
|
||||||
|
}
|
||||||
|
|
||||||
|
# Cleans up issue/ticket/PR numbers in the commit descriptions.
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
# in: 3340e08becbf foo (#9423)
|
||||||
|
# out: 3340e08becbf #9423 foo
|
||||||
|
_format_ticketnums() {
|
||||||
|
nvim -Es +'g/\v(#[0-9]{3,})/norm! ngEldE0ep' +'%p' | _deparen
|
||||||
|
}
|
||||||
|
|
||||||
for commit in $(git log --format='%H' --first-parent "$__SINCE"..HEAD); do
|
for commit in $(git log --format='%H' --first-parent "$__SINCE"..HEAD); do
|
||||||
if is_merge_commit ${commit} ; then
|
if is_merge_commit ${commit} ; then
|
||||||
if [ -z "$__INVMATCH" ] || ! git log --oneline ${commit}^1..${commit}^2 \
|
if [ -z "$__INVMATCH" ] || ! git log --oneline ${commit}^1..${commit}^2 \
|
||||||
| grep -E "$__INVMATCH" >/dev/null 2>&1 ; then
|
| >/dev/null 2>&1 grep -E "$__INVMATCH" ; then
|
||||||
git log -1 --oneline ${commit}
|
git log -1 --oneline ${commit}
|
||||||
git log --format=' %h %s' ${commit}^1..${commit}^2
|
git log --format=' %h %s' ${commit}^1..${commit}^2
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
git log -1 --oneline ${commit}
|
git log -1 --oneline ${commit}
|
||||||
fi
|
fi
|
||||||
done
|
done | _format_ticketnums
|
||||||
|
@@ -67,7 +67,7 @@ _do_release_commit() {
|
|||||||
|
|
||||||
if ! test "$ARG1" = '--use-current-commit' ; then
|
if ! test "$ARG1" = '--use-current-commit' ; then
|
||||||
echo "Building changelog since ${__LAST_TAG}..."
|
echo "Building changelog since ${__LAST_TAG}..."
|
||||||
__CHANGELOG="$(./scripts/git-log-pretty-since.sh "$__LAST_TAG" 'vim-patch:\S')"
|
__CHANGELOG="$(./scripts/git-log-pretty-since.sh "$__LAST_TAG" 'vim-patch:[^[:space:]]')"
|
||||||
|
|
||||||
git add CMakeLists.txt
|
git add CMakeLists.txt
|
||||||
git commit --edit -m "${__RELEASE_MSG} ${__CHANGELOG}"
|
git commit --edit -m "${__RELEASE_MSG} ${__CHANGELOG}"
|
||||||
|
@@ -22683,6 +22683,16 @@ static void script_host_eval(char *name, typval_T *argvars, typval_T *rettv)
|
|||||||
|
|
||||||
typval_T eval_call_provider(char *provider, char *method, list_T *arguments)
|
typval_T eval_call_provider(char *provider, char *method, list_T *arguments)
|
||||||
{
|
{
|
||||||
|
if (!eval_has_provider(provider)) {
|
||||||
|
emsgf("E319: No \"%s\" provider found. Run \":checkhealth provider\"",
|
||||||
|
provider);
|
||||||
|
return (typval_T){
|
||||||
|
.v_type = VAR_NUMBER,
|
||||||
|
.v_lock = VAR_UNLOCKED,
|
||||||
|
.vval.v_number = (varnumber_T)0
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
char func[256];
|
char func[256];
|
||||||
int name_len = snprintf(func, sizeof(func), "provider#%s#Call", provider);
|
int name_len = snprintf(func, sizeof(func), "provider#%s#Call", provider);
|
||||||
|
|
||||||
|
@@ -3908,14 +3908,9 @@ static void script_host_execute(char *name, exarg_T *eap)
|
|||||||
tv_list_append_number(args, (int)eap->line1);
|
tv_list_append_number(args, (int)eap->line1);
|
||||||
tv_list_append_number(args, (int)eap->line2);
|
tv_list_append_number(args, (int)eap->line2);
|
||||||
|
|
||||||
if (!eval_has_provider(name)) {
|
|
||||||
emsgf("E319: No \"%s\" provider found. Run \":checkhealth provider\"",
|
|
||||||
name);
|
|
||||||
} else {
|
|
||||||
(void)eval_call_provider(name, "execute", args);
|
(void)eval_call_provider(name, "execute", args);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
static void script_host_execute_file(char *name, exarg_T *eap)
|
static void script_host_execute_file(char *name, exarg_T *eap)
|
||||||
{
|
{
|
||||||
|
@@ -1675,8 +1675,7 @@ static void patch_terminfo_bugs(TUIData *data, const char *term,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Blacklist of terminals that cannot be trusted to report DECSCUSR support.
|
// Blacklist of terminals that cannot be trusted to report DECSCUSR support.
|
||||||
if (!(st || (vte_version != 0 && vte_version < 3900)
|
if (!(st || (vte_version != 0 && vte_version < 3900) || konsolev)) {
|
||||||
|| (konsolev > 0 && konsolev < 180770))) {
|
|
||||||
data->unibi_ext.reset_cursor_style = unibi_find_ext_str(ut, "Se");
|
data->unibi_ext.reset_cursor_style = unibi_find_ext_str(ut, "Se");
|
||||||
data->unibi_ext.set_cursor_style = unibi_find_ext_str(ut, "Ss");
|
data->unibi_ext.set_cursor_style = unibi_find_ext_str(ut, "Ss");
|
||||||
}
|
}
|
||||||
|
@@ -11,8 +11,9 @@ do
|
|||||||
clear()
|
clear()
|
||||||
if missing_provider('python3') then
|
if missing_provider('python3') then
|
||||||
it(':python3 reports E319 if provider is missing', function()
|
it(':python3 reports E319 if provider is missing', function()
|
||||||
expect_err([[Vim%(python3%):E319: No "python3" provider found.*]],
|
local expected = [[Vim%(py3.*%):E319: No "python3" provider found.*]]
|
||||||
command, 'python3 print("foo")')
|
expect_err(expected, command, 'py3 print("foo")')
|
||||||
|
expect_err(expected, command, 'py3file foo')
|
||||||
end)
|
end)
|
||||||
pending('Python 3 (or the pynvim module) is broken/missing', function() end)
|
pending('Python 3 (or the pynvim module) is broken/missing', function() end)
|
||||||
return
|
return
|
||||||
|
@@ -19,8 +19,9 @@ do
|
|||||||
clear()
|
clear()
|
||||||
if missing_provider('python') then
|
if missing_provider('python') then
|
||||||
it(':python reports E319 if provider is missing', function()
|
it(':python reports E319 if provider is missing', function()
|
||||||
expect_err([[Vim%(python%):E319: No "python" provider found.*]],
|
local expected = [[Vim%(py.*%):E319: No "python" provider found.*]]
|
||||||
command, 'python print("foo")')
|
expect_err(expected, command, 'py print("foo")')
|
||||||
|
expect_err(expected, command, 'pyfile foo')
|
||||||
end)
|
end)
|
||||||
pending('Python 2 (or the pynvim module) is broken/missing', function() end)
|
pending('Python 2 (or the pynvim module) is broken/missing', function() end)
|
||||||
return
|
return
|
||||||
|
@@ -19,8 +19,9 @@ do
|
|||||||
clear()
|
clear()
|
||||||
if missing_provider('ruby') then
|
if missing_provider('ruby') then
|
||||||
it(':ruby reports E319 if provider is missing', function()
|
it(':ruby reports E319 if provider is missing', function()
|
||||||
expect_err([[Vim%(ruby%):E319: No "ruby" provider found.*]],
|
local expected = [[Vim%(ruby.*%):E319: No "ruby" provider found.*]]
|
||||||
command, 'ruby puts "foo"')
|
expect_err(expected, command, 'ruby puts "foo"')
|
||||||
|
expect_err(expected, command, 'rubyfile foo')
|
||||||
end)
|
end)
|
||||||
pending("Missing neovim RubyGem.", function() end)
|
pending("Missing neovim RubyGem.", function() end)
|
||||||
return
|
return
|
||||||
|
@@ -2512,6 +2512,9 @@ describe(":substitute", function()
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
it(':substitute with inccommand during :terminal activity', function()
|
it(':substitute with inccommand during :terminal activity', function()
|
||||||
|
if helpers.skip_fragile(pending) then
|
||||||
|
return
|
||||||
|
end
|
||||||
retry(2, 40000, function()
|
retry(2, 40000, function()
|
||||||
local screen = Screen.new(30,15)
|
local screen = Screen.new(30,15)
|
||||||
clear()
|
clear()
|
||||||
|
@@ -61,6 +61,9 @@ describe('feeding large chunks of input with <Paste>', function()
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
it('ok', function()
|
it('ok', function()
|
||||||
|
if helpers.skip_fragile(pending) then
|
||||||
|
return
|
||||||
|
end
|
||||||
local t = {}
|
local t = {}
|
||||||
for i = 1, 20000 do
|
for i = 1, 20000 do
|
||||||
t[i] = 'item ' .. tostring(i)
|
t[i] = 'item ' .. tostring(i)
|
||||||
|
@@ -51,6 +51,9 @@ describe("shell command :!", function()
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
it("throttles shell-command output greater than ~10KB", function()
|
it("throttles shell-command output greater than ~10KB", function()
|
||||||
|
if helpers.skip_fragile(pending) then
|
||||||
|
return
|
||||||
|
end
|
||||||
child_session.feed_data(
|
child_session.feed_data(
|
||||||
":!for i in $(seq 2 30000); do echo XXXXXXXXXX $i; done\n")
|
":!for i in $(seq 2 30000); do echo XXXXXXXXXX $i; done\n")
|
||||||
|
|
||||||
|
4
third-party/CMakeLists.txt
vendored
4
third-party/CMakeLists.txt
vendored
@@ -163,8 +163,8 @@ set(GPERF_SHA256 588546b945bba4b70b6a3a616e80b4ab466e3f33024a352fc2198112cdbb3ae
|
|||||||
set(WINTOOLS_URL https://github.com/neovim/deps/raw/2f9acbecf06365c10baa3c0087f34a54c9c6f949/opt/win32tools.zip)
|
set(WINTOOLS_URL https://github.com/neovim/deps/raw/2f9acbecf06365c10baa3c0087f34a54c9c6f949/opt/win32tools.zip)
|
||||||
set(WINTOOLS_SHA256 8bfce7e3a365721a027ce842f2ec1cf878f1726233c215c05964aac07300798c)
|
set(WINTOOLS_SHA256 8bfce7e3a365721a027ce842f2ec1cf878f1726233c215c05964aac07300798c)
|
||||||
|
|
||||||
set(WINGUI_URL https://github.com/equalsraf/neovim-qt/releases/download/v0.2.11/neovim-qt.zip)
|
set(WINGUI_URL https://github.com/equalsraf/neovim-qt/releases/download/v0.2.12/neovim-qt.zip)
|
||||||
set(WINGUI_SHA256 b7add4b14561a2d8f55d3bbffb1d887209e4f26f837836639c2efeaaed9fa04e)
|
set(WINGUI_SHA256 68f8d7d46e21c94ac24577bc65d378c5f622794d11d34950e41edc1b0335560c)
|
||||||
|
|
||||||
set(WIN32YANK_X86_URL https://github.com/equalsraf/win32yank/releases/download/v0.0.4/win32yank-x86.zip)
|
set(WIN32YANK_X86_URL https://github.com/equalsraf/win32yank/releases/download/v0.0.4/win32yank-x86.zip)
|
||||||
set(WIN32YANK_X86_SHA256 62f34e5a46c5d4a7b3f3b512e1ff7b77fedd432f42581cbe825233a996eed62c)
|
set(WIN32YANK_X86_SHA256 62f34e5a46c5d4a7b3f3b512e1ff7b77fedd432f42581cbe825233a996eed62c)
|
||||||
|
Reference in New Issue
Block a user