fix(driver): avoid false agent update prompt

Fixes #638
This commit is contained in:
t8y2 2026-06-02 20:17:24 +08:00
parent 0566110eae
commit 9cb89d766c
2 changed files with 77 additions and 2 deletions

View File

@ -46,6 +46,7 @@ impl AgentProgressEvent {
pub fn build_agent_list(am: &AgentManager, registry: Option<&AgentRegistry>) -> Vec<AgentDriverInfo> {
let local_state = am.load_state();
let use_managed_jre = local_state.java_runtime.mode == JavaRuntimeMode::Managed;
agent_catalog::driver_store_entries()
.map(|(key, label)| {
let installed = am.is_driver_installed(key);
@ -56,8 +57,9 @@ pub fn build_agent_list(am: &AgentManager, registry: Option<&AgentRegistry>) ->
.or_else(|| local.map(|l| l.jre.clone()))
.unwrap_or_else(|| DEFAULT_JRE_KEY.to_string());
let remote_jre_version = registry.and_then(|r| r.resolve_jre(&jre_key)).map(|j| &j.version);
let local_jre_version = local_state.jre_versions.get(&jre_key);
let local_jre_version = installed_jre_version(&local_state, &jre_key);
let jre_update_available = installed
&& use_managed_jre
&& (!am.is_jre_installed(&jre_key)
|| remote_jre_version.is_some_and(|version| local_jre_version != Some(version)));
AgentDriverInfo {
@ -78,6 +80,13 @@ pub fn build_agent_list(am: &AgentManager, registry: Option<&AgentRegistry>) ->
.collect()
}
fn installed_jre_version<'a>(state: &'a crate::agent_manager::AgentState, jre_key: &str) -> Option<&'a String> {
state
.jre_versions
.get(jre_key)
.or_else(|| (jre_key == DEFAULT_JRE_KEY).then_some(state.jre_version.as_ref()).flatten())
}
pub fn jre_needs_install(am: &AgentManager, registry: &AgentRegistry, jre_key: &str) -> bool {
let state = am.load_state();
if state.java_runtime.mode != JavaRuntimeMode::Managed {

View File

@ -1,5 +1,6 @@
use dbx_core::agent_manager::{
AgentManager, AgentRegistry, ArtifactInfo, DriverInfo, InstalledDriver, JreInfo, DEFAULT_JRE_KEY,
AgentManager, AgentRegistry, ArtifactInfo, DriverInfo, InstalledDriver, JavaRuntimeConfig, JavaRuntimeMode,
JreInfo, DEFAULT_JRE_KEY,
};
use dbx_core::agent_service::{
build_agent_list, github_url_to_r2_path, import_agent_jar, import_agents_from_zip, is_app_version_compatible,
@ -113,6 +114,71 @@ fn agent_list_marks_update_when_installed_managed_jre_version_differs() {
assert!(h2.update_available);
}
#[test]
fn agent_list_does_not_mark_jre_update_for_system_java_runtime() {
let manager = test_manager("system-java-no-jre-update");
let jar_path = manager.driver_jar_path("dameng");
std::fs::create_dir_all(jar_path.parent().unwrap()).unwrap();
std::fs::write(&jar_path, b"jar").unwrap();
manager
.save_state(&dbx_core::agent_manager::AgentState {
java_runtime: JavaRuntimeConfig { mode: JavaRuntimeMode::System, custom_java_path: None },
installed_drivers: [(
"dameng".to_string(),
InstalledDriver {
version: "0.2.0".to_string(),
installed_at: "2026-05-18T00:00:00Z".to_string(),
jre: DEFAULT_JRE_KEY.to_string(),
},
)]
.into_iter()
.collect(),
..Default::default()
})
.unwrap();
let registry = registry_with_jre_driver("dameng", "0.2.0", DEFAULT_JRE_KEY, "21.0.11");
let agents = build_agent_list(&manager, Some(&registry));
let dameng = agents.iter().find(|agent| agent.db_type == "dameng").unwrap();
assert!(dameng.installed);
assert!(!dameng.jre_installed);
assert!(!dameng.update_available);
}
#[test]
fn agent_list_uses_legacy_default_jre_version_when_checking_updates() {
let manager = test_manager("legacy-jre-version");
let jar_path = manager.driver_jar_path("dameng");
let java_path = manager.jre_java_path(DEFAULT_JRE_KEY);
std::fs::create_dir_all(jar_path.parent().unwrap()).unwrap();
std::fs::create_dir_all(java_path.parent().unwrap()).unwrap();
std::fs::write(&jar_path, b"jar").unwrap();
std::fs::write(&java_path, b"java").unwrap();
manager
.save_state(&dbx_core::agent_manager::AgentState {
jre_version: Some("21.0.11".to_string()),
installed_drivers: [(
"dameng".to_string(),
InstalledDriver {
version: "0.2.0".to_string(),
installed_at: "2026-05-18T00:00:00Z".to_string(),
jre: DEFAULT_JRE_KEY.to_string(),
},
)]
.into_iter()
.collect(),
..Default::default()
})
.unwrap();
let registry = registry_with_jre_driver("dameng", "0.2.0", DEFAULT_JRE_KEY, "21.0.11");
let agents = build_agent_list(&manager, Some(&registry));
let dameng = agents.iter().find(|agent| agent.db_type == "dameng").unwrap();
assert!(!dameng.update_available);
}
#[test]
fn jre_needs_install_when_managed_runtime_version_differs() {
let manager = test_manager("jre-needs-install");