fix(java): Termux 幂等安装报「未走网络」,vendors 在 Termux 上展示 termux 行

- termux::install 返回 (home, reused),复用时 downloaded=None,
  CLI 不再显示「0 字节 / 0 个文件」
- java vendors 在 Termux 上把 termux 插到顺序最前(仅展示,默认回退序不变)
This commit is contained in:
AskaEth committed 2026-11-07 09:33:20 +08:00
1 parent 48d1ee6616
commit 7b971dc75d
4 files changed
+21 -9

No files matched your search

+5 -1
View File
@@ -23,7 +23,11 @@ use crate::output::Report;
pub fn vendors(ctx: &Ctx) -> Result<Report, CliError> { pub fn vendors(ctx: &Ctx) -> Result<Report, CliError> {
let settings = JavaSettings::load(ctx); let settings = JavaSettings::load(ctx);
let domestic = region_profile(ctx).is_domestic(); 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 table = MirrorTable::builtin();
let rows: Vec<Value> = order let rows: Vec<Value> = order
.iter() .iter()
+6 -2
View File
@@ -206,7 +206,7 @@ pub async fn install(
); );
} }
match super::termux::install(request.major).await { match super::termux::install(request.major).await {
Ok(home) => { Ok((home, reused)) => {
let mut runtime = probe::probe(&extract::java_binary(&home), JavaOrigin::Managed); let mut runtime = probe::probe(&extract::java_binary(&home), JavaOrigin::Managed);
runtime.vendor = Some(JdkVendor::Termux.id().to_string()); runtime.vendor = Some(JdkVendor::Termux.id().to_string());
let version = runtime let version = runtime
@@ -235,7 +235,11 @@ pub async fn install(
mode: location.mode, mode: location.mode,
archive: PathBuf::new(), archive: PathBuf::new(),
runtime, runtime,
downloaded: Some("termux".to_string()), downloaded: if reused {
None
} else {
Some("termux".to_string())
},
bytes: 0, bytes: 0,
files: 0, files: 0,
extracted: false, extracted: false,
+6 -2
View File
@@ -69,7 +69,10 @@ pub fn sources_line(mirror: &str) -> String {
/// # Errors /// # Errors
/// ///
/// 当前不在 Termux、主源没有该大版本、所有镜像都失败、装完仍找不到 `bin/java` 时返回错误。 /// 当前不在 Termux、主源没有该大版本、所有镜像都失败、装完仍找不到 `bin/java` 时返回错误。
pub async fn install(major: u32) -> Result<PathBuf, JavaError> { ///
/// 返回 `(JDK 根, 是否复用了已装)`:包管理器刚装完与「本来就有」对调用方是两种结果
/// (一个要报安装,一个要报「未走网络」)。
pub async fn install(major: u32) -> Result<(PathBuf, bool), JavaError> {
let Some(package) = package_for(major) else { let Some(package) = package_for(major) else {
return Err(JavaError::new( return Err(JavaError::new(
JavaErrorKind::Unsupported, JavaErrorKind::Unsupported,
@@ -86,7 +89,7 @@ pub async fn install(major: u32) -> Result<PathBuf, JavaError> {
// 幂等:已经装了同一大版本就不碰网络。 // 幂等:已经装了同一大版本就不碰网络。
if let Some(home) = installed_home(&prefix, major) { if let Some(home) = installed_home(&prefix, major) {
return Ok(home); return Ok((home, true));
} }
let workspace = workspace_dir(&prefix, major); let workspace = workspace_dir(&prefix, major);
@@ -109,6 +112,7 @@ pub async fn install(major: u32) -> Result<PathBuf, JavaError> {
format!("Termux 安装任务没能完成:{error}"), format!("Termux 安装任务没能完成:{error}"),
) )
})? })?
.map(|home| (home, false))
} }
/// 逐镜像尝试 `apt-get`(阻塞,跑在 `spawn_blocking` 里)。 /// 逐镜像尝试 `apt-get`(阻塞,跑在 `spawn_blocking` 里)。
+4 -4
View File
@@ -30,10 +30,10 @@ pub fn prefix(env: &dyn EnvSource) -> Option<PathBuf> {
if !is_termux(env) { if !is_termux(env) {
return None; return None;
} }
Some(env.var("PREFIX").map_or_else( Some(
|| PathBuf::from(DEFAULT_PREFIX), env.var("PREFIX")
PathBuf::from, .map_or_else(|| PathBuf::from(DEFAULT_PREFIX), PathBuf::from),
)) )
} }
/// Termux 的 JDK 安装根(`$PREFIX/lib/jvm`)。 /// Termux 的 JDK 安装根(`$PREFIX/lib/jvm`)。