Skip to content

Commit 49cecf8

Browse files
Fix java installs (#1123)
* Fix java installs * Finish java installs
1 parent 2877919 commit 49cecf8

File tree

12 files changed

+104
-305
lines changed

12 files changed

+104
-305
lines changed

theseus/src/api/jre.rs

Lines changed: 17 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -10,64 +10,32 @@ use crate::util::fetch::{fetch_advanced, fetch_json};
1010
use crate::util::io;
1111
use crate::util::jre::extract_java_majorminor_version;
1212
use crate::{
13-
state::JavaGlobals,
1413
util::jre::{self, JavaVersion},
1514
LoadingBarType, State,
1615
};
1716

18-
pub const JAVA_8_KEY: &str = "JAVA_8";
19-
pub const JAVA_17_KEY: &str = "JAVA_17";
20-
pub const JAVA_18PLUS_KEY: &str = "JAVA_18PLUS";
21-
22-
// Autodetect JavaSettings default
23-
// Using the supplied JavaVersions, autodetects the default JavaSettings
24-
// Make a guess for what the default Java global settings should be
25-
// Since the JRE paths are passed in as args, this handles the logic for selection. Currently this just pops the last one found
26-
// TODO: When tauri compiler issue is fixed, this can be be improved (ie: getting JREs in-function)
27-
pub async fn autodetect_java_globals(
28-
mut java_8: Vec<JavaVersion>,
29-
mut java_17: Vec<JavaVersion>,
30-
mut java_18plus: Vec<JavaVersion>,
31-
) -> crate::Result<JavaGlobals> {
32-
// Simply select last one found for initial guess
33-
let mut java_globals = JavaGlobals::new();
34-
if let Some(jre) = java_8.pop() {
35-
java_globals.insert(JAVA_8_KEY.to_string(), jre);
36-
}
37-
if let Some(jre) = java_17.pop() {
38-
java_globals.insert(JAVA_17_KEY.to_string(), jre);
39-
}
40-
if let Some(jre) = java_18plus.pop() {
41-
java_globals.insert(JAVA_18PLUS_KEY.to_string(), jre);
42-
}
43-
44-
Ok(java_globals)
45-
}
46-
4717
// Searches for jres on the system given a java version (ex: 1.8, 1.17, 1.18)
4818
// Allow higher allows for versions higher than the given version to be returned ('at least')
4919
pub async fn find_filtered_jres(
50-
version: &str,
51-
jres: Vec<JavaVersion>,
52-
allow_higher: bool,
20+
java_version: Option<u32>,
5321
) -> crate::Result<Vec<JavaVersion>> {
54-
let version = extract_java_majorminor_version(version)?;
22+
let jres = jre::get_all_jre().await?;
23+
5524
// Filter out JREs that are not 1.17 or higher
56-
Ok(jres
57-
.into_iter()
58-
.filter(|jre| {
59-
let jre_version = extract_java_majorminor_version(&jre.version);
60-
if let Ok(jre_version) = jre_version {
61-
if allow_higher {
62-
jre_version >= version
25+
Ok(if let Some(java_version) = java_version {
26+
jres.into_iter()
27+
.filter(|jre| {
28+
let jre_version = extract_java_majorminor_version(&jre.version);
29+
if let Ok(jre_version) = jre_version {
30+
jre_version.1 == java_version
6331
} else {
64-
jre_version == version
32+
false
6533
}
66-
} else {
67-
false
68-
}
69-
})
70-
.collect())
34+
})
35+
.collect()
36+
} else {
37+
jres
38+
})
7139
}
7240

7341
#[theseus_macros::debug_pin]
@@ -176,17 +144,6 @@ pub async fn auto_install_java(java_version: u32) -> crate::Result<PathBuf> {
176144
}
177145
}
178146

179-
// Get all JREs that exist on the system
180-
pub async fn get_all_jre() -> crate::Result<Vec<JavaVersion>> {
181-
Ok(jre::get_all_jre().await?)
182-
}
183-
184-
pub async fn validate_globals() -> crate::Result<bool> {
185-
let state = State::get().await?;
186-
let settings = state.settings.read().await;
187-
Ok(settings.java_globals.is_all_valid().await)
188-
}
189-
190147
// Validates JRE at a given at a given path
191148
pub async fn check_jre(path: PathBuf) -> crate::Result<Option<JavaVersion>> {
192149
Ok(jre::check_java_at_filepath(&path).await)
@@ -196,14 +153,13 @@ pub async fn check_jre(path: PathBuf) -> crate::Result<Option<JavaVersion>> {
196153
pub async fn test_jre(
197154
path: PathBuf,
198155
major_version: u32,
199-
minor_version: u32,
200156
) -> crate::Result<bool> {
201157
let jre = match jre::check_java_at_filepath(&path).await {
202158
Some(jre) => jre,
203159
None => return Ok(false),
204160
};
205-
let (major, minor) = extract_java_majorminor_version(&jre.version)?;
206-
Ok(major == major_version && minor == minor_version)
161+
let (major, _) = extract_java_majorminor_version(&jre.version)?;
162+
Ok(major == major_version)
207163
}
208164

209165
// Gets maximum memory in KiB.

theseus/src/launcher/mod.rs

Lines changed: 42 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
//! Logic for launching Minecraft
22
use crate::event::emit::{emit_loading, init_or_edit_loading};
33
use crate::event::{LoadingBarId, LoadingBarType};
4-
use crate::jre::{self, JAVA_17_KEY, JAVA_18PLUS_KEY, JAVA_8_KEY};
54
use crate::launcher::io::IOError;
65
use crate::prelude::JavaVersion;
76
use crate::state::{Credentials, ProfileInstallStage};
@@ -118,24 +117,17 @@ pub async fn get_java_version_from_profile(
118117
if let Some(java) = profile.java.clone().and_then(|x| x.override_version) {
119118
Ok(Some(java))
120119
} else {
121-
let optimal_keys = match version_info
120+
let key = version_info
122121
.java_version
123122
.as_ref()
124123
.map(|it| it.major_version)
125-
.unwrap_or(8)
126-
{
127-
0..=15 => vec![JAVA_8_KEY, JAVA_17_KEY, JAVA_18PLUS_KEY],
128-
16..=17 => vec![JAVA_17_KEY, JAVA_18PLUS_KEY],
129-
_ => vec![JAVA_18PLUS_KEY],
130-
};
124+
.unwrap_or(8);
131125

132126
let state = State::get().await?;
133127
let settings = state.settings.read().await;
134128

135-
for key in optimal_keys {
136-
if let Some(java) = settings.java_globals.get(&key.to_string()) {
137-
return Ok(Some(java.clone()));
138-
}
129+
if let Some(java) = settings.java_globals.get(&format!("JAVA_{key}")) {
130+
return Ok(Some(java.clone()));
139131
}
140132

141133
Ok(None)
@@ -215,24 +207,43 @@ pub async fn install_minecraft(
215207
)
216208
.await?;
217209

218-
let java_version = get_java_version_from_profile(profile, &version_info)
219-
.await?
220-
.ok_or_else(|| {
221-
crate::ErrorKind::OtherError(
222-
"Missing correct java installation".to_string(),
223-
)
224-
})?;
210+
// TODO: check if java exists, if not install it add to install step
211+
212+
let key = version_info
213+
.java_version
214+
.as_ref()
215+
.map(|it| it.major_version)
216+
.unwrap_or(8);
217+
let (java_version, set_java) = if let Some(java_version) =
218+
get_java_version_from_profile(profile, &version_info).await?
219+
{
220+
(std::path::PathBuf::from(java_version.path), false)
221+
} else {
222+
let path = crate::api::jre::auto_install_java(key).await?;
223+
224+
(path, true)
225+
};
225226

226227
// Test jre version
227-
let java_version = jre::check_jre(java_version.path.clone().into())
228+
let java_version = crate::api::jre::check_jre(java_version.clone())
228229
.await?
229230
.ok_or_else(|| {
230231
crate::ErrorKind::LauncherError(format!(
231-
"Java path invalid or non-functional: {}",
232-
java_version.path
232+
"Java path invalid or non-functional: {:?}",
233+
java_version
233234
))
234235
})?;
235236

237+
if set_java {
238+
{
239+
let mut settings = state.settings.write().await;
240+
settings
241+
.java_globals
242+
.insert(format!("JAVA_{key}"), java_version.clone());
243+
}
244+
State::sync().await?;
245+
}
246+
236247
// Download minecraft (5-90)
237248
download::download_minecraft(
238249
&state,
@@ -434,14 +445,15 @@ pub async fn launch_minecraft(
434445
})?;
435446

436447
// Test jre version
437-
let java_version = jre::check_jre(java_version.path.clone().into())
438-
.await?
439-
.ok_or_else(|| {
440-
crate::ErrorKind::LauncherError(format!(
441-
"Java path invalid or non-functional: {}",
442-
java_version.path
443-
))
444-
})?;
448+
let java_version =
449+
crate::api::jre::check_jre(java_version.path.clone().into())
450+
.await?
451+
.ok_or_else(|| {
452+
crate::ErrorKind::LauncherError(format!(
453+
"Java path invalid or non-functional: {}",
454+
java_version.path
455+
))
456+
})?;
445457

446458
let client_path = state
447459
.directories

theseus/src/state/mod.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -244,10 +244,9 @@ impl State {
244244
let res2 = Tags::update();
245245
let res3 = Metadata::update();
246246
let res4 = Profiles::update_projects();
247-
let res5 = Settings::update_java();
248247
let res6 = CredentialsStore::update_creds();
249248

250-
let _ = join!(res1, res2, res3, res4, res5, res6);
249+
let _ = join!(res1, res2, res3, res4, res6);
251250
}
252251
}
253252
});

theseus/src/state/settings.rs

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
11
//! Theseus settings file
2-
use crate::{
3-
jre::{self, autodetect_java_globals, find_filtered_jres},
4-
State,
5-
};
62
use serde::{Deserialize, Serialize};
73
use std::path::{Path, PathBuf};
84
use tokio::fs;
@@ -116,40 +112,6 @@ impl Settings {
116112
}
117113
}
118114

119-
#[tracing::instrument]
120-
#[theseus_macros::debug_pin]
121-
pub async fn update_java() {
122-
let res = async {
123-
let state = State::get().await?;
124-
let settings_read = state.settings.write().await;
125-
126-
if settings_read.java_globals.count() == 0 {
127-
drop(settings_read);
128-
let jres = jre::get_all_jre().await?;
129-
let java_8 =
130-
find_filtered_jres("1.8", jres.clone(), false).await?;
131-
let java_17 =
132-
find_filtered_jres("1.17", jres.clone(), false).await?;
133-
let java_18plus =
134-
find_filtered_jres("1.18", jres.clone(), true).await?;
135-
let java_globals =
136-
autodetect_java_globals(java_8, java_17, java_18plus)
137-
.await?;
138-
state.settings.write().await.java_globals = java_globals;
139-
}
140-
141-
Ok::<(), crate::Error>(())
142-
}
143-
.await;
144-
145-
match res {
146-
Ok(()) => {}
147-
Err(err) => {
148-
tracing::warn!("Unable to update launcher java: {err}")
149-
}
150-
};
151-
}
152-
153115
#[tracing::instrument(skip(self))]
154116
pub async fn sync(&self, to: &Path) -> crate::Result<()> {
155117
fs::write(to, serde_json::to_vec(self)?)

theseus_gui/src-tauri/src/api/jre.rs

Lines changed: 4 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,7 @@ use theseus::prelude::*;
88
pub fn init<R: tauri::Runtime>() -> TauriPlugin<R> {
99
tauri::plugin::Builder::new("jre")
1010
.invoke_handler(tauri::generate_handler![
11-
jre_get_all_jre,
1211
jre_find_filtered_jres,
13-
jre_autodetect_java_globals,
14-
jre_validate_globals,
1512
jre_get_jre,
1613
jre_test_jre,
1714
jre_auto_install_java,
@@ -20,39 +17,12 @@ pub fn init<R: tauri::Runtime>() -> TauriPlugin<R> {
2017
.build()
2118
}
2219

23-
/// Get all JREs that exist on the system
24-
#[tauri::command]
25-
pub async fn jre_get_all_jre() -> Result<Vec<JavaVersion>> {
26-
Ok(jre::get_all_jre().await?)
27-
}
28-
2920
// Finds the installation of Java 8, if it exists
3021
#[tauri::command]
3122
pub async fn jre_find_filtered_jres(
32-
jres: Vec<JavaVersion>,
33-
version: String,
34-
allow_higher: bool,
23+
version: Option<u32>,
3524
) -> Result<Vec<JavaVersion>> {
36-
Ok(jre::find_filtered_jres(&version, jres, allow_higher).await?)
37-
}
38-
39-
// Autodetect Java globals, by searching the users computer.
40-
// Selects from the given JREs, and returns a new JavaGlobals
41-
// Returns a *NEW* JavaGlobals that can be put into Settings
42-
#[tauri::command]
43-
pub async fn jre_autodetect_java_globals(
44-
java_8: Vec<JavaVersion>,
45-
java_17: Vec<JavaVersion>,
46-
java_18plus: Vec<JavaVersion>,
47-
) -> Result<JavaGlobals> {
48-
Ok(jre::autodetect_java_globals(java_8, java_17, java_18plus).await?)
49-
}
50-
51-
// Validates java globals, by checking if the paths exist
52-
// If false, recommend to direct them to reassign, or to re-guess
53-
#[tauri::command]
54-
pub async fn jre_validate_globals() -> Result<bool> {
55-
Ok(jre::validate_globals().await?)
25+
Ok(jre::find_filtered_jres(version).await?)
5626
}
5727

5828
// Validates JRE at a given path
@@ -64,12 +34,8 @@ pub async fn jre_get_jre(path: PathBuf) -> Result<Option<JavaVersion>> {
6434

6535
// Tests JRE of a certain version
6636
#[tauri::command]
67-
pub async fn jre_test_jre(
68-
path: PathBuf,
69-
major_version: u32,
70-
minor_version: u32,
71-
) -> Result<bool> {
72-
Ok(jre::test_jre(path, major_version, minor_version).await?)
37+
pub async fn jre_test_jre(path: PathBuf, major_version: u32) -> Result<bool> {
38+
Ok(jre::test_jre(path, major_version).await?)
7339
}
7440

7541
// Auto installs java for the given java version

theseus_gui/src/components/ui/JavaDetectionModal.vue

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,7 @@
3737
<script setup>
3838
import { Modal, PlusIcon, CheckIcon, Button, XIcon } from 'omorphia'
3939
import { ref } from 'vue'
40-
import {
41-
find_jre_17_jres,
42-
find_jre_18plus_jres,
43-
find_jre_8_jres,
44-
get_all_jre,
45-
} from '@/helpers/jre.js'
40+
import { find_filtered_jres } from '@/helpers/jre.js'
4641
import { handleError } from '@/store/notifications.js'
4742
import { mixpanel_track } from '@/helpers/mixpanel'
4843
import { useTheming } from '@/store/theme.js'
@@ -55,15 +50,10 @@ const currentSelected = ref({})
5550
5651
defineExpose({
5752
show: async (version, currentSelectedJava) => {
58-
if (version <= 8 && !!version) {
59-
chosenInstallOptions.value = await find_jre_8_jres().catch(handleError)
60-
} else if (version >= 18) {
61-
chosenInstallOptions.value = await find_jre_18plus_jres().catch(handleError)
62-
} else if (version) {
63-
chosenInstallOptions.value = await find_jre_17_jres().catch(handleError)
64-
} else {
65-
chosenInstallOptions.value = await get_all_jre().catch(handleError)
66-
}
53+
chosenInstallOptions.value = await find_filtered_jres(version).catch(handleError)
54+
55+
console.log(chosenInstallOptions.value)
56+
console.log(version)
6757
6858
currentSelected.value = currentSelectedJava
6959
if (!currentSelected.value) {

0 commit comments

Comments
 (0)