diff --git a/.vscode/launch.json b/.vscode/launch.json index 3eee5276..4ce4b41c 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -133,6 +133,28 @@ }, "args": [], "cwd": "${workspaceFolder}" - } + }, + { + "type": "lldb", + "request": "launch", + "name": "Tauri Development Debug", + "cargo": { + "args": [ + "build", + "--manifest-path=./theseus_gui/src-tauri/Cargo.toml", + "--no-default-features" + ] + }, + "preLaunchTask": "ui:dev" + }, + { + "type": "lldb", + "request": "launch", + "name": "Tauri Production Debug", + "cargo": { + "args": ["build", "--release", "--manifest-path=.theseus_gui/src-tauri/Cargo.toml"] + }, + "preLaunchTask": "ui:build" + } ] } \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 00000000..8f4a751e --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,32 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "ui:dev", + "type": "shell", + // `dev` keeps running in the background + // ideally you should also configure a `problemMatcher` + // see https://code.visualstudio.com/docs/editor/tasks#_can-a-background-task-be-used-as-a-prelaunchtask-in-launchjson + "isBackground": true, + // change this to your `beforeDevCommand`: + "command": "yarn", + "args": ["dev"], + "options": { + "cwd": "${workspaceFolder}/theseus_gui" + } + }, + { + "label": "ui:build", + "type": "shell", + // change this to your `beforeBuildCommand`: + "command": "yarn", + "args": ["build"], + "options": { + "cwd": "${workspaceFolder}/theseus_gui" + } + } + ] + +} \ No newline at end of file diff --git a/theseus/src/api/profile.rs b/theseus/src/api/profile.rs index 1497dbd3..8ac3a0e4 100644 --- a/theseus/src/api/profile.rs +++ b/theseus/src/api/profile.rs @@ -89,24 +89,29 @@ pub async fn list() -> crate::Result /// Query + sync profile's projects with the UI from the FS #[tracing::instrument] pub async fn sync(path: &Path) -> crate::Result<()> { - let state = State::get().await?; - let result = { - let mut profiles: tokio::sync::RwLockWriteGuard< - crate::state::Profiles, - > = state.profiles.write().await; + Box::pin({ + async move { + let state = State::get().await?; + let result = { + let mut profiles: tokio::sync::RwLockWriteGuard< + crate::state::Profiles, + > = state.profiles.write().await; - if let Some(profile) = profiles.0.get_mut(path) { - profile.sync().await?; - Ok(()) - } else { - Err(crate::ErrorKind::UnmanagedProfileError( - path.display().to_string(), - ) - .as_error()) + if let Some(profile) = profiles.0.get_mut(path) { + profile.sync().await?; + Ok(()) + } else { + Err(crate::ErrorKind::UnmanagedProfileError( + path.display().to_string(), + ) + .as_error()) + } + }; + State::sync().await?; + result } - }; - State::sync().await?; - result + }) + .await } /// Installs/Repairs a profile diff --git a/theseus/src/state/mod.rs b/theseus/src/state/mod.rs index dc2b3743..82fc54ec 100644 --- a/theseus/src/state/mod.rs +++ b/theseus/src/state/mod.rs @@ -138,34 +138,35 @@ impl State { #[tracing::instrument] /// Synchronize in-memory state with persistent state pub async fn sync() -> crate::Result<()> { - let state = Self::get().await?; + Box::pin(async move { + let state = Self::get().await?; + let sync_settings = async { + let state = Arc::clone(&state); - let sync_settings = async { - let state = Arc::clone(&state); + tokio::spawn(async move { + let reader = state.settings.read().await; + reader.sync(&state.directories.settings_file()).await?; + Ok::<_, crate::Error>(()) + }) + .await? + }; - tokio::spawn(async move { - let reader = state.settings.read().await; - reader.sync(&state.directories.settings_file()).await?; - Ok::<_, crate::Error>(()) - }) - .await? - }; + let sync_profiles = async { + let state = Arc::clone(&state); - let sync_profiles = async { - let state = Arc::clone(&state); + tokio::spawn(async move { + let profiles = state.profiles.read().await; - tokio::spawn(async move { - let profiles = state.profiles.read().await; + profiles.sync().await?; + Ok::<_, crate::Error>(()) + }) + .await? + }; - profiles.sync().await?; - Ok::<_, crate::Error>(()) - }) - .await? - }; - - tokio::try_join!(sync_settings, sync_profiles)?; - - Ok(()) + tokio::try_join!(sync_settings, sync_profiles)?; + Ok(()) + }) + .await } /// Reset semaphores to default values diff --git a/theseus/src/state/projects.rs b/theseus/src/state/projects.rs index ffdadece..0db6f15e 100644 --- a/theseus/src/state/projects.rs +++ b/theseus/src/state/projects.rs @@ -358,13 +358,7 @@ pub async fn infer_data_from_files( .filter(|x| x.team_id == project.team) .cloned() .collect::>(), - update_version: if let Some(val) = - update_versions.get(&hash) - { - Some(Box::new(val.clone())) - } else { - None - }, + update_version: update_versions.get(&hash).map(|val| Box::new(val.clone())), incompatible: !version.loaders.contains( &profile