From 0763a1024f44d98b8d9d65f57995da538e40963c Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Tue, 9 Dec 2025 11:10:19 +0000 Subject: [PATCH] feat: set rust-version in Cargo.toml, closes #77 Update zigbuild docker run command to download latest rust version --- .../workflows/create_release_and_build.yml | 12 ++++++-- Cargo.toml | 3 +- create_release.sh | 8 ++++-- src/app_data/container_state.rs | 10 +++---- src/app_data/mod.rs | 10 +++---- src/config/keymap_parser.rs | 10 +++---- src/config/mod.rs | 5 ++-- src/exec.rs | 28 ++++++------------- src/input_handler/mod.rs | 5 ++-- src/main.rs | 6 ++-- src/ui/draw_blocks/headers.rs | 5 ++-- src/ui/draw_blocks/mod.rs | 5 ++-- src/ui/mod.rs | 5 ++-- 13 files changed, 50 insertions(+), 62 deletions(-) diff --git a/.github/workflows/create_release_and_build.yml b/.github/workflows/create_release_and_build.yml index c737331..7daa5e3 100644 --- a/.github/workflows/create_release_and_build.yml +++ b/.github/workflows/create_release_and_build.yml @@ -47,11 +47,19 @@ jobs: - name: install cross run: cargo install cross --git https://github.com/cross-rs/cross - # Build binary for arm MacOS using Docker Zigbuild - name: build if: matrix.target == 'aarch64-apple-darwin' run: | - docker run --rm -v $(pwd):/io -w /io ghcr.io/rust-cross/cargo-zigbuild cargo zigbuild --release --target aarch64-apple-darwin + docker run --rm \ + -v "$(pwd):/io" \ + -w /io \ + ghcr.io/rust-cross/cargo-zigbuild \ + bash -ec ' + rustup update stable + rustup default stable + rustup target add aarch64-apple-darwin + cargo zigbuild --release --target aarch64-apple-darwin + ' # Build all other targets using Cross - name: build diff --git a/Cargo.toml b/Cargo.toml index a4f62b6..d2f8344 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,8 +7,7 @@ description = "A simple tui to view & control docker containers" repository = "https://github.com/mrjackwills/oxker" homepage = "https://github.com/mrjackwills/oxker" license = "MIT" -# This is stuck to whatever version cargo-zigbuild is using - https://github.com/rust-cross/cargo-zigbuild/blob/main/Dockerfile -rust-version = "1.87.0" +rust-version = "1.90.0" readme = "README.md" keywords = ["docker", "tui", "tokio", "terminal", "podman"] categories = ["command-line-utilities"] diff --git a/create_release.sh b/create_release.sh index 8b50e64..393ccbf 100755 --- a/create_release.sh +++ b/create_release.sh @@ -232,8 +232,12 @@ cross_build_x86_windows() { # Build, using zig-build, for Apple silicon zig_build_aarch64_apple() { # mkdir /workspace/oxker/target - echo -e "${YELLOW}docker run --rm -v $(pwd):/io -w /io ghcr.io/rust-cross/cargo-zigbuild cargo zigbuild --release --target aarch64-apple-darwin${RESET}" - docker run --rm -v "$(pwd):/io" -w /io ghcr.io/rust-cross/cargo-zigbuild cargo zigbuild --release --target aarch64-apple-darwin + echo -e "${YELLOW}docker run --rm -v $(pwd):/io -w /io ghcr.io/rust-cross/cargo-zigbuild bash -e -c 'rustup update stable && rustup default stable && rustup target add aarch64-apple-darwin && cargo zigbuild --release --target aarch64-apple-darwin${RESET}" + + docker run --rm -v "$(pwd):/io" -w /io \ + ghcr.io/rust-cross/cargo-zigbuild \ + bash -ec 'rustup update stable && rustup default stable && rustup target add aarch64-apple-darwin && cargo zigbuild --release --target aarch64-apple-darwin' + if ask_yn "sudo chown $(pwd)/target"; then echo -e "${YELLOW}sudo chown -R vscode:vscode $(pwd)/target${RESET}" sudo chown -R vscode:vscode "$(pwd)/target" diff --git a/src/app_data/container_state.rs b/src/app_data/container_state.rs index 11e39b3..bb722c8 100644 --- a/src/app_data/container_state.rs +++ b/src/app_data/container_state.rs @@ -689,12 +689,11 @@ impl Logs { if let Some(new_index) = match sd { ScrollDirection::Next => current_position.checked_add(1), ScrollDirection::Previous => current_position.checked_sub(1), - } { - if let Some(f) = self.search_results.get(new_index) { + } + && let Some(f) = self.search_results.get(new_index) { self.lines.state.select(Some(*f)); return Some(()); } - } } else { let range = match sd { ScrollDirection::Previous => (0..=current_selected).rev().collect::>(), @@ -922,11 +921,10 @@ impl Logs { /// Add a padding so one char will always be visilbe? pub fn forward(&mut self, width: u16) { let offset = usize::from(self.offset); - if self.horizontal_scroll_able(width) { - if self.adjusted_max_width > 0 && offset < self.adjusted_max_width { + if self.horizontal_scroll_able(width) + && self.adjusted_max_width > 0 && offset < self.adjusted_max_width { self.offset = self.offset.saturating_add(1); } - } } /// Reduce the char offset diff --git a/src/app_data/mod.rs b/src/app_data/mod.rs index 09080af..1772f38 100644 --- a/src/app_data/mod.rs +++ b/src/app_data/mod.rs @@ -172,11 +172,10 @@ impl AppData { } pub fn log_search_scroll(&mut self, np: &ScrollDirection) { - if let Some(i) = self.get_mut_selected_container() { - if i.logs.search_scroll(np).is_some() { + if let Some(i) = self.get_mut_selected_container() + && i.logs.search_scroll(np).is_some() { self.rerender.update_draw(); } - } } pub fn gen_log_search(&self) -> Option { @@ -340,14 +339,13 @@ impl AppData { /// Sort containers based on a given header, if headings match, and already ascending, remove sorting pub fn set_sort_by_header(&mut self, selected_header: Header) { let mut output = Some((selected_header, SortedOrder::Asc)); - if let Some((current_header, order)) = self.get_sorted() { - if current_header == selected_header { + if let Some((current_header, order)) = self.get_sorted() + && current_header == selected_header { match order { SortedOrder::Desc => output = None, SortedOrder::Asc => output = Some((selected_header, SortedOrder::Desc)), } } - } self.set_sorted(output); } diff --git a/src/config/keymap_parser.rs b/src/config/keymap_parser.rs index f75ff16..15c7f94 100644 --- a/src/config/keymap_parser.rs +++ b/src/config/keymap_parser.rs @@ -158,8 +158,8 @@ impl From> for Keymap { |vec_str: Option>, keymap_field: &mut (KeyCode, Option), keymap_clash: &mut HashSet| { - if let Some(vec_str) = vec_str { - if let Some(vec_keycode) = Self::try_parse_keycode(&vec_str) { + if let Some(vec_str) = vec_str + && let Some(vec_keycode) = Self::try_parse_keycode(&vec_str) { if let Some(first) = vec_keycode.first() { keymap_clash.insert(*first); counter += 1; @@ -173,7 +173,6 @@ impl From> for Keymap { keymap_field.1 = None; } } - } }; if let Some(ck) = value { @@ -276,8 +275,8 @@ impl Keymap { for key in input.iter().take(2) { if key.chars().count() == 1 { - if let Some(first_char) = key.chars().next() { - if let Some(first_char) = match first_char { + if let Some(first_char) = key.chars().next() + && let Some(first_char) = match first_char { x if x.is_ascii_alphabetic() || x.is_ascii_digit() => Some(first_char), '/' | '\\' | ',' | '.' | '#' | '\'' | '[' | ']' | ';' | '=' | '-' => { Some(first_char) @@ -286,7 +285,6 @@ impl Keymap { } { output.push(KeyCode::Char(first_char)); } - } } else { let keycode = match key.to_lowercase().as_str() { "f1" => Some(KeyCode::F(1)), diff --git a/src/config/mod.rs b/src/config/mod.rs index 699768e..2feff93 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -211,13 +211,12 @@ impl Config { let args = Args::parse(); let config_from_cli = Self::from(&args); - if let Some(config_file) = &args.config_file { - if let Some(config_file) = + if let Some(config_file) = &args.config_file + && let Some(config_file) = parse_config_file::ConfigFile::try_parse_from_file(config_file) { return Self::from(config_file).merge_args(config_from_cli); } - } if let Some(config_file) = parse_config_file::ConfigFile::try_parse(in_container) { return Self::from(config_file).merge_args(config_from_cli); diff --git a/src/exec.rs b/src/exec.rs index a1604b4..5a03065 100644 --- a/src/exec.rs +++ b/src/exec.rs @@ -161,15 +161,15 @@ impl ExecMode { let use_cli = app_data.lock().config.use_cli; let container = app_data.lock().get_selected_container_id_state_name(); - if let Some((id, state, _)) = container { - if [ + if let Some((id, state, _)) = container + && [ State::Running(RunningState::Healthy), State::Running(RunningState::Unhealthy), ] .contains(&state) { - if tty_readable() && !use_cli { - if let Ok(exec) = docker + if tty_readable() && !use_cli + && let Ok(exec) = docker .create_exec( id.get(), CreateExecOptions { @@ -180,34 +180,24 @@ impl ExecMode { }, ) .await - { - if let Ok(StartExecResults::Attached { mut output, .. }) = + && let Ok(StartExecResults::Attached { mut output, .. }) = docker.start_exec(&exec.id, None).await - { - if let Some(Ok(msg)) = output.next().await { - if !msg.to_string().starts_with(OCI_ERROR) { + && let Some(Ok(msg)) = output.next().await + && !msg.to_string().starts_with(OCI_ERROR) { return Some(Self::Internal(( Arc::new(id), Arc::clone(docker), ))); } - } - } - } - } if let Ok(output) = std::process::Command::new(command::DOCKER) .args([command::EXEC, id.get(), command::PWD]) .output() - { - if let Ok(output) = String::from_utf8(output.stdout) { - if !output.starts_with(OCI_ERROR) { + && let Ok(output) = String::from_utf8(output.stdout) + && !output.starts_with(OCI_ERROR) { return Some(Self::External(Arc::new(id))); } - } - } } - } None } diff --git a/src/input_handler/mod.rs b/src/input_handler/mod.rs index 000577b..690d5c8 100644 --- a/src/input_handler/mod.rs +++ b/src/input_handler/mod.rs @@ -178,8 +178,8 @@ impl InputHandler { async fn save_logs(&self) -> Result<(), Box> { let args = self.app_data.lock().config.clone(); let container = self.app_data.lock().get_selected_container_id_state_name(); - if let Some((id, _, name)) = container { - if let Some(log_path) = args.save_dir { + if let Some((id, _, name)) = container + && let Some(log_path) = args.save_dir { let (sx, rx) = tokio::sync::oneshot::channel(); self.docker_tx.send(DockerMessage::Exec(sx)).await?; @@ -230,7 +230,6 @@ impl InputHandler { .set_info_box(&format!("saved to {}", path.display())); } } - } Ok(()) } diff --git a/src/main.rs b/src/main.rs index 1459de9..fc8f259 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,3 @@ -#![allow(clippy::collapsible_if)] // #![allow(unused)] // Zigbuild is stuck on 1.87.0, which means Mac builds won't work when using collapsible ifs @@ -64,8 +63,8 @@ async fn docker_init( Docker::connect_with_socket(&host, 120, API_DEFAULT_VERSION) }); - if let Ok(docker) = connection { - if docker.ping().await.is_ok() { + if let Ok(docker) = connection + && docker.ping().await.is_ok() { tokio::spawn(DockerData::start( Arc::clone(app_data), docker, @@ -75,7 +74,6 @@ async fn docker_init( )); return; } - } app_data .lock() .set_error(AppError::DockerConnect, gui_state, Status::DockerConnect); diff --git a/src/ui/draw_blocks/headers.rs b/src/ui/draw_blocks/headers.rs index 0e24e22..1e2a60c 100644 --- a/src/ui/draw_blocks/headers.rs +++ b/src/ui/draw_blocks/headers.rs @@ -39,15 +39,14 @@ fn gen_header<'a>( fn gen_header_block<'a>(colors: AppColors, fd: &FrameData, header: Header) -> (Color, &'a str) { let mut color = colors.headers_bar.text; let mut suffix = ""; - if let Some((a, b)) = &fd.sorted_by { - if &header == a { + if let Some((a, b)) = &fd.sorted_by + && &header == a { match b { SortedOrder::Asc => suffix = " ▲", SortedOrder::Desc => suffix = " ▼", } color = colors.headers_bar.text_selected; } - } (color, suffix) } diff --git a/src/ui/draw_blocks/mod.rs b/src/ui/draw_blocks/mod.rs index 507a913..cbaa3d3 100644 --- a/src/ui/draw_blocks/mod.rs +++ b/src/ui/draw_blocks/mod.rs @@ -103,13 +103,12 @@ fn generate_block<'a>( .border_type(BorderType::Rounded) .title(ratatui::text::Line::from(title).left_aligned()); - if panel == SelectablePanel::Logs { - if let Some(x) = fd.scroll_title.as_ref() { + if panel == SelectablePanel::Logs + && let Some(x) = fd.scroll_title.as_ref() { block = block .title_bottom(x.to_owned()) .title_alignment(ratatui::layout::Alignment::Right); } - } if !fd.status.contains(&Status::Filter) { if fd.selected_panel == panel { block = block.border_style(Style::default().fg(colors.borders.selected)); diff --git a/src/ui/mod.rs b/src/ui/mod.rs index bb7a458..ab618cc 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -237,8 +237,8 @@ impl Ui { } } - if crossterm::event::poll(POLL_RATE).unwrap_or(false) { - if let Ok(event) = event::read() { + if crossterm::event::poll(POLL_RATE).unwrap_or(false) + && let Ok(event) = event::read() { if let Event::Key(key) = event { if key.kind == event::KeyEventKind::Press { self.input_tx @@ -264,7 +264,6 @@ impl Ui { self.gui_state.lock().set_screen_width(width); } } - } self.check_clear(); } Ok(())