Skip to content

Commit 4cdad8a

Browse files
committed
Re-enable wgpu and wsl features; rework WSL config
Improve build failure log view & add copy buttons
1 parent b74a49e commit 4cdad8a

File tree

6 files changed

+75
-38
lines changed

6 files changed

+75
-38
lines changed

.github/workflows/build.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,11 +105,11 @@ jobs:
105105
- platform: macos-latest
106106
target: x86_64-apple-darwin
107107
name: macos-x86_64
108-
features: wgpu
108+
features: default
109109
- platform: macos-latest
110110
target: aarch64-apple-darwin
111111
name: macos-arm64
112-
features: wgpu
112+
features: default
113113
fail-fast: false
114114
runs-on: ${{ matrix.platform }}
115115
steps:

Cargo.lock

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "objdiff"
3-
version = "0.6.1"
3+
version = "0.7.0"
44
edition = "2021"
55
rust-version = "1.70"
66
authors = ["Luke Street <luke@street.dev>"]
@@ -19,7 +19,7 @@ lto = "thin"
1919
strip = "debuginfo"
2020

2121
[features]
22-
default = []
22+
default = ["wgpu", "wsl"]
2323
wgpu = ["eframe/wgpu"]
2424
wsl = []
2525

@@ -53,6 +53,7 @@ semver = "1.0.20"
5353
serde = { version = "1", features = ["derive"] }
5454
serde_json = "1.0.108"
5555
serde_yaml = "0.9.27"
56+
shell-escape = "0.1.5"
5657
similar = "2.3.0"
5758
tempfile = "3.8.1"
5859
thiserror = "1.0.50"

src/jobs/objdiff.rs

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,20 @@ use crate::{
1717

1818
pub struct BuildStatus {
1919
pub success: bool,
20-
pub log: String,
20+
pub cmdline: String,
21+
pub stdout: String,
22+
pub stderr: String,
23+
}
24+
25+
impl Default for BuildStatus {
26+
fn default() -> Self {
27+
BuildStatus {
28+
success: true,
29+
cmdline: String::new(),
30+
stdout: String::new(),
31+
stderr: String::new(),
32+
}
33+
}
2134
}
2235

2336
pub struct ObjDiffConfig {
@@ -88,16 +101,24 @@ fn run_make(cwd: &Path, arg: &Path, config: &ObjDiffConfig) -> BuildStatus {
88101
command.creation_flags(winapi::um::winbase::CREATE_NO_WINDOW);
89102
command
90103
};
104+
let mut cmdline =
105+
shell_escape::escape(command.get_program().to_string_lossy()).into_owned();
106+
for arg in command.get_args() {
107+
cmdline.push(' ');
108+
cmdline.push_str(shell_escape::escape(arg.to_string_lossy()).as_ref());
109+
}
91110
let output = command.output().context("Failed to execute build")?;
92111
let stdout = from_utf8(&output.stdout).context("Failed to process stdout")?;
93112
let stderr = from_utf8(&output.stderr).context("Failed to process stderr")?;
94113
Ok(BuildStatus {
95114
success: output.status.code().unwrap_or(-1) == 0,
96-
log: format!("{stdout}\n{stderr}"),
115+
cmdline,
116+
stdout: stdout.to_string(),
117+
stderr: stderr.to_string(),
97118
})
98119
})() {
99120
Ok(status) => status,
100-
Err(e) => BuildStatus { success: false, log: e.to_string() },
121+
Err(e) => BuildStatus { success: false, stderr: e.to_string(), ..Default::default() },
101122
}
102123
}
103124

@@ -150,7 +171,7 @@ fn run_build(
150171
)?;
151172
run_make(project_dir, target_path_rel, &config)
152173
}
153-
_ => BuildStatus { success: true, log: String::new() },
174+
_ => BuildStatus::default(),
154175
};
155176

156177
let second_status = match base_path_rel {
@@ -164,7 +185,7 @@ fn run_build(
164185
)?;
165186
run_make(project_dir, base_path_rel, &config)
166187
}
167-
_ => BuildStatus { success: true, log: String::new() },
188+
_ => BuildStatus::default(),
168189
};
169190

170191
let time = OffsetDateTime::now_utc();

src/views/config.rs

Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
#[cfg(feature = "wsl")]
1+
#[cfg(all(windows, feature = "wsl"))]
22
use std::string::FromUtf16Error;
33
use std::{
44
borrow::Cow,
55
mem::take,
66
path::{PathBuf, MAIN_SEPARATOR},
77
};
88

