def start_process(self, conf_path, classpath, cache_dir, java_home, java_flags): Util.mkdir_p(cache_dir) log_path = os.path.join(cache_dir, "server.log") log = open(log_path, "w") null = open("/dev/null", "r") args = ( [os.path.join(java_home, "bin", "java")] + ["-cp", classpath] + [a for a in java_flags.split(" ") if a != ""] + ["-Densime.config={}".format(conf_path), "org.ensime.server.Server"]) process = subprocess.Popen( args, stdin=null, stdout=log, stderr=subprocess.STDOUT) pid_path = os.path.join(cache_dir, "server.pid") Util.write_file(pid_path, str(process.pid)) def on_stop(): log.close() with catch(Exception, lambda e: None): os.remove(pid_path) return EnsimeProcess(cache_dir, process, log_path, on_stop)
def start_process(self, classpath): cache_dir = self.config['cache-dir'] java_flags = self.config['java-flags'] Util.mkdir_p(cache_dir) log_path = os.path.join(cache_dir, "server.log") log = open(log_path, "w") null = open(os.devnull, "r") java = os.path.join(self.config['java-home'], 'bin', 'java') if not os.path.exists(java): raise InvalidJavaPathError(errno.ENOENT, 'No such file or directory', java) elif not os.access(java, os.X_OK): raise InvalidJavaPathError(errno.EACCES, 'Permission denied', java) args = ([java, "-cp", classpath] + [a for a in java_flags if a != ""] + [ "-Densime.config={}".format(self._config_path), "org.ensime.server.Server" ]) process = subprocess.Popen(args, stdin=null, stdout=log, stderr=subprocess.STDOUT) pid_path = os.path.join(cache_dir, "server.pid") Util.write_file(pid_path, str(process.pid)) def on_stop(): log.close() null.close() with catch(Exception, lambda e: None): os.remove(pid_path) return EnsimeProcess(cache_dir, process, log_path, on_stop)
def start_process(self, classpath): cache_dir = self.config['cache-dir'] java_flags = self.config['java-flags'] Util.mkdir_p(cache_dir) log_path = os.path.join(cache_dir, "server.log") log = open(log_path, "w") null = open("/dev/null", "r") java = os.path.join(self.config['java-home'], 'bin', 'java') if not os.path.exists(java): raise InvalidJavaPathError(errno.ENOENT, 'No such file or directory', java) elif not os.access(java, os.X_OK): raise InvalidJavaPathError(errno.EACCES, 'Permission denied', java) args = ( [java, "-cp", classpath] + [a for a in java_flags if a != ""] + ["-Densime.config={}".format(self._config_path), "org.ensime.server.Server"]) process = subprocess.Popen( args, stdin=null, stdout=log, stderr=subprocess.STDOUT) pid_path = os.path.join(cache_dir, "server.pid") Util.write_file(pid_path, str(process.pid)) def on_stop(): log.close() with catch(Exception, lambda e: None): os.remove(pid_path) return EnsimeProcess(cache_dir, process, log_path, on_stop)
def generate_classpath(self, scala_version, classpath_file): project_dir = self.classpath_project_dir(scala_version) Util.mkdir_p(project_dir) Util.mkdir_p(os.path.join(project_dir, "project")) Util.write_file(os.path.join(project_dir, "build.sbt"), self.build_sbt(scala_version, classpath_file)) Util.write_file(os.path.join(project_dir, "project", "build.properties"), "sbt.version={}".format(self.sbt_version)) log_file = os.path.join(project_dir, "build.log") log = open(log_file, 'w') null = open("/dev/null", "r") # see https://github.com/ensime/ensime-vim/issues/29 on why we use this method self.vim.command("!(cd {};sbt -Dsbt.log.noformat=true -batch saveClasspath)".format(project_dir))
def _start_process(self, classpath): """Given a classpath prepared for running ENSIME, spawns a server process in a way that is otherwise agnostic to how the strategy installs ENSIME. Args: classpath (list of str): list of paths to jars or directories (Within this function the list is joined with a system dependent path separator to create a single string argument to suitable to pass to ``java -cp`` as a classpath) Returns: EnsimeProcess: A process handle for the launched server. """ cache_dir = self.config['cache-dir'] java_flags = self.config['java-flags'] Util.mkdir_p(cache_dir) log_path = os.path.join(cache_dir, "server.log") log = open(log_path, "w") null = open(os.devnull, "r") java = os.path.join(self.config['java-home'], 'bin', 'java' if os.name != 'nt' else 'java.exe') if not os.path.exists(java): raise InvalidJavaPathError(errno.ENOENT, 'No such file or directory', java) elif not os.access(java, os.X_OK): raise InvalidJavaPathError(errno.EACCES, 'Permission denied', java) args = ( [java, "-cp", (':' if os.name != 'nt' else ';').join(classpath)] + [a for a in java_flags if a] + [ "-Densime.config={}".format(self.config.filepath), "org.ensime.server.Server" ]) process = subprocess.Popen(args, stdin=null, stdout=log, stderr=subprocess.STDOUT) pid_path = os.path.join(cache_dir, "server.pid") Util.write_file(pid_path, str(process.pid)) def on_stop(): log.close() null.close() with catch(Exception): os.remove(pid_path) return EnsimeProcess(cache_dir, process, log_path, on_stop)
def _start_process(self, classpath): """Given a classpath prepared for running ENSIME, spawns a server process in a way that is otherwise agnostic to how the strategy installs ENSIME. Args: classpath (list of str): list of paths to jars or directories (Within this function the list is joined with a system dependent path separator to create a single string argument suitable to pass to ``java -cp`` as a classpath) Returns: EnsimeProcess: A process handle for the launched server. """ cache_dir = self.config['cache-dir'] java_flags = self.config['java-flags'] iswindows = os.name == 'nt' Util.mkdir_p(cache_dir) log_path = os.path.join(cache_dir, "server.log") log = open(log_path, "w") null = open(os.devnull, "r") java = os.path.join(self.config['java-home'], 'bin', 'java.exe' if iswindows else 'java') if not os.path.exists(java): raise InvalidJavaPathError(errno.ENOENT, 'No such file or directory', java) elif not os.access(java, os.X_OK): raise InvalidJavaPathError(errno.EACCES, 'Permission denied', java) args = ( [java, "-cp", (';' if iswindows else ':').join(classpath)] + [a for a in java_flags if a] + ["-Densime.config={}".format(self.config.filepath), "org.ensime.server.Server"]) process = subprocess.Popen( args, stdin=null, stdout=log, stderr=subprocess.STDOUT) pid_path = os.path.join(cache_dir, "server.pid") Util.write_file(pid_path, str(process.pid)) def on_stop(): log.close() null.close() with catch(Exception): os.remove(pid_path) return EnsimeProcess(cache_dir, process, log_path, on_stop)
def generate_classpath(self, scala_version, classpath_file): project_dir = self.classpath_project_dir(scala_version) Util.mkdir_p(project_dir) Util.mkdir_p(os.path.join(project_dir, "project")) Util.write_file( os.path.join(project_dir, "build.sbt"), self.build_sbt(scala_version, classpath_file)) Util.write_file( os.path.join(project_dir, "project", "build.properties"), "sbt.version={}".format(self.sbt_version)) # Synchronous update of the classpath via sbt # see https://github.com/ensime/ensime-vim/issues/29 cd_cmd = "cd {}".format(project_dir) sbt_cmd = "sbt -Dsbt.log.noformat=true -batch saveClasspath" inside_nvim = int(self.vim.eval("has('nvim')")) if inside_nvim: cmd = "terminal" import tempfile tmp_dir = tempfile.gettempdir() flag_file = "{}/ensime-vim-classpath.flag".format(tmp_dir) sbt_cmd += "; echo $? > {}".format(flag_file) self.vim.command("echo 'Waiting for generation of classpath...'") self.vim.command("terminal ({} && {})".format(cd_cmd, sbt_cmd)) # Block execution when sbt is run waiting_for_flag = True while waiting_for_flag: waiting_for_flag = not os.path.isfile(flag_file) if not waiting_for_flag: with open(flag_file, "r") as f: rtcode = f.readline() os.remove(flag_file) if rtcode and int(rtcode) != 0: # error self.vim.command( "echo 'Something wrong happened, check the " "execution log...'") return None else: time.sleep(0.2) else: self.vim.command("!({} && {})".format(cd_cmd, sbt_cmd)) success = self.reorder_classpath(classpath_file) if not success: self.vim.command("echo 'Classpath ordering failed.'") return True
def install(self): """Installs ENSIME server with a bootstrap sbt project and generates its classpath.""" project_dir = os.path.dirname(self.classpath_file) sbt_plugin = """addSbtPlugin("{0}" % "{1}" % "{2}")""" Util.mkdir_p(project_dir) Util.mkdir_p(os.path.join(project_dir, "project")) Util.write_file( os.path.join(project_dir, "build.sbt"), self.build_sbt()) Util.write_file( os.path.join(project_dir, "project", "build.properties"), "sbt.version={}".format(self.SBT_VERSION)) Util.write_file( os.path.join(project_dir, "project", "plugins.sbt"), sbt_plugin.format(*self.SBT_COURSIER_COORDS)) # Synchronous update of the classpath via sbt # see https://github.com/ensime/ensime-vim/issues/29 cd_cmd = "cd {}".format(project_dir) sbt_cmd = "sbt -Dsbt.log.noformat=true -batch saveClasspath" if int(self.vim.eval("has('nvim')")): import tempfile import re tmp_dir = tempfile.gettempdir() flag_file = "{}/ensime-vim-classpath.flag".format(tmp_dir) self.vim.command("echo 'Waiting for generation of classpath...'") if re.match(".+fish$", self.vim.eval("&shell")): sbt_cmd += "; echo $status > {}".format(flag_file) self.vim.command("terminal {}; and {}".format(cd_cmd, sbt_cmd)) else: sbt_cmd += "; echo $? > {}".format(flag_file) self.vim.command("terminal ({} && {})".format(cd_cmd, sbt_cmd)) # Block execution when sbt is run waiting_for_flag = True while waiting_for_flag: waiting_for_flag = not os.path.isfile(flag_file) if not waiting_for_flag: with open(flag_file, "r") as f: rtcode = f.readline() os.remove(flag_file) if rtcode and int(rtcode) != 0: # error self.vim.command( "echo 'Something wrong happened, check the " "execution log...'") return None else: time.sleep(0.2) else: self.vim.command("!({} && {})".format(cd_cmd, sbt_cmd)) success = self.reorder_classpath(self.classpath_file) if not success: self.vim.command("echo 'Classpath ordering failed.'") return True