Skip to content

Commit

Permalink
feat: 支持自动安装 msys2
Browse files Browse the repository at this point in the history
  • Loading branch information
mslxl committed Dec 4, 2023
1 parent 3cc76f5 commit b980f04
Show file tree
Hide file tree
Showing 32 changed files with 492 additions and 91 deletions.
2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,11 @@
"@radix-ui/react-dropdown-menu": "^2.0.6",
"@radix-ui/react-label": "^2.0.2",
"@radix-ui/react-popover": "^1.0.7",
"@radix-ui/react-progress": "^1.0.3",
"@radix-ui/react-select": "^2.0.0",
"@radix-ui/react-separator": "^1.0.3",
"@radix-ui/react-slot": "^1.0.2",
"@radix-ui/react-tooltip": "^1.0.7",
"@replit/codemirror-emacs": "^6.0.1",
"@replit/codemirror-vim": "^6.1.0",
"@tauri-apps/api": "^1.5.1",
Expand Down
60 changes: 60 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

36 changes: 18 additions & 18 deletions src-tauri/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,23 +13,23 @@ fn gcc(inp: &str, oup: &str) {
.success());
}
fn main() {
if cfg!(windows) {
gcc(
"src-util/consolepauser.windows.cpp",
"src-util/build/consolepauser",
)
} else {
gcc(
"src-util/consolepauser.unix.cpp",
"src-util/build/consolepauser",
)
}
gcc("src-util/ncmp.cpp", "src-util/build/ncmp");
gcc("src-util/rcmp.cpp", "src-util/build/rcmp");
gcc("src-util/rcmp4.cpp", "src-util/build/rcmp4");
gcc("src-util/rcmp6.cpp", "src-util/build/rcmp6");
gcc("src-util/rcmp9.cpp", "src-util/build/ncmp9");
gcc("src-util/wcmp.cpp", "src-util/build/wcmp");
gcc("src-util/yesno.cpp", "src-util/build/yesno");
// if cfg!(windows) {
// gcc(
// "src-util/consolepauser.windows.cpp",
// "src-util/build/consolepauser",
// )
// } else {
// gcc(
// "src-util/consolepauser.unix.cpp",
// "src-util/build/consolepauser",
// )
// }
// gcc("src-util/ncmp.cpp", "src-util/build/ncmp");
// gcc("src-util/rcmp.cpp", "src-util/build/rcmp");
// gcc("src-util/rcmp4.cpp", "src-util/build/rcmp4");
// gcc("src-util/rcmp6.cpp", "src-util/build/rcmp6");
// gcc("src-util/rcmp9.cpp", "src-util/build/ncmp9");
// gcc("src-util/wcmp.cpp", "src-util/build/wcmp");
// gcc("src-util/yesno.cpp", "src-util/build/yesno");
tauri_build::build();
}
30 changes: 30 additions & 0 deletions src-tauri/scripts/msys2.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
$target = $args[0]
$downloadUrl = "https://mirrors.tuna.tsinghua.edu.cn/msys2/distrib/msys2-x86_64-latest.sfx.exe"
$mirror = 'sed -i "s#https\?://mirror.msys2.org/#https://mirrors.tuna.tsinghua.edu.cn/msys2/#g" /etc/pacman.d/mirrorlist*'

$installer = "$($env:TEMP)\msys2.exe"


if (!(Test-Path $installer -PathType Leaf)) {
Write-Host "Download file to $($installer)"
Invoke-WebRequest -Uri $downloadUrl -OutFile $installer
}

& $installer "-y", "-o$($target)"

$msys2 = "$($target)/msys64/usr/bin/bash.exe"

& $msys2 "-l", "-c", $mirror
& $msys2 "-l", "-c", "pacman --noconfirm -S mingw-w64-ucrt-x86_64-clang-tools-extra mingw-w64-ucrt-x86_64-gcc"

Write-Host "Tools were installed to $($target)/msys64/ucrt64/bin"

$report = @{
'gcc' = "$($target)\msys64\ucrt64\bin\g++.exe"
'clangd' = "$($target)\msys64\ucrt64\bin\clangd.exe"
}

# $report | ConvertTo-Json | Out-File "$($target)/msys2.json" -Encoding UTF8NoBOM
$reportJson = $report | ConvertTo-Json
[IO.File]::WriteAllLines("$($target)\msys2.json", $reportJson)
Remove-Item $installer
5 changes: 5 additions & 0 deletions src-tauri/src/ipc/cmd/host.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,8 @@ pub async fn get_hostname() -> Result<String, String> {
.to_owned();
Ok(name)
}