9-
#[cfg(feature = "wsl")]
9+
#[cfg(all(windows, feature = "wsl"))]
1010
use anyhow::{Context, Result};
1111
use const_format::formatcp;
1212
use egui::{
@@ -46,7 +46,7 @@ pub struct ConfigViewState {
4646
pub object_search: String,
4747
pub filter_diffable: bool,
4848
pub filter_incomplete: bool,
49-
#[cfg(feature = "wsl")]
49+
#[cfg(all(windows, feature = "wsl"))]
5050
pub available_wsl_distros: Option<Vec<String>>,
5151
pub file_dialog_state: FileDialogState,
5252
}
@@ -134,7 +134,7 @@ pub const DEFAULT_WATCH_PATTERNS: &[&str] = &[
134134
"*.inc", "*.py", "*.yml", "*.txt", "*.json",
135135
];
136136

137-
#[cfg(feature = "wsl")]
137+
#[cfg(all(windows, feature = "wsl"))]
138138
fn process_utf16(bytes: &[u8]) -> Result<String, FromUtf16Error> {
139139
let u16_bytes: Vec<u16> = bytes
140140
.chunks_exact(2)
@@ -143,7 +143,7 @@ fn process_utf16(bytes: &[u8]) -> Result<String, FromUtf16Error> {
143143
String::from_utf16(&u16_bytes)
144144
}
145145

146-
#[cfg(feature = "wsl")]
146+
#[cfg(all(windows, feature = "wsl"))]
147147
fn wsl_cmd(args: &[&str]) -> Result<String> {
148148
use std::{os::windows::process::CommandExt, process::Command};
149149
let output = Command::new("wsl")
@@ -154,7 +154,7 @@ fn wsl_cmd(args: &[&str]) -> Result<String> {
154154
process_utf16(&output.stdout).context("Failed to process stdout")
155155
}
156156

157-
#[cfg(feature = "wsl")]
157+
#[cfg(all(windows, feature = "wsl"))]
158158
fn fetch_wsl2_distros() -> Vec<String> {
159159
wsl_cmd(&["-l", "-q"])
160160
.map(|stdout| {
@@ -176,7 +176,6 @@ pub fn config_ui(
176176
) {
177177
let mut config_guard = config.write().unwrap();
178178
let AppConfig {
179-
selected_wsl_distro,
180179
target_obj_dir,
181180
base_obj_dir,
182181
selected_obj,
@@ -227,27 +226,6 @@ pub fn config_ui(
227226
}
228227
ui.separator();
229228

230-
#[cfg(feature = "wsl")]
231-
{
232-
ui.heading("Build");
233-
if state.available_wsl_distros.is_none() {
234-
state.available_wsl_distros = Some(fetch_wsl2_distros());
235-
}
236-
egui::ComboBox::from_label("Run in WSL2")
237-
.selected_text(selected_wsl_distro.as_ref().unwrap_or(&"Disabled".to_string()))
238-
.show_ui(ui, |ui| {
239-
ui.selectable_value(selected_wsl_distro, None, "Disabled");
240-
for distro in state.available_wsl_distros.as_ref().unwrap() {
241-
ui.selectable_value(selected_wsl_distro, Some(distro.clone()), distro);
242-
}
243-
});
244-
ui.separator();
245-
}
246-
#[cfg(not(feature = "wsl"))]
247-
{
248-
let _ = selected_wsl_distro;
249-
}
250-
251229
ui.horizontal(|ui| {
252230
ui.heading("Project");
253231
if ui.button(RichText::new("Settings")).clicked() {
@@ -649,6 +627,24 @@ fn split_obj_config_ui(
649627
config.custom_make = Some(custom_make_str);
650628
}
651629
}
630+
#[cfg(all(windows, feature = "wsl"))]
631+
{
632+
if state.available_wsl_distros.is_none() {
633+
state.available_wsl_distros = Some(fetch_wsl2_distros());
634+
}
635+
egui::ComboBox::from_label("Run in WSL2")
636+
.selected_text(config.selected_wsl_distro.as_ref().unwrap_or(&"Disabled".to_string()))
637+
.show_ui(ui, |ui| {
638+
ui.selectable_value(&mut config.selected_wsl_distro, None, "Disabled");
639+
for distro in state.available_wsl_distros.as_ref().unwrap() {
640+
ui.selectable_value(
641+
&mut config.selected_wsl_distro,
642+
Some(distro.clone()),
643+
distro,
644+
);
645+
}
646+
});
647+
}
652648
ui.separator();
653649

654650
if let Some(project_dir) = config.project_dir.clone() {

src/views/symbol_diff.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,11 +262,23 @@ fn symbol_list_ui(
262262

263263
fn build_log_ui(ui: &mut Ui, status: &BuildStatus, appearance: &Appearance) {
264264
ScrollArea::both().auto_shrink([false, false]).show(ui, |ui| {
265+
ui.horizontal(|ui| {
266+
if ui.button("Copy command").clicked() {
267+
ui.output_mut(|output| output.copied_text = status.cmdline.clone());
268+
}
269+
if ui.button("Copy log").clicked() {
270+
ui.output_mut(|output| {
271+
output.copied_text = format!("{}\n{}", status.stdout, status.stderr)
272+
});
273+
}
274+
});
265275
ui.scope(|ui| {
266276
ui.style_mut().override_text_style = Some(egui::TextStyle::Monospace);
267277
ui.style_mut().wrap = Some(false);
268278

269-
ui.colored_label(appearance.replace_color, &status.log);
279+
ui.label(&status.cmdline);
280+
ui.colored_label(appearance.replace_color, &status.stdout);
281+
ui.colored_label(appearance.delete_color, &status.stderr);
270282
});
271283
});
272284
}

0 commit comments

Comments
 (0)