From 8c54806abe42dccdc41884b65db66c66a637d5b6 Mon Sep 17 00:00:00 2001 From: Dominik Jain Date: Fri, 13 Feb 2026 03:10:25 +0100 Subject: [PATCH] Marksman: Use DependencyProvider, fixing run command not working with spaces in path --- src/solidlsp/language_servers/marksman.py | 125 +++++++++++----------- 1 file changed, 64 insertions(+), 61 deletions(-) diff --git a/src/solidlsp/language_servers/marksman.py b/src/solidlsp/language_servers/marksman.py index 97c840e2..14805f21 100644 --- a/src/solidlsp/language_servers/marksman.py +++ b/src/solidlsp/language_servers/marksman.py @@ -9,10 +9,9 @@ import pathlib from overrides import override -from solidlsp.ls import SolidLanguageServer +from solidlsp.ls import LanguageServerDependencyProvider, LanguageServerDependencyProviderSinglePath, SolidLanguageServer from solidlsp.ls_config import LanguageServerConfig from solidlsp.lsp_protocol_handler.lsp_types import InitializeParams -from solidlsp.lsp_protocol_handler.server import ProcessLaunchInfo from solidlsp.settings import SolidLSPSettings from .common import RuntimeDependency, RuntimeDependencyCollection @@ -25,80 +24,84 @@ class Marksman(SolidLanguageServer): Provides Markdown specific instantiation of the LanguageServer class using marksman. """ - marksman_releases = "https://github.com/artempyanykh/marksman/releases/download/2024-12-18" - runtime_dependencies = RuntimeDependencyCollection( - [ - RuntimeDependency( - id="marksman", - url=f"{marksman_releases}/marksman-linux-x64", - platform_id="linux-x64", - archive_type="binary", - binary_name="marksman", - ), - RuntimeDependency( - id="marksman", - url=f"{marksman_releases}/marksman-linux-arm64", - platform_id="linux-arm64", - archive_type="binary", - binary_name="marksman", - ), - RuntimeDependency( - id="marksman", - url=f"{marksman_releases}/marksman-macos", - platform_id="osx-x64", - archive_type="binary", - binary_name="marksman", - ), - RuntimeDependency( - id="marksman", - url=f"{marksman_releases}/marksman-macos", - platform_id="osx-arm64", - archive_type="binary", - binary_name="marksman", - ), - RuntimeDependency( - id="marksman", - url=f"{marksman_releases}/marksman.exe", - platform_id="win-x64", - archive_type="binary", - binary_name="marksman.exe", - ), - ] - ) + class DependencyProvider(LanguageServerDependencyProviderSinglePath): + marksman_releases = "https://github.com/artempyanykh/marksman/releases/download/2024-12-18" + runtime_dependencies = RuntimeDependencyCollection( + [ + RuntimeDependency( + id="marksman", + url=f"{marksman_releases}/marksman-linux-x64", + platform_id="linux-x64", + archive_type="binary", + binary_name="marksman", + ), + RuntimeDependency( + id="marksman", + url=f"{marksman_releases}/marksman-linux-arm64", + platform_id="linux-arm64", + archive_type="binary", + binary_name="marksman", + ), + RuntimeDependency( + id="marksman", + url=f"{marksman_releases}/marksman-macos", + platform_id="osx-x64", + archive_type="binary", + binary_name="marksman", + ), + RuntimeDependency( + id="marksman", + url=f"{marksman_releases}/marksman-macos", + platform_id="osx-arm64", + archive_type="binary", + binary_name="marksman", + ), + RuntimeDependency( + id="marksman", + url=f"{marksman_releases}/marksman.exe", + platform_id="win-x64", + archive_type="binary", + binary_name="marksman.exe", + ), + ] + ) - @classmethod - def _setup_runtime_dependencies(cls, config: LanguageServerConfig, solidlsp_settings: SolidLSPSettings) -> str: - """Setup runtime dependencies for marksman and return the command to start the server.""" - deps = cls.runtime_dependencies - dependency = deps.get_single_dep_for_current_platform() + def _get_or_install_core_dependency(self) -> str: + """Setup runtime dependencies for marksman and return the command to start the server.""" + deps = self.runtime_dependencies + dependency = deps.get_single_dep_for_current_platform() - marksman_ls_dir = cls.ls_resources_dir(solidlsp_settings) - marksman_executable_path = deps.binary_path(marksman_ls_dir) - if not os.path.exists(marksman_executable_path): - log.info( - f"Downloading marksman from {dependency.url} to {marksman_ls_dir}", - ) - deps.install(marksman_ls_dir) - if not os.path.exists(marksman_executable_path): - raise FileNotFoundError(f"Download failed? Could not find marksman executable at {marksman_executable_path}") - os.chmod(marksman_executable_path, 0o755) - return marksman_executable_path + marksman_ls_dir = self._ls_resources_dir + marksman_executable_path = deps.binary_path(marksman_ls_dir) + if not os.path.exists(marksman_executable_path): + log.info( + f"Downloading marksman from {dependency.url} to {marksman_ls_dir}", + ) + deps.install(marksman_ls_dir) + if not os.path.exists(marksman_executable_path): + raise FileNotFoundError(f"Download failed? Could not find marksman executable at {marksman_executable_path}") + os.chmod(marksman_executable_path, 0o755) + return marksman_executable_path + + def _create_launch_command(self, core_path: str) -> list[str]: + return [core_path, "server"] def __init__(self, config: LanguageServerConfig, repository_root_path: str, solidlsp_settings: SolidLSPSettings): """ Creates a Marksman instance. This class is not meant to be instantiated directly. Use LanguageServer.create() instead. """ - marksman_executable_path = self._setup_runtime_dependencies(config, solidlsp_settings) - super().__init__( config, repository_root_path, - ProcessLaunchInfo(cmd=f"{marksman_executable_path} server", cwd=repository_root_path), + None, "markdown", solidlsp_settings, ) + def _create_dependency_provider(self) -> LanguageServerDependencyProvider: + return self.DependencyProvider(self._custom_settings, self._ls_resources_dir) + @override def is_ignored_dirname(self, dirname: str) -> bool: return super().is_ignored_dirname(dirname) or dirname in ["node_modules", ".obsidian", ".vitepress", ".vuepress"]