diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 55bac8c4b..f0765e951 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -12,12 +12,15 @@ jobs: fail-fast: false matrix: include: - - target: x86_64-pc-windows-gnu - archive: zip + - target: x86_64-unknown-linux-gnu + archive: tar.gz tar.xz - target: x86_64-unknown-linux-musl archive: tar.gz tar.xz - target: x86_64-apple-darwin + archive: tar.gz tar.xz + - target: x86_64-pc-windows-gnu archive: zip + steps: - uses: actions/checkout@master - name: Compile and release diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 2ed974a47..858e42296 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -2,9 +2,10 @@ name: github pages on: push: + paths: + - docs/** branches: - main - pull_request: jobs: deploy: @@ -30,4 +31,4 @@ jobs: target-folder: docs/nightly/cli repository-name: dioxuslabs/docsite clean: false - token: ${{ secrets.DEPLOY_KEY }} # let's pretend I don't need it for now \ No newline at end of file + token: ${{ secrets.DEPLOY_KEY }} # let's pretend I don't need it for now diff --git a/src/cli/build/mod.rs b/src/cli/build/mod.rs index f857bfc13..90ac2d0ba 100644 --- a/src/cli/build/mod.rs +++ b/src/cli/build/mod.rs @@ -40,7 +40,7 @@ impl Build { crate::builder::build_desktop(&crate_config, false)?; } _ => { - return custom_error!("Unsoppurt platform target."); + return custom_error!("Unsupported platform target."); } } diff --git a/src/cli/clean/mod.rs b/src/cli/clean/mod.rs index 74a99fec2..d380f5265 100644 --- a/src/cli/clean/mod.rs +++ b/src/cli/clean/mod.rs @@ -16,8 +16,7 @@ impl Clean { .output()?; if !output.status.success() { - log::error!("Cargo clean failed."); - return Ok(()); + return custom_error!("Cargo clean failed."); } let out_dir = crate_config diff --git a/src/cli/create/mod.rs b/src/cli/create/mod.rs index aa37142a7..658f02c2f 100644 --- a/src/cli/create/mod.rs +++ b/src/cli/create/mod.rs @@ -17,8 +17,7 @@ pub struct Create { impl Create { pub fn create(self) -> Result<()> { if Self::name_vaild_check(self.name.clone()) { - log::error!("❗Unsupported project name."); - return Ok(()); + return custom_error!("❗Unsupported project name."); } let project_path = PathBuf::from(&self.name); diff --git a/src/cli/mod.rs b/src/cli/mod.rs index b456d4705..4190fbb5f 100644 --- a/src/cli/mod.rs +++ b/src/cli/mod.rs @@ -22,7 +22,7 @@ use std::{ fs::{remove_dir_all, File}, io::{Read, Write}, path::PathBuf, - process::{exit, Command, Stdio}, + process::{Command, Stdio}, }; /// Build, bundle, & ship your Dioxus app. diff --git a/src/cli/tool/mod.rs b/src/cli/tool/mod.rs index fde94b29a..2edccf7ea 100644 --- a/src/cli/tool/mod.rs +++ b/src/cli/tool/mod.rs @@ -30,15 +30,14 @@ impl Tool { if let Some(v) = tools::tools_path().to_str() { println!("{}", v); } else { - log::error!("Tools path get failed."); + return custom_error!("Tools path get failed."); } } Tool::Add { name } => { let tool_list = tools::tool_list(); if !tool_list.contains(&name.as_str()) { - log::error!("Tool {name} not found."); - return Ok(()); + return custom_error!("Tool {name} not found."); } let target_tool = tools::Tool::from_str(&name).unwrap(); @@ -49,17 +48,15 @@ impl Tool { log::info!("Start to download tool package..."); if let Err(e) = target_tool.download_package().await { - log::error!("Tool download failed: {e}"); - return Ok(()); + return custom_error!("Tool download failed: {e}"); } log::info!("Start to install tool package..."); if let Err(e) = target_tool.install_package().await { - log::error!("Tool install failed: {e}"); - return Ok(()); + return custom_error!("Tool install failed: {e}"); } - log::info!("Tool {name} install successfully!"); + log::info!("Tool {name} installed successfully!"); } } Ok(()) diff --git a/src/cli/translate/mod.rs b/src/cli/translate/mod.rs index e239ce318..2ffa95023 100644 --- a/src/cli/translate/mod.rs +++ b/src/cli/translate/mod.rs @@ -27,14 +27,11 @@ impl Translate { } = self; let contents = match file { - Some(input) => std::fs::read_to_string(&input).unwrap_or_else(|e| { - log::error!("Cloud not read input file: {}.", e); - exit(0); - }), + Some(input) => std::fs::read_to_string(&input) + .map_err(|e| Error::CustomError(format!("Could not read input file: {e}.")))?, None => { if atty::is(atty::Stream::Stdin) { - log::error!("No input file, source, or stdin to translate from."); - exit(0); + return custom_error!("No input file, source, or stdin to translate from."); } let mut buffer = String::new(); diff --git a/src/error.rs b/src/error.rs index 54dc2c981..c3a276ad0 100644 --- a/src/error.rs +++ b/src/error.rs @@ -63,7 +63,7 @@ impl From for Error { #[macro_export] macro_rules! custom_error { ($msg:literal $(,)?) => { - Err(Error::CustomError($msg.to_string())) + Err(Error::CustomError(format!($msg))) }; ($err:expr $(,)?) => { Err(Error::from($err)) diff --git a/src/main.rs b/src/main.rs index 39b360f7d..556572659 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,6 @@ use clap::Parser; use dioxus_cli::*; +use std::process::exit; #[tokio::main] async fn main() -> Result<()> { @@ -10,42 +11,49 @@ async fn main() -> Result<()> { Commands::Translate(opts) => { if let Err(e) = opts.translate() { log::error!("🚫 Translate failed: {}", e); + exit(1); } } Commands::Build(opts) => { if let Err(e) = opts.build() { log::error!("🚫 Build project failed: {}", e); + exit(1); } } Commands::Clean(opts) => { if let Err(e) = opts.clean() { log::error!("🚫 Clean project failed: {}", e); + exit(1); } } Commands::Serve(opts) => { if let Err(e) = opts.serve().await { log::error!("🚫 Serve startup failed: {}", e); + exit(1); } } Commands::Create(opts) => { if let Err(e) = opts.create() { log::error!("🚫 Create project failed: {}", e); + exit(1); } } Commands::Config(opts) => { if let Err(e) = opts.config() { log::error!("config error: {}", e); + exit(1); } } Commands::Tool(opts) => { if let Err(e) = opts.tool().await { log::error!("tool error: {}", e); + exit(1); } } } diff --git a/src/server/mod.rs b/src/server/mod.rs index cc2afdec0..9cc693452 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -105,14 +105,15 @@ pub async fn startup_hot_reload(port: u16, config: CrateConfig) -> Result<()> { if chrono::Local::now().timestamp() > last_update_time { // Give time for the change to take effect before reading the file std::thread::sleep(std::time::Duration::from_millis(100)); + let mut updated = false; if let Ok(evt) = evt { let mut messages = Vec::new(); let mut needs_rebuild = false; for path in evt.paths.clone() { - let mut file = File::open(path.clone()).unwrap(); if path.extension().map(|p| p.to_str()).flatten() != Some("rs") { continue; } + let mut file = File::open(path.clone()).unwrap(); let mut src = String::new(); file.read_to_string(&mut src).expect("Unable to read file"); // find changes to the rsx in the file @@ -120,6 +121,7 @@ pub async fn startup_hot_reload(port: u16, config: CrateConfig) -> Result<()> { let mut last_file_rebuild = last_file_rebuild.lock().unwrap(); if let Some(old_str) = last_file_rebuild.map.get(&path) { if let Ok(old) = syn::parse_file(&old_str) { + updated = true; match find_rsx(&syntax, &old) { DiffResult::CodeChanged => { needs_rebuild = true; @@ -207,7 +209,9 @@ pub async fn startup_hot_reload(port: u16, config: CrateConfig) -> Result<()> { let _ = hot_reload_tx.send(msg); } } - last_update_time = chrono::Local::now().timestamp(); + if updated { + last_update_time = chrono::Local::now().timestamp(); + } } }, notify::Config::default(), @@ -435,19 +439,18 @@ pub struct PrettierOptions { } fn print_console_info(port: u16, config: &CrateConfig, options: PrettierOptions) { - print!( - "{}", - String::from_utf8_lossy( - &Command::new(if cfg!(target_os = "windows") { - "cls" - } else { - "clear" - }) - .output() - .map(|output| output.stdout) - .unwrap_or_default() - ) - ); + + if let Ok(native_clearseq) = Command::new(if cfg!(target_os = "windows") { + "cls" + } else { + "clear" + }) + .output() { + print!("{}", String::from_utf8_lossy(&native_clearseq.stdout)); + } else { + // Try ANSI-Escape characters + print!("\x1b[2J\x1b[H"); + } // for path in &changed { // let path = path