Merge branch 'fix-omnisharp-launch' of https://github.com/nop00/YouCompleteMe into nop00-fix-omnisharp-launch

This commit is contained in:
Strahinja Val Markovic 2013-12-24 18:47:45 -08:00
commit 7fac081bea
3 changed files with 30 additions and 17 deletions

View File

@ -19,7 +19,6 @@
# along with YouCompleteMe. If not, see <http://www.gnu.org/licenses/>. # along with YouCompleteMe. If not, see <http://www.gnu.org/licenses/>.
import os import os
from sys import platform
import glob import glob
from ycm.completers.completer import Completer from ycm.completers.completer import Completer
from ycm.server import responses from ycm.server import responses
@ -28,7 +27,6 @@ import urllib2
import urllib import urllib
import urlparse import urlparse
import json import json
import subprocess
import logging import logging
SERVER_NOT_FOUND_MSG = ( 'OmniSharp server binary not found at {0}. ' + SERVER_NOT_FOUND_MSG = ( 'OmniSharp server binary not found at {0}. ' +
@ -150,13 +148,14 @@ class CsharpCompleter( Completer ):
if not os.path.isfile( omnisharp ): if not os.path.isfile( omnisharp ):
raise RuntimeError( SERVER_NOT_FOUND_MSG.format( omnisharp ) ) raise RuntimeError( SERVER_NOT_FOUND_MSG.format( omnisharp ) )
if not platform.startswith( 'win' ):
omnisharp = 'mono ' + omnisharp
path_to_solutionfile = os.path.join( folder, solutionfile ) path_to_solutionfile = os.path.join( folder, solutionfile )
# command has to be provided as one string for some reason # we need to pass the command to Popen as a string since we're passing
command = [ omnisharp + ' -p ' + str( self._omnisharp_port ) + ' -s ' + # shell=True (as recommended by Python's doc)
path_to_solutionfile ] command = ( omnisharp + ' -p ' + str( self._omnisharp_port ) + ' -s ' +
path_to_solutionfile )
if not utils.OnWindows():
command = 'mono ' + command
filename_format = os.path.join( utils.PathToTempDir(), filename_format = os.path.join( utils.PathToTempDir(),
'omnisharp_{port}_{sln}_{std}.log' ) 'omnisharp_{port}_{sln}_{std}.log' )
@ -168,7 +167,9 @@ class CsharpCompleter( Completer ):
with open( self._filename_stderr, 'w' ) as fstderr: with open( self._filename_stderr, 'w' ) as fstderr:
with open( self._filename_stdout, 'w' ) as fstdout: with open( self._filename_stdout, 'w' ) as fstdout:
subprocess.Popen( command, stdout=fstdout, stderr=fstderr, shell=True ) # shell=True is needed for Windows so OmniSharp does not spawn
# in a new visible window
utils.SafePopen( command, stdout=fstdout, stderr=fstderr, shell=True )
self._logger.info( 'Starting OmniSharp server' ) self._logger.info( 'Starting OmniSharp server' )

View File

@ -25,6 +25,7 @@ import functools
import socket import socket
import stat import stat
from distutils.spawn import find_executable from distutils.spawn import find_executable
import subprocess
WIN_PYTHON27_PATH = 'C:\python27\pythonw.exe' WIN_PYTHON27_PATH = 'C:\python27\pythonw.exe'
WIN_PYTHON26_PATH = 'C:\python26\pythonw.exe' WIN_PYTHON26_PATH = 'C:\python26\pythonw.exe'
@ -169,3 +170,18 @@ def AddThirdPartyFoldersToSysPath():
def ForceSemanticCompletion( request_data ): def ForceSemanticCompletion( request_data ):
return ( 'force_semantic' in request_data and return ( 'force_semantic' in request_data and
bool( request_data[ 'force_semantic' ] ) ) bool( request_data[ 'force_semantic' ] ) )
def SafePopen( args, bufsize = 0, executable = None, stdin = None,
stdout = None, stderr = None, preexec_fn = None,
close_fds = False, shell = False, cwd = None, env = None,
universal_newlines = False, startupinfo = None,
creationflags = 0 ):
if stdin is None:
# We need this on Windows otherwise bad things happen. See issue #637.
stdin = subprocess.PIPE if OnWindows() else None
return subprocess.Popen( args, bufsize, executable, stdin, stdout, stderr,
preexec_fn, close_fds, shell, cwd, env,
universal_newlines, startupinfo, creationflags )

View File

@ -19,7 +19,6 @@
import os import os
import vim import vim
import subprocess
import tempfile import tempfile
import json import json
from ycm import vimsupport from ycm import vimsupport
@ -94,7 +93,7 @@ class YouCompleteMe( object ):
BaseRequest.server_location = 'http://localhost:' + str( server_port ) BaseRequest.server_location = 'http://localhost:' + str( server_port )
if self._user_options[ 'server_use_vim_stdout' ]: if self._user_options[ 'server_use_vim_stdout' ]:
self._server_popen = subprocess.Popen( args ) self._server_popen = utils.SafePopen( args )
else: else:
filename_format = os.path.join( utils.PathToTempDir(), filename_format = os.path.join( utils.PathToTempDir(),
'server_{port}_{std}.log' ) 'server_{port}_{std}.log' )
@ -103,13 +102,10 @@ class YouCompleteMe( object ):
std = 'stdout' ) std = 'stdout' )
self._server_stderr = filename_format.format( port = server_port, self._server_stderr = filename_format.format( port = server_port,
std = 'stderr' ) std = 'stderr' )
# We need this on Windows otherwise bad things happen. See issue #637.
stdin = subprocess.PIPE if utils.OnWindows() else None
with open( self._server_stderr, 'w' ) as fstderr: with open( self._server_stderr, 'w' ) as fstderr:
with open( self._server_stdout, 'w' ) as fstdout: with open( self._server_stdout, 'w' ) as fstdout:
self._server_popen = subprocess.Popen( args, self._server_popen = utils.SafePopen( args,
stdin = stdin,
stdout = fstdout, stdout = fstdout,
stderr = fstderr ) stderr = fstderr )
self._NotifyUserIfServerCrashed() self._NotifyUserIfServerCrashed()