Skip to content

Commit afc7a3e

Browse files
committed
change mode detection, check by detecting installation record instead
1 parent 1efd059 commit afc7a3e

File tree

19 files changed

+165
-101
lines changed

19 files changed

+165
-101
lines changed

README.md

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,11 @@ After env setup, it will guide you through installing Rust `toolkit`.
6464
- Debug `installer` mode:
6565
- Commandline interface
6666
```bash
67-
cargo run
67+
cargo dev run --cli --installer
6868
```
6969
- Graphical interface
7070
```bash
71-
cd rim_gui
72-
pnpm run tauri dev
71+
pnpm dev run --installer
7372
```
7473
- Debug `manager` mode:
7574
> Running `manager` is not as straight forward as running in `Installer` mode.
@@ -78,7 +77,7 @@ After env setup, it will guide you through installing Rust `toolkit`.
7877
so you can test `manager`'s functionalities easier.
7978

8079
```bash
81-
cargo dev run-manager
80+
cargo dev run --manager
8281
```
8382

8483
### Release
@@ -140,12 +139,8 @@ Options:
140139

141140
### Manager mode (CLI)
142141

143-
> Manager mode can be activated by:
144-
>
145-
> 1. Renaming the binary to one that contains `manager`, such as `manager-cli`
146-
> 2. Having a `MODE` environment variable set to `manager` before running the program, such as running `export MODE='manager'` in Unix systems.
147-
>
148-
> NOTE: **Manager will be automatically deployed after installation, and must be run inside of the installation directory to avoid crash**
142+
> Manager mode will run after an installation record was detected, and it can also be overridden by
143+
> having a `MODE` environment variable set to `manager` before running the program, such as running `export MODE='manager'` in Unix systems.
149144

