aboutsummaryrefslogtreecommitdiff
path: root/src-tauri/src
diff options
context:
space:
mode:
Diffstat (limited to 'src-tauri/src')
-rw-r--r--src-tauri/src/constants.rs4
-rw-r--r--src-tauri/src/development/mod.rs84
-rw-r--r--src-tauri/src/github/mod.rs4
-rw-r--r--src-tauri/src/github/pull_requests.rs2
-rw-r--r--src-tauri/src/main.rs3
5 files changed, 94 insertions, 3 deletions
diff --git a/src-tauri/src/constants.rs b/src-tauri/src/constants.rs
index 43df0eeb..4005a139 100644
--- a/src-tauri/src/constants.rs
+++ b/src-tauri/src/constants.rs
@@ -51,3 +51,7 @@ pub const FLIGHTCORE_REPO_NAME: &str = "R2NorthstarTools/FlightCore";
// Northstar release repo name and org name on GitHub
pub const NORTHSTAR_RELEASE_REPO_NAME: &str = "R2Northstar/Northstar";
+
+// URL to launcher commits API URL
+pub const NS_LAUNCHER_COMMITS_API_URL: &str =
+ "https://api.github.com/repos/R2Northstar/NorthstarLauncher/commits";
diff --git a/src-tauri/src/development/mod.rs b/src-tauri/src/development/mod.rs
new file mode 100644
index 00000000..be02966d
--- /dev/null
+++ b/src-tauri/src/development/mod.rs
@@ -0,0 +1,84 @@
+use crate::constants::NS_LAUNCHER_COMMITS_API_URL;
+use crate::github::{
+ pull_requests::{check_github_api, download_zip_into_memory, get_launcher_download_link},
+ CommitInfo,
+};
+
+#[tauri::command]
+pub async fn install_git_main(game_install_path: &str) -> Result<String, String> {
+ // Get list of commits
+ let commits: Vec<CommitInfo> = serde_json::from_value(
+ check_github_api(NS_LAUNCHER_COMMITS_API_URL)
+ .await
+ .expect("Failed request"),
+ )
+ .unwrap();
+
+ // Get latest commit...
+ let latest_commit_sha = commits[0].sha.clone();
+ // ...and according artifact download URL
+ let download_url = get_launcher_download_link(latest_commit_sha.clone()).await?;
+
+ let archive = match download_zip_into_memory(download_url).await {
+ Ok(archive) => archive,
+ Err(err) => return Err(err.to_string()),
+ };
+
+ let extract_directory = format!(
+ "{}/___flightcore-temp-download-dir/launcher-pr-{}",
+ game_install_path, latest_commit_sha
+ );
+ match std::fs::create_dir_all(extract_directory.clone()) {
+ Ok(_) => (),
+ Err(err) => {
+ return Err(format!(
+ "Failed creating temporary download directory: {}",
+ err
+ ))
+ }
+ };
+
+ let target_dir = std::path::PathBuf::from(extract_directory.clone()); // Doesn't need to exist
+ match zip_extract::extract(std::io::Cursor::new(archive), &target_dir, true) {
+ Ok(()) => (),
+ Err(err) => {
+ return Err(format!("Failed unzip: {}", err));
+ }
+ };
+
+ // Copy only necessary files from temp dir
+ // Copy:
+ // - NorthstarLauncher.exe
+ // - Northstar.dll
+ let files_to_copy = vec!["NorthstarLauncher.exe", "Northstar.dll"];
+ for file_name in files_to_copy {
+ let source_file_path = format!("{}/{}", extract_directory, file_name);
+ let destination_file_path = format!("{}/{}", game_install_path, file_name);
+ match std::fs::copy(source_file_path, destination_file_path) {
+ Ok(_result) => (),
+ Err(err) => {
+ return Err(format!(
+ "Failed to copy necessary file {} from temp dir: {}",
+ file_name, err
+ ))
+ }
+ };
+ }
+
+ // delete extract directory
+ match std::fs::remove_dir_all(&extract_directory) {
+ Ok(()) => (),
+ Err(err) => {
+ return Err(format!(
+ "Failed to delete temporary download directory: {}",
+ err
+ ))
+ }
+ }
+
+ log::info!(
+ "All done with installing launcher from {}",
+ latest_commit_sha
+ );
+ Ok(latest_commit_sha)
+}
diff --git a/src-tauri/src/github/mod.rs b/src-tauri/src/github/mod.rs
index a4e390d3..0eab305b 100644
--- a/src-tauri/src/github/mod.rs
+++ b/src-tauri/src/github/mod.rs
@@ -31,8 +31,8 @@ pub struct TagWrapper {
}
#[derive(Debug, Deserialize)]
-struct CommitInfo {
- sha: String,
+pub struct CommitInfo {
+ pub sha: String,
commit: Commit,
author: Option<CommitAuthor>,
}
diff --git a/src-tauri/src/github/pull_requests.rs b/src-tauri/src/github/pull_requests.rs
index e600e2e4..b30fd272 100644
--- a/src-tauri/src/github/pull_requests.rs
+++ b/src-tauri/src/github/pull_requests.rs
@@ -127,7 +127,7 @@ pub async fn check_github_api(url: &str) -> Result<serde_json::Value, Box<dyn st
}
/// Downloads a file from given URL into an array in memory
-async fn download_zip_into_memory(download_url: String) -> Result<Vec<u8>, anyhow::Error> {
+pub async fn download_zip_into_memory(download_url: String) -> Result<Vec<u8>, anyhow::Error> {
let client = reqwest::Client::builder()
.user_agent(APP_USER_AGENT)
.build()?;
diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs
index 87f70ae2..9a93d636 100644
--- a/src-tauri/src/main.rs
+++ b/src-tauri/src/main.rs
@@ -16,6 +16,8 @@ use winapi::um::winuser::{MessageBoxW, MB_ICONERROR, MB_OK, MB_USERICON};
use crate::constants::REFRESH_DELAY;
+mod development;
+
mod github;
use github::release_notes::check_is_flightcore_outdated;
@@ -159,6 +161,7 @@ fn main() {
github::pull_requests::apply_mods_pr,
github::pull_requests::get_launcher_download_link,
close_application,
+ development::install_git_main,
get_available_northstar_versions,
])
.run(tauri::generate_context!())