neoclide / coc-solargraph

Solargraph extension for coc.nvim

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Solargraph execution is wrapped in a login shell, messing up the path

vitaly opened this issue · comments

Here is the story..

I tried to use bundler with coc-solargraph, but it failed to start with the following error message:

[coc.nvim] Failed to start Solargraph: /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems.rb:283:in `find_spec_for_exe': Could not find 'bundler' (2.2.17) required by your /Users/vitaly/tmp/ruby/vim/Gemfile.lock. (Gem::GemNotFoundException)
To update to the latest version installed on your system, run `bundle update --bundler`.
To install the missing version, run `gem install bundler:2.2.17`
        from /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems.rb:302:in `activate_bin_path'
        from /usr/bin/bundle:23:in `<main>'

I couldn't figure it out for a while until I noticed that the message is coming from the system ruby, while I'm using asdf version in my setup:

> which ruby
/Users/vitaly/.asdf/shims/ruby

> asdf which ruby
/Users/vitaly/.asdf/installs/ruby/2.6.0/bin/ruby

So I figured out it must be a problem with path.

so I wrote a simple bash script to print path to STDERR and set it as my solargraph.bundlerPath

#!/bin/bash

echo SOLARPATH=$PATH >&2

My shell PATH starts with /Users/vitaly/.asdf/shims:/Users/vitaly/.asdf/bin: and then the usual directories. This is standard setup by asdf.

But what I got from my "Solargraph" is this:

[coc.nvim] Failed to start Solargraph: SOLARPATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin:/Users/vitaly/.asdf/installs/nodejs/12.18.2/bin:/Users/vitaly/.asdf/installs/nodejs/12.18.2/.npm/bin:/Users/vitaly/.asdf/shims:/Users/vitaly/.asdf/bin

So it looked like something messed up the path, adding all the standard directories at the beginning.

On a whim I decideed to see if there's any kind of wrapper process, so I added pstree -p $$ >&2 to my dump script.

And this is what I ggt:

[coc.nvim] Failed to start Solargraph: SOLARPATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin:/Users/vitaly/.asdf/installs/nodejs/12.18.2/bin:/Users/vitaly/.asdf/installs/nodejs/12.18.2/.npm/bin:/Users/vitaly/bin:/Users/vitaly/.asdf/shims:/Users/vitaly/.asdf/bin
-+= 00001 root /sbin/launchd
 \-+= 21544 vitaly /usr/local/bin/tmux -u new-session -t MAIN -A -s MAIN
   \-+= 63325 vitaly -zsh
     \-+= 21310 vitaly nvim foo.rb
       \-+= 21546 vitaly /Users/vitaly/.asdf/installs/nodejs/12.18.2/bin/node --no-warnings -r /Users/vitaly/.vim/bundle/coc.nvim/bin/check.js /Users/vitaly/.vim/bundle/coc.nvim/build/index.js
         \-+- 22777 vitaly /bin/bash /Users/vitaly/tmp/ruby/vim/dump.env.sh exec solargraph socket --port 0
           |-+- 22780 vitaly /usr/local/bin/zsh -l -c cd /Users/vitaly/tmp/ruby/vim && '/Users/vitaly/tmp/ruby/vim/dump.env.sh' exec solargraph socket --port 0
           | \-+- 22787 vitaly (zsh)
           |   \--- 22789 vitaly (wc)
           \-+- 22781 vitaly pstree -p 22777
             \--- 22785 root ps -axwwo user,pid,ppid,pgid,command

My SHELL is /usr/local/bin/zsh. For some reason executiuon is being wrapped
in a login invocation (-l) of it, which, of course, resets the PATH

If I change it to export SHELL=/bin/bash, then I get this:

[coc.nvim] Failed to start Solargraph: SOLARPATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin:/Users/vitaly/.asdf/installs/nodejs/12.18.2/bin:/Users/vitaly/.asdf/installs/nodejs/12.18.2/.npm/bin:/Users/vitaly/bin:/Users/vitaly/.asdf/shims:/Users/vitaly/.asdf/bin
-+= 00001 root /sbin/launchd
 \-+= 21544 vitaly /usr/local/bin/tmux -u new-session -t MAIN -A -s MAIN
   \-+= 63325 vitaly -zsh
     \-+= 61526 vitaly nvim foo.rb
       \-+= 61749 vitaly /Users/vitaly/.asdf/installs/nodejs/12.18.2/bin/node --no-warnings -r /Users/vitaly/.vim/bundle/coc.nvim/bin/check.js /Users/vitaly/.vim/bundle/coc.nvim/build/index.js
         \-+- 62971 vitaly /bin/bash -l -c cd /Users/vitaly/tmp/ruby/vim && '/Users/vitaly/tmp/ruby/vim/dump.env.sh' exec solargraph socket --port 0
           \-+- 62974 vitaly /bin/bash /Users/vitaly/tmp/ruby/vim/dump.env.sh exec solargraph socket --port 0
             \-+- 62975 vitaly pstree -p 62974
               \--- 62976 root ps -axwwo user,pid,ppid,pgid,command

I also tried to set my script as a language server in coc. There was no problem, path was intact, and no wrapper:

SOLARPATH=/Users/vitaly/.asdf/installs/nodejs/12.18.2/bin:/Users/vitaly/.asdf/installs/nodejs/12.18.2/.npm/bin:/Users/vitaly/bin:/Users/vitaly/.asdf/shims:/Users/vitaly/.asdf/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin
-+= 00001 root /sbin/launchd
 \-+= 21544 vitaly /usr/local/bin/tmux -u new-session -t MAIN -A -s MAIN
   \-+= 63325 vitaly -zsh
     \-+= 37360 vitaly nvim foo.q
       \-+= 37588 vitaly /Users/vitaly/.asdf/installs/nodejs/12.18.2/bin/node --no-warnings -r /Users/vitaly/.vim/bundle/coc.nvim/bin/check.js /Users/vitaly/.vim/bundle/coc.nvim/build/index.js
         \-+- 38069 vitaly /bin/bash /Users/vitaly/tmp/ruby/vim/dump.env.sh
           \-+- 38070 vitaly pstree -p 38069
             \--- 38071 root ps -axwwo user,pid,ppid,pgid,command

I tried to look through coc-solargraph and coc.nvim sources, but I couldn't find anything..

Any ideas what might be the problem?

bash -l -c '...' or zsh -l -c '...' doesn't read .bashrc or .zshrc, respectively. From man bash:

When an interactive shell that is not a login shell is started, bash reads and executes commands from ~/.bashrc, if that file exists. This may be inhibited by using the --norc option. The --rcfile file option will force bash to read and execute commands from file instead of ~/.bashrc.

Facing similar issue with homebrew on m1 mac

After 5934c42, this fixes the problem:

call coc#config('solargraph.shell', $SHELL)

In my case, my $SHELL is /bin/zsh.