Files
dioxus/packages/cli/src/rustup.rs
T
Jonathan Kelley 7ec3453ca3 Fix bundling/path errors, sidecar support, iOS/Android simulator support, asset hotreload fixes, serverfn hotrelad, native tailwind support (#2779)
* wip: fix manganis import path
* upgrade tauri bundler, convert todo!() to unimplemented!()
* feat: mobile hotreloading + ios asset configuration
* remove oid demo and its associated env vars
* nuke all the things that cause cache thrashing
* swap to Asset type
* add some more logs
* display impl for attrvalue
* dont panic on collect failure
* cut down web deps to 150
* clean up deps in a lot of places, simplify build scripts
* clean up asset resolution and cli-dev profile
* wire up absolute paths for manganis asset in a particular mode
* move document related things around to shorten compile times
* move most things to `document::Item` and then decompose the cli-config
* switch link to stylesheet for clarity in examples
* move manganis workspace example to examples folder
* decompose manganis-cli-support
* dont need mobile demo anymore
* remove gloo dialogs
* html doesnt need document
* rename hotreload to devtools
* really clean up the html crate
* fix weird rsx spacing
* clean up desktop to use callback
* clean up document a bit
* re-wire up devsocket
* fix utf css
* yeeeet that js out of here
* synthetic web system works
* web crate almost done being cleaned up
* desktop mostly cleaned up too
* clean up cli a bit
* more cli cleanup
* cli builds again
* clean up cli, inline structs, cut down number of unique types where possible
* hotreload works again for desktop and this time, mobile too
* cfg out tungstenite
* devserver err
* more refactor to cli builder
* switch to unbounded_send
* new structure is much cleaner
* add http serve subcommand
* bundled hotreload
* kick stylsheets
* clean up a bit more, split up eventloop
* amazingly serve seems done
* change from pub to pub(crate) in cli
* remove tools
* bit more polish to cli
* fix issue with join
* gracefully handle fullstack without a server
* fullstack mobile demo
* fix launch function, move projects into example-projects folder
* hoist examples
* add "run" command
* clean up launch
* remove old manual websocket receiver
* doctor command
* allow desktop to scroll
* cut apart router crate
* dont put launch in prelude
* use dioxus::launch where possible
* rename rsx, cut out hotreload tests
* remove liveview project
* bump native
* fix compile for renderers
* move sync event response out of interpreter
* move render in serve
* rollback settings change
* cli compiles, huzzah!
* change uris for asset
* fix asset
* new tui screen
* new cargo-like tui works
* very very verty close
* it works! very small bug with incorrect grapheme calc
* Clean up devserver a bit
* status sytem
* tidy up debug filters
* clean up logging situation
* Fix a number of bugs with log printing
* new printing system is more reliable
* wire up more stuff
* things working but fullstack is having issues
* fullstack works again!
* hotreloading bundled assets works again
* bundled hotreload and beginnings of macos bundling
* Hotreload desktop
* combined server builds
* add build handle
* fix fullstack assets
* make open async, add some hooks for ios
* migrate filemap to runner
* wip global crate system
* fixup bundles + organize asset
* fix asset location bug
* all the bundled reloading!
* open ios simulator!
* full hotreload support for mobile + serverfn
* basic cleanups
* clean up dx
* Move filemap
* fix cutting of newlines
* assets workibg, some android
* hoist wry/tao
* use sync locks and headers to fix issues with android
* desktop -> mac/win/linux with alias
* better logging
* feat: workspace (entire computer!) hotreload
* should rebuild toggle, ios simulator bootup
* proper mobile support in launch
* more robust handling of assets
* fix cargo
* bring back some of tauri bundle
* make warnings go away, clippy happy on cli
* some final clippy cleanups
* fmt
* move manganis to its own folder
* upgrade bundle to stable
* drastically slim down manganis, prepping for merge
* typos, failing test, docsrs config
* remove static gen test
* nix static gen test
* we use --platform web instead of --platform fullstack now
* only bind dev urls in desktop/mobile
* install gtk
* nix static gen
* split build dir by app name
2024-10-25 17:23:45 -07:00

171 lines
5.4 KiB
Rust

use crate::Result;
use anyhow::Context;
use std::path::PathBuf;
use tokio::process::Command;
#[derive(Debug, Default)]
pub struct RustupShow {
pub default_host: String,
pub rustup_home: PathBuf,
pub installed_toolchains: Vec<String>,
pub installed_targets: Vec<String>,
pub active_rustc: String,
pub active_toolchain: String,
}
impl RustupShow {
/// Collect the output of `rustup show` and parse it
pub async fn from_cli() -> Result<RustupShow> {
let output = Command::new("rustup").args(["show"]).output().await?;
let stdout =
String::from_utf8(output.stdout).context("Failed to parse rustup show output")?;
Ok(RustupShow::from_stdout(stdout))
}
/// Parse the output of `rustup show`
pub fn from_stdout(output: String) -> RustupShow {
// I apologize for this hand-rolled parser
let mut result = RustupShow::default();
let mut current_section = "";
for line in output.lines() {
let line = line.trim();
if line.is_empty() {
continue;
}
if line.starts_with("Default host: ") {
result.default_host = line.strip_prefix("Default host: ").unwrap().to_string();
} else if line.starts_with("rustup home: ") {
result.rustup_home =
PathBuf::from(line.strip_prefix("rustup home: ").unwrap().trim());
} else if line == "installed toolchains" {
current_section = "toolchains";
} else if line == "installed targets for active toolchain" {
current_section = "targets";
} else if line == "active toolchain" {
current_section = "active_toolchain";
} else {
if line.starts_with("---") || line.is_empty() {
continue;
}
match current_section {
"toolchains" => result
.installed_toolchains
.push(line.trim_end_matches(" (default)").to_string()),
"targets" => result.installed_targets.push(line.to_string()),
"active_toolchain" => {
if result.active_toolchain.is_empty() {
result.active_toolchain = line.to_string();
} else if line.starts_with("rustc ") {
result.active_rustc = line.to_string();
}
}
_ => {}
}
}
}
result
}
pub fn has_wasm32_unknown_unknown(&self) -> bool {
self.installed_targets
.contains(&"wasm32-unknown-unknown".to_string())
}
}
#[test]
fn parses_rustup_show() {
let output = r#"
Default host: aarch64-apple-darwin
rustup home: /Users/jonkelley/.rustup
installed toolchains
--------------------
stable-aarch64-apple-darwin (default)
nightly-2021-07-06-aarch64-apple-darwin
nightly-2021-09-24-aarch64-apple-darwin
nightly-2022-03-10-aarch64-apple-darwin
nightly-2023-03-18-aarch64-apple-darwin
nightly-2024-01-11-aarch64-apple-darwin
nightly-aarch64-apple-darwin
1.58.1-aarch64-apple-darwin
1.60.0-aarch64-apple-darwin
1.68.2-aarch64-apple-darwin
1.69.0-aarch64-apple-darwin
1.71.1-aarch64-apple-darwin
1.72.1-aarch64-apple-darwin
1.73.0-aarch64-apple-darwin
1.74.1-aarch64-apple-darwin
1.77.2-aarch64-apple-darwin
1.78.0-aarch64-apple-darwin
1.79.0-aarch64-apple-darwin
1.49-aarch64-apple-darwin
1.55-aarch64-apple-darwin
1.56-aarch64-apple-darwin
1.57-aarch64-apple-darwin
1.66-aarch64-apple-darwin
1.69-aarch64-apple-darwin
1.70-aarch64-apple-darwin
1.74-aarch64-apple-darwin
installed targets for active toolchain
--------------------------------------
aarch64-apple-darwin
aarch64-apple-ios
aarch64-apple-ios-sim
aarch64-linux-android
aarch64-unknown-linux-gnu
armv7-linux-androideabi
i686-linux-android
thumbv6m-none-eabi
thumbv7em-none-eabihf
wasm32-unknown-unknown
x86_64-apple-darwin
x86_64-apple-ios
x86_64-linux-android
x86_64-pc-windows-msvc
x86_64-unknown-linux-gnu
active toolchain
----------------
stable-aarch64-apple-darwin (default)
rustc 1.79.0 (129f3b996 2024-06-10)
"#;
let show = RustupShow::from_stdout(output.to_string());
assert_eq!(show.default_host, "aarch64-apple-darwin");
assert_eq!(show.rustup_home, PathBuf::from("/Users/jonkelley/.rustup"));
assert_eq!(
show.active_toolchain,
"stable-aarch64-apple-darwin (default)"
);
assert_eq!(show.active_rustc, "rustc 1.79.0 (129f3b996 2024-06-10)");
assert_eq!(show.installed_toolchains.len(), 26);
assert_eq!(show.installed_targets.len(), 15);
assert_eq!(
show.installed_targets,
vec![
"aarch64-apple-darwin".to_string(),
"aarch64-apple-ios".to_string(),
"aarch64-apple-ios-sim".to_string(),
"aarch64-linux-android".to_string(),
"aarch64-unknown-linux-gnu".to_string(),
"armv7-linux-androideabi".to_string(),
"i686-linux-android".to_string(),
"thumbv6m-none-eabi".to_string(),
"thumbv7em-none-eabihf".to_string(),
"wasm32-unknown-unknown".to_string(),
"x86_64-apple-darwin".to_string(),
"x86_64-apple-ios".to_string(),
"x86_64-linux-android".to_string(),
"x86_64-pc-windows-msvc".to_string(),
"x86_64-unknown-linux-gnu".to_string(),
]
)
}