From 38f4682dba8948be7ef08758bbd2a8cbce84b008 Mon Sep 17 00:00:00 2001 From: AskaEth Date: Fri, 6 Nov 2026 23:08:01 +0800 Subject: [PATCH] =?UTF-8?q?fix(java):=20Termux=20=E5=B9=82=E7=AD=89?= =?UTF-8?q?=E5=AE=89=E8=A3=85=E6=8A=A5=E3=80=8C=E6=9C=AA=E8=B5=B0=E7=BD=91?= =?UTF-8?q?=E7=BB=9C=E3=80=8D=EF=BC=8Cvendors=20=E5=9C=A8=20Termux=20?= =?UTF-8?q?=E4=B8=8A=E5=B1=95=E7=A4=BA=20termux=20=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - termux::install 返回 (home, reused),复用时 downloaded=None, CLI 不再显示「0 字节 / 0 个文件」 - java vendors 在 Termux 上把 termux 插到顺序最前(仅展示,默认回退序不变) --- crates/cli/src/commands/java_vendors.rs | 6 +++++- crates/core/src/game/java/install.rs | 8 ++++++-- crates/core/src/game/java/termux.rs | 8 ++++++-- crates/core/src/platform/termux.rs | 8 ++++---- 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/crates/cli/src/commands/java_vendors.rs b/crates/cli/src/commands/java_vendors.rs index e3972eb..82bbec9 100644 --- a/crates/cli/src/commands/java_vendors.rs +++ b/crates/cli/src/commands/java_vendors.rs @@ -23,7 +23,11 @@ use crate::output::Report; pub fn vendors(ctx: &Ctx) -> Result { let settings = JavaSettings::load(ctx); let domestic = region_profile(ctx).is_domestic(); - let order = vendor::order(&settings.priority, domestic); + let mut order = vendor::order(&settings.priority, domestic); + // Termux 上系统包是一条真实可用的发行版:不进默认回退序,但展示时要让人看见。 + if termux::available() && !order.contains(&JdkVendor::Termux) { + order.insert(0, JdkVendor::Termux); + } let table = MirrorTable::builtin(); let rows: Vec = order .iter() diff --git a/crates/core/src/game/java/install.rs b/crates/core/src/game/java/install.rs index fb490d2..9201d85 100644 --- a/crates/core/src/game/java/install.rs +++ b/crates/core/src/game/java/install.rs @@ -206,7 +206,7 @@ pub async fn install( ); } match super::termux::install(request.major).await { - Ok(home) => { + Ok((home, reused)) => { let mut runtime = probe::probe(&extract::java_binary(&home), JavaOrigin::Managed); runtime.vendor = Some(JdkVendor::Termux.id().to_string()); let version = runtime @@ -235,7 +235,11 @@ pub async fn install( mode: location.mode, archive: PathBuf::new(), runtime, - downloaded: Some("termux".to_string()), + downloaded: if reused { + None + } else { + Some("termux".to_string()) + }, bytes: 0, files: 0, extracted: false, diff --git a/crates/core/src/game/java/termux.rs b/crates/core/src/game/java/termux.rs index b808e00..d80fab8 100644 --- a/crates/core/src/game/java/termux.rs +++ b/crates/core/src/game/java/termux.rs @@ -69,7 +69,10 @@ pub fn sources_line(mirror: &str) -> String { /// # Errors /// /// 当前不在 Termux、主源没有该大版本、所有镜像都失败、装完仍找不到 `bin/java` 时返回错误。 -pub async fn install(major: u32) -> Result { +/// +/// 返回 `(JDK 根, 是否复用了已装)`:包管理器刚装完与「本来就有」对调用方是两种结果 +/// (一个要报安装,一个要报「未走网络」)。 +pub async fn install(major: u32) -> Result<(PathBuf, bool), JavaError> { let Some(package) = package_for(major) else { return Err(JavaError::new( JavaErrorKind::Unsupported, @@ -86,7 +89,7 @@ pub async fn install(major: u32) -> Result { // 幂等:已经装了同一大版本就不碰网络。 if let Some(home) = installed_home(&prefix, major) { - return Ok(home); + return Ok((home, true)); } let workspace = workspace_dir(&prefix, major); @@ -109,6 +112,7 @@ pub async fn install(major: u32) -> Result { format!("Termux 安装任务没能完成:{error}"), ) })? + .map(|home| (home, false)) } /// 逐镜像尝试 `apt-get`(阻塞,跑在 `spawn_blocking` 里)。 diff --git a/crates/core/src/platform/termux.rs b/crates/core/src/platform/termux.rs index 99ea5ef..71095ce 100644 --- a/crates/core/src/platform/termux.rs +++ b/crates/core/src/platform/termux.rs @@ -30,10 +30,10 @@ pub fn prefix(env: &dyn EnvSource) -> Option { if !is_termux(env) { return None; } - Some(env.var("PREFIX").map_or_else( - || PathBuf::from(DEFAULT_PREFIX), - PathBuf::from, - )) + Some( + env.var("PREFIX") + .map_or_else(|| PathBuf::from(DEFAULT_PREFIX), PathBuf::from), + ) } /// Termux 的 JDK 安装根(`$PREFIX/lib/jvm`)。