150145
```console
151146
Usage: MODE='manager' rim-cli.exe [OPTIONS] [COMMAND]

rim_dev/README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ Options:
1313
-h, -help Print this help message
1414

1515
Commands:
16-
dist, d Generate release binaries
17-
run-manager Run in manager mode
16+
d, dist Generate release binaries
17+
r, run Build and run RIM for testing purpose
1818
vendor Download packages for offline package build
1919
mock-rustup-server
2020
Generate a mocked rustup dist server
@@ -23,19 +23,19 @@ Commands:
2323
### Debug manager (GUI)
2424

2525
```bash
26-
cargo dev run-manager
26+
cargo dev run --manager
2727
```
2828

2929
### Debug manager (CLI)
3030

3131
```bash
32-
cargo dev run-manager --cli
32+
cargo dev run --manager --cli
3333
```
3434

3535
check for more manager-mode help
3636

3737
```bash
38-
cargo dev run-manager --help
38+
cargo dev run --manager --help
3939
```
4040

4141
### Generate release binaries

rim_dev/src/main.rs

Lines changed: 17 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
mod common;
22
mod dist;
33
mod mocked;
4+
mod run;
45
mod toolkits_parser;
56
mod vendor;
67

78
use anyhow::{anyhow, Context, Result};
89
use dist::DIST_HELP;
9-
use mocked::{installation, manager, server};
10+
use mocked::server;
11+
use run::RunMode;
1012
use std::env;
1113
use std::io::{stdout, Write};
1214
use std::path::PathBuf;
@@ -21,23 +23,12 @@ Options:
2123
-h, -help Print this help message
2224
2325
Commands:
24-
dist, d Generate release binaries
25-
run-manager Run in manager mode
26+
d, dist Generate release binaries
27+
r, run Build and run RIM for testing purpose
2628
vendor Download packages for offline package build
2729
mock-server
2830
Generate a mocked rustup dist server
2931
"#;
30-
31-
const MANAGER_MODE_HELP: &str = r#"
32-
Run with manager mode
33-
34-
Usage: cargo dev run-manager [OPTIONS]
35-
36-
Options:
37-
--cli Run manager mode with commandline interface
38-
--gui Run manager mode with graphical interface (default)
39-
-h, -help Print this help message
40-
"#;
4132
const MOCK_HELP: &str = r#"
4233
Generate a mocked rustup dist server and rim dist server
4334
@@ -57,8 +48,8 @@ enum DevCmd {
5748
dist_targets: Vec<String>,
5849
name: Option<String>,
5950
},
60-
RunManager {
61-
no_gui: bool,
51+
Run {
52+
mode: RunMode,
6253
args: Vec<String>,
6354
},
6455
Mock {
@@ -83,25 +74,7 @@ impl DevCmd {
8374
dist_targets,
8475
name,
8576
} => dist::dist(mode, binary_only, name, build_target, dist_targets)?,
86-
Self::RunManager { no_gui, args } => {
87-
println!("running manager with args: {args:?}");
88-
// replace home env to prevent modifying the actually environment
89-
let home = mocked::mocked_home();
90-
std::env::set_var("HOME", home);
91-
#[cfg(windows)]
92-
std::env::set_var("USERPROFILE", home);
93-
94-
// a mocked server is needed to run most of function in manager
95-
server::generate_rim_server_files()?;
96-
97-
// generate a fake manager binary with higher version so we
98-
// can test the self update.
99-
if args.iter().any(|arg| arg == "update") {
100-
manager::generate()?;
101-
}
102-
103-
installation::generate_and_run_manager(no_gui, &args)?;
104-
}
77+
Self::Run { mode, args } => mode.run(&args)?,
10578
Self::Vendor {
10679
mode,
10780
name,
@@ -203,18 +176,21 @@ fn main() -> Result<ExitCode> {
203176
clear,
204177
}
205178
}
206-
"run-manager" => {
179+
"run" => {
207180
let mut is_extra_arg = false;
208181
let mut extra_args = vec![];
209-
let mut no_gui = false;
182+
let mut mode = RunMode::default();
210183

211184
while let Some(arg) = args.next().as_deref() {
212185
match arg {
213186
"-h" | "--help" if !is_extra_arg => {
214-
writeln!(&mut stdout, "{MANAGER_MODE_HELP}")?;
187+
writeln!(&mut stdout, "{}", run::RUN_HELP)?;
215188
return Ok(ExitCode::SUCCESS);
216189
}
217-
"--cli" => no_gui = true,
190+
"-c" | "--cli" => mode.set_no_gui(true),
191+
"-g" | "--gui" => mode.set_no_gui(false),
192+
"-i" | "--installer" => mode.switch_to_installer(),
193+
"-m" | "--manager" => mode.switch_to_manager(),
218194
"--" if !is_extra_arg => is_extra_arg = true,
219195
a => {
220196
if is_extra_arg {
@@ -224,8 +200,8 @@ fn main() -> Result<ExitCode> {
224200
}
225201
}
226202

227-
DevCmd::RunManager {
228-
no_gui,
203+
DevCmd::Run {
204+
mode,
229205
args: extra_args,
230206
}
231207
}

rim_dev/src/mocked/installation.rs

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use crate::common::{self, pnpm_cmd};
44

55
use super::TOOLKIT_NAME;
66
use anyhow::{bail, Result};
7+
use rim_common::{build_config, exe};
78
use std::{env::consts::EXE_SUFFIX, fs, path::PathBuf, process::Command};
89

910
struct FakeInstallation {
@@ -36,28 +37,20 @@ paths = ['{0}/tools/mingw64']
3637
}
3738

3839
fn generate_manager_bin(&mut self, no_gui: bool) -> Result<()> {
39-
let (mut cmd, src_bin, dest_bin) = if no_gui {
40+
let (mut cmd, src_bin) = if no_gui {
4041
// use cargo build
4142
let mut cmd = Command::new("cargo");
4243
cmd.arg("build");
4344

44-
(
45-
cmd,
46-
format!("rim-cli{EXE_SUFFIX}"),
47-
format!("manager-cli{EXE_SUFFIX}"),
48-
)
45+
(cmd, format!("rim-cli{EXE_SUFFIX}"))
4946
} else {
5047
common::install_gui_deps();
5148

5249
// use tauri-cli under rim_gui dir
5350
let mut cmd = pnpm_cmd();
5451
cmd.args(["run", "tauri", "build", "-d"]);
5552

56-
(
57-
cmd,
58-
format!("rim-gui{EXE_SUFFIX}"),
59-
format!("manager{EXE_SUFFIX}"),
60-
)
53+
(cmd, format!("rim-gui{EXE_SUFFIX}"))
6154
};
6255

6356
// build rim
@@ -67,6 +60,7 @@ paths = ['{0}/tools/mingw64']
6760
}
6861

6962
let build_artifact = super::debug_dir().join(src_bin);
63+
let dest_bin = exe!(build_config().app_name());
7064
let dest_path = super::install_dir().join(dest_bin);
7165
// make a copy of rim as manager binary to the fake installation root
7266
fs::copy(build_artifact, &dest_path)?;

rim_dev/src/run.rs

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
use std::process::Command;
2+
3+
use anyhow::{bail, Result};
4+
5+
use crate::{
6+
common,
7+
mocked::{self, installation, manager, server},
8+
};
9+
10+
pub(super) const RUN_HELP: &str = r#"
11+
Build and run RIM for testing purpose
12+
13+
Usage: cargo dev run [OPTIONS]
14+
15+
Options:
16+
-c, --cli Run with commandline interface
17+
-g, --gui Run with graphical interface (default)
18+
-i, --installer
19+
Run RIM in installer mode (default)
20+
-m, --manager Run RIM in manager mode
21+
-h, -help Print this help message
22+
"#;
23+
24+
#[derive(Debug, Clone, Copy)]
25+
pub(super) enum RunMode {
26+
Manager { no_gui: bool },
27+
Installer { no_gui: bool },
28+
}
29+
30+
impl Default for RunMode {
31+
fn default() -> Self {
32+
Self::Installer { no_gui: false }
33+
}
34+
}
35+
36+
impl RunMode {
37+
pub(super) fn switch_to_manager(&mut self) {
38+
match self {
39+
Self::Installer { no_gui } => *self = Self::Manager { no_gui: *no_gui },
40+
Self::Manager { .. } => (),
41+
}
42+
}
43+
pub(super) fn switch_to_installer(&mut self) {
44+
match self {
45+
Self::Installer { .. } => (),
46+
Self::Manager { no_gui } => *self = Self::Installer { no_gui: *no_gui },
47+
}
48+
}
49+
pub(super) fn set_no_gui(&mut self, yes: bool) {
50+
match self {
51+
Self::Manager { no_gui } | Self::Installer { no_gui } => *no_gui = yes,
52+
}
53+
}
54+
pub(super) fn run(&self, args: &[String]) -> Result<()> {
55+
println!("running with args: {args:?}");
56+
57+
// replace home env to prevent modifying the actually HOME var
58+
let home = mocked::mocked_home();
59+
std::env::set_var("HOME", home);
60+
#[cfg(windows)]
61+
std::env::set_var("USERPROFILE", home);
62+
63+
match self {
64+
Self::Installer { no_gui } => {
65+
let status = if *no_gui {
66+
Command::new("cargo")
67+
.args(["run", "--"])
68+
.args(args)
69+
.status()?
70+
} else {
71+
common::pnpm_cmd()
72+
.args(["run", "tauri", "dev", "--"])
73+
.args(args)
74+
.status()?
75+
};
76+
77+
if !status.success() {
78+
bail!("unable to run rim in installer mode");
79+
}
80+
}
81+
Self::Manager { no_gui } => {
82+
// a mocked server is needed to run most of function in manager
83+
server::generate_rim_server_files()?;
84+
85+
// generate a fake manager binary with higher version so we
86+
// can test the self update.
87+
if args.iter().any(|arg| arg == "update") {
88+
manager::generate()?;
89+
}
90+
91+
installation::generate_and_run_manager(*no_gui, args)?;
92+
}
93+
}
94+
Ok(())
95+
}
96+
}

0 commit comments

Comments
 (0)