Compare commits

..

23 Commits

Author SHA1 Message Date
Justin M. Keyes
ab2bbbf6c4 NVIM v0.3.4
This maintenance release fixes some issues found in v0.3.3.

FIXES:

8a7b6200fb #9487 provider: improve error message if provider is missing
44ea903ca5 #9468 checkhealth: detect broken pip
b4028056fa Windows: nvim-qt v0.2.12 (fix potential "blank screen" at startup)
2019-01-13 14:25:08 +01:00
Justin M. Keyes
7523eb3ce4 Merge #9495 from justinmk/release-0.3
release candidate 0.3.4
2019-01-13 02:33:47 +01:00
Marco Hinz
8a7b6200fb provider: improve error message if provider is missing (#9487)
Move `has_eval_provider()` check to `eval_call_provider()` to make sure that
every code path calls it first.

Previously we would, when pynvim was missing, get a nice error message for
`:python3 1`, but not for `:py3file blah`.

Fixes https://github.com/neovim/neovim/issues/9485
2019-01-13 01:49:07 +01:00
Justin M. Keyes
44ea903ca5 checkhealth: detect broken pip #9468 2019-01-13 01:48:32 +01:00
Justin M. Keyes
b4028056fa win/dist: nvim-qt v0.2.12 2019-01-13 01:27:36 +01:00
Justin M. Keyes
daad3a5a79 version bump 2019-01-04 20:09:26 +01:00
Justin M. Keyes
2ccc716c4a NVIM v0.3.3
This maintenance release fixes some issues found in v0.3.2 .

FIXES:

a597ab8d1b #9442 Merge pull request from jamessan/revert-pynvim
    d7b3ac029c health/provider: Check for available pynvim when neovim module missing
    edeb19d5e9 python#CheckForModule: Use the given module string instead of hard-coding pynvim
    0dd89cda9c {health,provider}/python: Import the neovim, rather than pynvim, module
fc6e8a4db8 #9423 TUI: Konsole DECSCUSR fixup
2019-01-04 20:05:23 +01:00
Justin M. Keyes
4e23f3e180 release.sh: Format issue-numbers in descriptions [ci skip] 2019-01-04 20:05:08 +01:00
Justin M. Keyes
8b3113ce7a release.sh: fix exclusion pattern [ci skip]
grep support of "\s" pattern is unreliable.
2019-01-04 20:05:08 +01:00
James McCoy
a597ab8d1b Merge pull request #9442 from jamessan/revert-pynvim
Rework Python provider/health check to use neovim module again
2019-01-02 12:14:29 -05:00
James McCoy
d7b3ac029c health/provider: Check for available pynvim when neovim module missing
Adapt the checks so we can still report when the pynvim module is
present but the neovim module is missing.
2019-01-01 20:38:28 -05:00
James McCoy
60e3cf6247 Merge pull request #9439 from jamessan/more-fragile-tests
Mark a few more functionaltests as fragile
2019-01-01 16:07:10 -05:00
James McCoy
edeb19d5e9 python#CheckForModule: Use the given module string instead of hard-coding pynvim 2019-01-01 16:06:37 -05:00
James McCoy
0dd89cda9c {health,provider}/python: Import the neovim, rather than pynvim, module
The neovim module is available for backwards compatibility.  We should
not yet force the use of the pynvim module, since there's no other major
reason to bump the minimum supported Python client module.

Closes #9426
2019-01-01 14:15:31 -05:00
James McCoy
fc6e8a4db8 Merge pull request #9435 from jamessan/tui-konsole
TUI: Konsole DECSCUSR fixup (#9423)
2019-01-01 13:28:05 -05:00
James McCoy
2fbe28bc05 Mark "shell command :! throttles shell-command output greater than ~10KB" fragile 2019-01-01 11:27:52 -05:00
James McCoy
b5de158fdf Mark "feeding large chunks of input with <Paste>" fragile 2019-01-01 11:27:23 -05:00
James McCoy
e53e56d5e5 Mark ":substitute with inccommand during :terminal activity" fragile 2019-01-01 11:26:56 -05:00
Justin M. Keyes
f3260129ad TUI: Konsole DECSCUSR fixup (#9423)
Apparently Konsole's terminfo is still broken.

ref #9364
closes #9420
2019-01-01 11:18:46 -05:00
James McCoy
340d853585 Merge pull request #9433 from jamessan/only-lint-master
travis: Only run lint job for master branch/PRs
2019-01-01 09:23:37 -05:00
James McCoy
57e0a578f0 travis: Only run lint job for master branch/PRs 2019-01-01 09:15:51 -05:00
James McCoy
83fca0ab13 travis: Run ci for release-* branches 2019-01-01 08:14:54 -05:00
James McCoy
fb815bd7b7 version bump 2019-01-01 08:10:13 -05:00
16 changed files with 179 additions and 109 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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]

View File

@@ -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

View File

@@ -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}"

View File

@@ -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);

View File

@@ -3908,12 +3908,7 @@ 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)) { (void)eval_call_provider(name, "execute", args);
emsgf("E319: No \"%s\" provider found. Run \":checkhealth provider\"",
name);
} else {
(void)eval_call_provider(name, "execute", args);
}
} }
} }

View File

@@ -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");
} }

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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()

View File

@@ -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)

View File

@@ -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")

View File

@@ -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)