mirror of
https://github.com/modrinth/code.git
synced 2026-07-31 21:26:40 +00:00
fix: clean up updater temp folders
This commit is contained in:
@@ -181,6 +181,23 @@ fn main() {
|
||||
.build(),
|
||||
)
|
||||
.setup(|app| {
|
||||
#[cfg(target_os = "windows")]
|
||||
{
|
||||
let app_name = app.package_info().name.clone();
|
||||
tauri::async_runtime::spawn(async move {
|
||||
match theseus::cleanup_updater_temp_folders(&app_name).await
|
||||
{
|
||||
Ok(0) => {}
|
||||
Ok(count) => tracing::info!(
|
||||
"Cleaned up {count} updater temp folders"
|
||||
),
|
||||
Err(error) => tracing::warn!(
|
||||
"Failed to clean up updater temp folders: {error}"
|
||||
),
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
#[cfg(target_os = "macos")]
|
||||
{
|
||||
let payload = macos::deep_link::get_or_init_payload(app);
|
||||
|
||||
@@ -17,6 +17,7 @@ pub mod install;
|
||||
mod launcher;
|
||||
mod logger;
|
||||
mod state;
|
||||
mod updater;
|
||||
|
||||
pub use api::*;
|
||||
pub use error::*;
|
||||
@@ -26,6 +27,7 @@ pub use event::{
|
||||
};
|
||||
pub use logger::start_logger;
|
||||
pub use state::State;
|
||||
pub use updater::cleanup_updater_temp_folders;
|
||||
pub use util::fetch::DownloadReason;
|
||||
|
||||
pub fn launcher_user_agent() -> String {
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
use std::io;
|
||||
|
||||
const UPDATER_SEPARATOR: &str = "-updater-";
|
||||
const UPDATER_RANDOM_SUFFIX_LENGTH: usize = 6;
|
||||
|
||||
pub async fn cleanup_updater_temp_folders(
|
||||
app_name: &str,
|
||||
) -> io::Result<usize> {
|
||||
let mut entries = tokio::fs::read_dir(std::env::temp_dir()).await?;
|
||||
let mut removed = 0;
|
||||
|
||||
while let Some(entry) = entries.next_entry().await? {
|
||||
let file_name = entry.file_name();
|
||||
let Some(file_name) = file_name.to_str() else {
|
||||
continue;
|
||||
};
|
||||
|
||||
if !is_updater_temp_folder(app_name, file_name)
|
||||
|| !entry.file_type().await?.is_dir()
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
let path = entry.path();
|
||||
match tokio::fs::remove_dir_all(&path).await {
|
||||
Ok(()) => removed += 1,
|
||||
Err(error) => {
|
||||
tracing::warn!(
|
||||
"Failed to clean up updater temp folder {}: {error}",
|
||||
path.display()
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Ok(removed)
|
||||
}
|
||||
|
||||
fn is_updater_temp_folder(app_name: &str, file_name: &str) -> bool {
|
||||
let Some(name) = file_name
|
||||
.strip_prefix(app_name)
|
||||
.and_then(|name| name.strip_prefix('-'))
|
||||
else {
|
||||
return false;
|
||||
};
|
||||
let Some((version, random_suffix)) =
|
||||
name.rsplit_once(UPDATER_SEPARATOR)
|
||||
else {
|
||||
return false;
|
||||
};
|
||||
|
||||
!version.is_empty()
|
||||
&& version
|
||||
.bytes()
|
||||
.all(|byte| byte.is_ascii_alphanumeric() || b".-+".contains(&byte))
|
||||
&& random_suffix.len() == UPDATER_RANDOM_SUFFIX_LENGTH
|
||||
&& random_suffix.bytes().all(|byte| byte.is_ascii_alphanumeric())
|
||||
}
|
||||
Reference in New Issue
Block a user