docs: tambah doc comment, logging, dan inline comments di semua 255 file
Meliputi: - File-level //! doc comment: tujuan file, alur kerja, komponen utama - Function-level /// doc comment: apa, parameter, return, flow, edge cases - Struct/enum/trait /// doc comment: peran, field docs - Tracing logging (tracing::info!/debug!/trace!/warn!/error!) di setiap fungsi - Inline comments untuk variable dan branching logic penting - Seluruh 8 crates di workspace: zesdex-backend, zesdex-cms, zesdex-entities, zesdex-iam, zesdex-infra, zesdex-ipc, zesdex-middleware, zesdex-utils - Build: 0 errors, 242/242 tests passed
This commit is contained in:
@@ -3,30 +3,43 @@
|
||||
//!
|
||||
//! Each helper downloads a prebuilt binary (or archive) and places it
|
||||
//! under `~/.local/share/zesdex/lsp/<server-name>/`.
|
||||
//!
|
||||
//! Flow: `run_download_tier` dispatches sentinel command names to the
|
||||
//! appropriate installer (`install_rust_analyzer_binary` or
|
||||
//! `install_jdtls_from_eclipse`). Each installer downloads, extracts,
|
||||
//! and sets executable permissions on the binary.
|
||||
|
||||
use std::path::{Path, PathBuf};
|
||||
|
||||
use tracing::info;
|
||||
use tracing::{debug, info};
|
||||
|
||||
use super::config::{ProgressFn, DOWNLOAD_JDTLS, DOWNLOAD_RUST_BIN};
|
||||
use super::discovery::EnvInfo;
|
||||
use super::manager::run_command;
|
||||
|
||||
/// Resolve the directory where downloaded LSP binaries are stored.
|
||||
///
|
||||
/// Returns `~/.local/share/zesdex/lsp/<server>/` (using `dirs::data_dir`).
|
||||
fn lsp_install_dir(server: &str) -> Result<PathBuf, String> {
|
||||
let base = dirs::data_dir()
|
||||
.ok_or_else(|| "cannot find data directory via dirs crate".to_string())?
|
||||
.join("zesdex")
|
||||
.join("lsp")
|
||||
.join(server);
|
||||
debug!(server = server, path = %base.display(), "LSP install dir");
|
||||
Ok(base)
|
||||
}
|
||||
|
||||
/// Check whether `def` was previously installed via the download tier
|
||||
/// (binary/launcher lives under `~/.local/share/zesdex/lsp/<name>/`).
|
||||
///
|
||||
/// Flow: resolve install dir → iterate known binary name patterns under
|
||||
/// that dir → return the first existing file path.
|
||||
///
|
||||
/// Returns the path to the binary if found.
|
||||
pub(super) fn previous_download_install(def: &super::config::LanguageServerDef) -> Option<PathBuf> {
|
||||
let base = lsp_install_dir(&def.name).ok()?;
|
||||
// Candidate relative paths under the install directory for each server.
|
||||
let candidates: &[&str] = match def.name.as_str() {
|
||||
"rust-analyzer" => &["rust-analyzer"],
|
||||
"jdtls" => &["bin/jdtls", "jdtls-launcher.sh", "jdtls"],
|
||||
@@ -39,17 +52,24 @@ pub(super) fn previous_download_install(def: &super::config::LanguageServerDef)
|
||||
if p.exists() {
|
||||
// Skip directory entries that exist but are the base dir itself.
|
||||
if p.is_file() {
|
||||
debug!(name = %def.name, path = %p.display(), "found previous install");
|
||||
return Some(p);
|
||||
}
|
||||
}
|
||||
}
|
||||
debug!(name = %def.name, "no previous install found");
|
||||
None
|
||||
}
|
||||
|
||||
/// Download a file from `url` to `dest` using curl.
|
||||
///
|
||||
/// Flow: build curl args with connect-timeout (15 s) and max-time
|
||||
/// (`max_secs`) → delegate to `run_command` → return error on failure.
|
||||
fn download_url(url: &str, dest: &Path, max_secs: u64) -> Result<(), String> {
|
||||
let path_str = dest.to_str().ok_or("invalid dest path")?.to_string();
|
||||
info!(url = url, dest = %path_str, "downloading");
|
||||
info!(url = url, dest = %path_str, max_secs = max_secs, "downloading file");
|
||||
// curl flags: -f (fail on HTTP error), -sS (silent but show errors),
|
||||
// -L (follow redirects), --connect-timeout, --max-time, -o (output).
|
||||
let args = [
|
||||
"-fsSL",
|
||||
"--connect-timeout",
|
||||
@@ -64,11 +84,15 @@ fn download_url(url: &str, dest: &Path, max_secs: u64) -> Result<(), String> {
|
||||
if !ok {
|
||||
return Err(format!("download failed: {}", out.trim()));
|
||||
}
|
||||
info!(url = url, "download complete");
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Download rust-analyzer from GitHub releases and install into
|
||||
/// `~/.local/share/zesdex/lsp/rust-analyzer/bin/rust-analyzer`.
|
||||
/// `~/.local/share/zesdex/lsp/rust-analyzer/rust-analyzer`.
|
||||
///
|
||||
/// Flow: create install dir → pick platform URL → download gzipped binary →
|
||||
/// decompress with gunzip → set executable permissions → return binary path.
|
||||
fn install_rust_analyzer_binary(
|
||||
env: &EnvInfo,
|
||||
progress: ProgressFn<'_>,
|
||||
@@ -76,6 +100,7 @@ fn install_rust_analyzer_binary(
|
||||
let base = lsp_install_dir("rust-analyzer")?;
|
||||
std::fs::create_dir_all(&base).map_err(|e| format!("mkdir: {e}"))?;
|
||||
|
||||
// GitHub release URLs for the latest rust-analyzer prebuilt binary.
|
||||
let url = if env.is_linux {
|
||||
"https://github.com/rust-lang/rust-analyzer/releases/latest/download/rust-analyzer-x86_64-unknown-linux-gnu.gz"
|
||||
} else if env.is_macos {
|
||||
@@ -84,9 +109,10 @@ fn install_rust_analyzer_binary(
|
||||
return Err("no prebuilt binary for this OS".to_string());
|
||||
};
|
||||
|
||||
let gz = base.join("rust-analyzer.gz");
|
||||
let target = base.join("rust-analyzer");
|
||||
let gz = base.join("rust-analyzer.gz"); // downloaded archive
|
||||
let target = base.join("rust-analyzer"); // final binary path
|
||||
|
||||
info!("rust-analyzer: downloading prebuilt binary");
|
||||
if let Some(cb) = progress {
|
||||
cb("Rust: downloading prebuilt binary...");
|
||||
}
|
||||
@@ -103,6 +129,7 @@ fn install_rust_analyzer_binary(
|
||||
if !target.exists() {
|
||||
return Err("binary missing after decompression".to_string());
|
||||
}
|
||||
// Set executable bit on Unix (0o755 = rwxr-xr-x).
|
||||
#[cfg(unix)]
|
||||
{
|
||||
use std::os::unix::fs::PermissionsExt;
|
||||
@@ -112,17 +139,24 @@ fn install_rust_analyzer_binary(
|
||||
if let Some(cb) = progress {
|
||||
cb("Rust: installed ✓");
|
||||
}
|
||||
info!("rust-analyzer: installed at {}", target.display());
|
||||
Ok(target)
|
||||
}
|
||||
|
||||
/// Download Eclipse JDT-LS from the official snapshot server, extract it,
|
||||
/// and create a launcher script at `bin/jdtls`.
|
||||
///
|
||||
/// Flow: create install dir → download ~150 MB tarball → extract with tar →
|
||||
/// verify `plugins/` exists → write a bash launcher script that resolves
|
||||
/// the JDT-LS launcher JAR and config → set launcher executable.
|
||||
fn install_jdtls_from_eclipse(progress: ProgressFn) -> Result<PathBuf, String> {
|
||||
let base = lsp_install_dir("jdtls")?;
|
||||
std::fs::create_dir_all(&base).map_err(|e| format!("mkdir: {e}"))?;
|
||||
|
||||
let url = "https://download.eclipse.org/jdtls/snapshots/jdt-language-server-latest.tar.gz";
|
||||
let tarball = base.join("jdtls.tar.gz");
|
||||
|
||||
info!("jdtls: downloading (~150 MB)");
|
||||
if let Some(cb) = progress {
|
||||
cb("Java: downloading JDT-LS (~150MB)...");
|
||||
}
|
||||
@@ -146,6 +180,7 @@ fn install_jdtls_from_eclipse(progress: ProgressFn) -> Result<PathBuf, String> {
|
||||
}
|
||||
let _ = std::fs::remove_file(&tarball);
|
||||
|
||||
// Validate that the extracted contents include the plugins directory.
|
||||
if !base.join("plugins").exists() {
|
||||
return Err("extracted archive missing plugins/ directory".to_string());
|
||||
}
|
||||
@@ -182,15 +217,20 @@ exec java \
|
||||
if let Some(cb) = progress {
|
||||
cb("Java: JDT-LS installed ✓");
|
||||
}
|
||||
info!("jdtls: installed at {}", launcher.display());
|
||||
Ok(launcher)
|
||||
}
|
||||
|
||||
/// Dispatch a sentinel download tier to the correct helper.
|
||||
///
|
||||
/// Matches sentinel constants (`DOWNLOAD_RUST_BIN`, `DOWNLOAD_JDTLS`) and
|
||||
/// routes to the appropriate platform-aware installer.
|
||||
pub(super) fn run_download_tier(
|
||||
name: &str,
|
||||
env: &EnvInfo,
|
||||
progress: ProgressFn<'_>,
|
||||
) -> Result<PathBuf, String> {
|
||||
info!(tier = name, "running download tier");
|
||||
match name {
|
||||
DOWNLOAD_RUST_BIN => install_rust_analyzer_binary(env, progress),
|
||||
DOWNLOAD_JDTLS => install_jdtls_from_eclipse(progress),
|
||||
|
||||
Reference in New Issue
Block a user