#[tauri::command]
pub async fn get_system_name() -> Result<String, String> {
Ok(std::env::consts::OS.to_owned())
}
5 changes: 3 additions & 2 deletions src-tauri/src/ipc/rt/checker.rs
Original file line number Diff line number Diff line change
Expand Up @@ -68,9 +68,10 @@ pub async fn check_answer<R: Runtime>(
let checker_path = match checker {
CheckerType::Internal { name } => if cfg!(windows) {
app.path_resolver()
.resolve_resource(format!("{}.exe", name))
.resolve_resource(format!("sidecar/{}.exe", name))
} else {
app.path_resolver().resolve_resource(name)
app.path_resolver()
.resolve_resource(format!("sidecar/{}", name))
}
.ok_or(String::from("no such the checker"))?,
_ => unimplemented!(),
Expand Down
6 changes: 3 additions & 3 deletions src-tauri/src/ipc/rt/runner.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@ pub async fn run_detach<R: Runtime>(
args: Vec<String>,
) -> Result<(), String> {
let pauser = if cfg!(windows) {
app.path_resolver().resolve_resource("consolepauser.exe")
app.path_resolver().resolve_resource("sidecar/consolepauser.exe")
} else {
app.path_resolver().resolve_resource("consolepauser")
app.path_resolver().resolve_resource("sidecar/consolepauser")
}
.unwrap();
let mut cmd = std::process::Command::new(pauser);
Expand Down Expand Up @@ -205,7 +205,7 @@ pub async fn run_redirect<R: Runtime>(
Ok(result)
}

struct ChildKiller(Child);
pub struct ChildKiller(Child);
impl AsMut<Child> for ChildKiller {
fn as_mut(&mut self) -> &mut Child {
&mut self.0
Expand Down
99 changes: 99 additions & 0 deletions src-tauri/src/ipc/setup/installer.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
use std::{
io::Stderr,
process::{Command, Stdio},
};

use tauri::Runtime;
use tokio::{
io::{AsyncBufReadExt, BufReader},
sync::Mutex,
};

use crate::{util::console, RESOURCE_DIR};

#[derive(Default)]
pub struct PwshScriptState {
s: Mutex<()>,
}

#[tauri::command]
pub async fn execuate_pwsh_script<R: Runtime>(
app: tauri::AppHandle<R>,
window: tauri::Window<R>,
state: tauri::State<'_, PwshScriptState>,
name: String,
) -> Result<String, String> {
if !cfg!(windows) {
return Err(String::from("Installer only work on windows"));
}
let _guard = state.s.lock().await;

let script_file = app
.path_resolver()
.resolve_resource(format!("sidecar/{}.ps1", &name))
.unwrap();
let script_file = dunce::canonicalize(script_file).unwrap();
log::info!("execuate script {:?}", &script_file.to_str());
let mut cmd = Command::new(which::which("powershell").unwrap());

let target = RESOURCE_DIR.get().unwrap();
cmd.arg(&script_file.to_str().unwrap());
cmd.arg(target.to_str().unwrap());
console::hide_new_console(&mut cmd);

let mut cmd = tokio::process::Command::from(cmd);
cmd.stdout(Stdio::piped());
cmd.stderr(Stdio::piped());
cmd.stdin(Stdio::piped());
let mut proc = cmd.spawn().unwrap();
let mut stdout = BufReader::new(
proc.stdout
.take()
.ok_or(String::from("Fail to open stdout"))?,
)
.lines();
let mut stderr = BufReader::new(
proc.stderr
.take()
.ok_or(String::from("Fail to open stderr"))?,
)
.lines();

let mut stdout_eof = false;
let mut stderr_eof = false;
let result = loop {
tokio::select! {
Ok(data) = stdout.next_line(), if !stdout_eof => {
if let Some(line) = data {
window.emit("install_message", line).map_err(|e| e.to_string())?;
}else{
stdout_eof = true
}
}
Ok(data) = stderr.next_line(), if !stderr_eof => {
if let Some(line) = data{
window.emit("install_message", line).map_err(|e| e.to_string())?;
}else{
stderr_eof = true;
}
}
else => {
break proc.wait().await.map_err(|e|e.to_string())?;
}
}
};

if result.success() {
let report = target.join(format!("{}.json", name));
let content = tokio::fs::read_to_string(report)
.await
.map_err(|e| e.to_string())?;
Ok(content)
} else {
if let Some(code) = result.code() {
Err(format!("Process exit with code {}", code))
} else {
Err(String::from("Process exit with terminal signal"))
}
}
}
4 changes: 3 additions & 1 deletion src-tauri/src/ipc/setup/mod.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
use std::{time::Duration, process::Stdio};
pub mod installer;

use std::{process::Stdio, time::Duration};

use serde::{Deserialize, Serialize};
use tokio::process::Command;
Expand Down
Loading

0 comments on commit b980f04

Please sign in to comment.