From 11d5ba361ee4c11d080f1c3c14d8bb677cbfd1fc Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Sat, 14 May 2022 22:48:10 +0000 Subject: [PATCH 01/24] docs: readme typo --- .devcontainer/Dockerfile | 2 +- .devcontainer/devcontainer.json | 4 ++-- CHANGELOG.md | 3 +++ README.md | 8 +++++--- create_release.sh | 0 src/ui/draw_blocks.rs | 2 +- 6 files changed, 12 insertions(+), 7 deletions(-) mode change 100755 => 100644 create_release.sh diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 755ba60..dec7caa 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -6,4 +6,4 @@ FROM mcr.microsoft.com/vscode/devcontainers/rust:0-${VARIANT} RUN printf "alias cls='clear'\nalias ll='ls -l --human-readable --color=auto --group-directories-first --classify --time-style=long-iso -all'" >> /etc/bash.bashrc -RUN apt-get update && apt-get -y install upx-ucl +# RUN apt-get update && apt-get -y install upx-ucl diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 1d4cc62..ed5301e 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -17,8 +17,8 @@ ], "mounts": [ - "source=/etc/timezone,target=/etc/timezone,type=bind,readonly", - "source=/ramdrive,target=/ramdrive,type=bind", + // //"source=/etc/timezone,target=/etc/timezone,type=bind,readonly", + "source=/dev/shm,target=/ramdrive,type=bind", "source=${localEnv:HOME}/.cargo/bin/cargo-watch,target=/usr/local/cargo/bin/cargo-watch,type=bind,readonly", "source=${localEnv:HOME}/.cargo/bin/cross,target=/usr/local/cargo/bin/cross,type=bind,readonly", ], diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f1bead..c536147 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +### Docs ++ Readme one-liner to download & install latest version, [] + # v0.0.4 ### 2022-05-08 diff --git a/README.md b/README.md index 082b1a0..8735c24 100644 --- a/README.md +++ b/README.md @@ -25,13 +25,15 @@ See releases -install +download & install (x86_64 one liner) ```bash -tar xzvf oxker_linux_x86_64.tar.gz oxker -install -Dm 755 oxker -t "${HOME}/.local/bin" +wget https://www.github.com/mrjackwills/oxker/releases/latest/download/oxker_linux_x86_64.tar.gz && +tar xzvf oxker_linux_x86_64.tar.gz oxker && +install -Dm 755 oxker -t "${HOME}/.local/bin" && rm oxker_linux_x86_64.tar.gz oxker ``` + ## Run ```oxker``` diff --git a/create_release.sh b/create_release.sh old mode 100755 new mode 100644 diff --git a/src/ui/draw_blocks.rs b/src/ui/draw_blocks.rs index 1d5cb01..4b5afe7 100644 --- a/src/ui/draw_blocks.rs +++ b/src/ui/draw_blocks.rs @@ -460,7 +460,7 @@ pub fn draw_help_box(f: &mut Frame<'_, B>) { let description_text = format!("\n{}", DESCRIPTION); let mut help_text = String::from("\n ( tab ) or ( alt+tab ) to change panels"); - help_text.push_str("\n ( ↑ ↓ ← → ) or ( j k ) to change selected line"); + help_text.push_str("\n ( ↑ ↓ ) or ( j k ) to change selected line"); help_text.push_str("\n ( enter ) to send docker container commands"); help_text.push_str("\n ( h ) to toggle this help information"); help_text.push_str( From e497f3f2d9e1dca99469860c2e728c99e29353ad Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Sun, 22 May 2022 12:14:52 +0000 Subject: [PATCH 02/24] fix: help panel text show pg/pgdown, home/end, in help panel --- src/ui/draw_blocks.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/draw_blocks.rs b/src/ui/draw_blocks.rs index 4b5afe7..bec51e4 100644 --- a/src/ui/draw_blocks.rs +++ b/src/ui/draw_blocks.rs @@ -460,7 +460,7 @@ pub fn draw_help_box(f: &mut Frame<'_, B>) { let description_text = format!("\n{}", DESCRIPTION); let mut help_text = String::from("\n ( tab ) or ( alt+tab ) to change panels"); - help_text.push_str("\n ( ↑ ↓ ) or ( j k ) to change selected line"); + help_text.push_str("\n ( ↑ ↓ ) or ( j k ) or (PgUp PgDown) or (Home End) to change selected line"); help_text.push_str("\n ( enter ) to send docker container commands"); help_text.push_str("\n ( h ) to toggle this help information"); help_text.push_str( From 7c7248a63a4c3c76dd674352192f13623098c565 Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Sun, 29 May 2022 23:59:20 +0000 Subject: [PATCH 03/24] docs: readme --- CHANGELOG.md | 5 ++++- README.md | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c536147..049df74 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ ### Docs -+ Readme one-liner to download & install latest version, [] ++ Readme one-liner to download & install latest version, [11d5ba361ee4c11d080f1c3c14d8bb677cbfd1fc] + +### Fixes ++ Help panel typo, [e497f3f2d9e1dca99469860c2e728c99e29353ad] # v0.0.4 ### 2022-05-08 diff --git a/README.md b/README.md index 8735c24..8d8db64 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,7 @@ using docker-compose.yml; or individually -```docker run --name redis -d redis:alpine3.15``` +```docker run --name redis -d redis:alpine3.16``` ```docker run --name postgres -e POSTGRES_PASSWORD=never_use_this_password_in_production -d postgres:alpine``` From 6dc0c8f67968e3aed689f64888b302fc554e321e Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Mon, 30 May 2022 00:14:28 +0000 Subject: [PATCH 04/24] fix: docker_data unwrap() use a match clause to remove an unwrap() from the network_stats section of update_container_stat --- src/docker_data/mod.rs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/docker_data/mod.rs b/src/docker_data/mod.rs index 71375ec..9bc69b5 100644 --- a/src/docker_data/mod.rs +++ b/src/docker_data/mod.rs @@ -34,8 +34,8 @@ impl DockerData { if stats.cpu_stats.system_cpu_usage.is_some() && stats.precpu_stats.system_cpu_usage.is_some() { - let system_delta = (stats.cpu_stats.system_cpu_usage.unwrap() - - stats.precpu_stats.system_cpu_usage.unwrap()) + let system_delta = (stats.cpu_stats.system_cpu_usage.unwrap_or(0) + - stats.precpu_stats.system_cpu_usage.unwrap_or(0)) as f64; let online_cpus = stats.cpu_stats.online_cpus.unwrap_or_else(|| { stats @@ -75,7 +75,7 @@ impl DockerData { let mem_stat = stats.memory_stats.usage.unwrap_or(0); let mem_limit = stats.memory_stats.limit.unwrap_or(0); - let key = if let Some(networks) = &stats.networks { + let some_key = if let Some(networks) = &stats.networks { networks.keys().next().map(|x| x.to_owned()) } else { None @@ -83,12 +83,14 @@ impl DockerData { let cpu_stats = Self::calculate_usage(&stats); - let (rx, tx) = if let Some(k) = key { - let ii = stats.networks.unwrap(); - let v = ii.get(&k).unwrap(); - (v.rx_bytes.to_owned(), v.tx_bytes.to_owned()) + let no_bytes = (0, 0); + let (rx, tx) = if let Some(key) = some_key { + match stats.networks.unwrap_or_default().get(&key) { + Some(data) => (data.rx_bytes.to_owned(), data.tx_bytes.to_owned()), + None => no_bytes, + } } else { - (0, 0) + no_bytes }; if is_running { From 108c457e278701c5e7a4348c2b638247a111d0b2 Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Mon, 30 May 2022 00:15:38 +0000 Subject: [PATCH 05/24] fix: app_data unwrap() removal update_log_by_index replaced unwrap with unwrap_or_default, for a usize --- src/app_data/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app_data/mod.rs b/src/app_data/mod.rs index 06dc806..c101a0e 100644 --- a/src/app_data/mod.rs +++ b/src/app_data/mod.rs @@ -379,7 +379,7 @@ impl AppData { container.logs.items.push(ListItem::new(lines)); }); if container.logs.state.selected().is_none() - || container.logs.state.selected().unwrap() + 1 == current_len + || container.logs.state.selected().unwrap_or_default() + 1 == current_len { container.logs.end(); } From dc063a2b87d99c48295d86159ec0c7862c1fb43c Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Mon, 30 May 2022 00:18:36 +0000 Subject: [PATCH 06/24] fix: docker_data remove unwrap() change update_all_containers unwrap with unwrap_or_default() --- src/docker_data/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/docker_data/mod.rs b/src/docker_data/mod.rs index 9bc69b5..1bd9383 100644 --- a/src/docker_data/mod.rs +++ b/src/docker_data/mod.rs @@ -133,7 +133,7 @@ impl DockerData { ..Default::default() })) .await - .unwrap(); + .unwrap_or_default(); let mut output = vec![]; // iter over containers, to only send ones which have an id, as use ID for extensivley! From ad43f69152d51ae2afc6ff2091b6c88db4377383 Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Mon, 30 May 2022 00:27:11 +0000 Subject: [PATCH 07/24] fix: docker_data remove unwrap() change update_all_containers unwrap with unwrap_or, and use a filter_map on output vec --- src/docker_data/mod.rs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/docker_data/mod.rs b/src/docker_data/mod.rs index 1bd9383..1f0dd8b 100644 --- a/src/docker_data/mod.rs +++ b/src/docker_data/mod.rs @@ -145,11 +145,13 @@ impl DockerData { self.app_data.lock().update_containers(&output); output .iter() - .map(|i| { - ( - i.state.as_ref().unwrap() == "running", - i.id.as_ref().unwrap().to_owned(), - ) + .filter_map(|i| { + i.id.as_ref().map(|id| ( + i.state.as_ref().unwrap_or(&String::new()) == "running", + id.to_owned(), + )) + + }) .collect::>() } From fc39aea5820353e8ee82e8ed2dd12a088f8acfc2 Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Mon, 30 May 2022 00:44:40 +0000 Subject: [PATCH 08/24] refactor: input m_button replace is_some() with a if let Some(), and improve comments --- src/input_handler/mod.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/input_handler/mod.rs b/src/input_handler/mod.rs index f0b90e8..5c1135e 100644 --- a/src/input_handler/mod.rs +++ b/src/input_handler/mod.rs @@ -101,9 +101,14 @@ impl InputHandler { let gui_state = Arc::clone(&self.gui_state); - if self.info_sleep.is_some() { - self.info_sleep.as_ref().unwrap().abort() + // If the info box sleep handle is currently being executed, as in m is pressed twice within a 4000ms window + // then cancel the first handle, as a new handle will be invoked + if let Some(info_sleep_timer) = self.info_sleep.as_ref() { + info_sleep_timer.abort(); } + + // Some(self.info_sleep).as_ref().unwrap().ab + self.info_sleep = Some(tokio::spawn(async move { tokio::time::sleep(std::time::Duration::from_millis(4000)).await; gui_state.lock().reset_info_box() From 3a7e3974f55b00a0780601e2b1b0eb96e78c62b6 Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Mon, 30 May 2022 01:00:45 +0000 Subject: [PATCH 09/24] refactor: cargo fmt --- src/docker_data/mod.rs | 12 ++++++------ src/input_handler/mod.rs | 14 ++++++-------- src/ui/draw_blocks.rs | 3 ++- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/docker_data/mod.rs b/src/docker_data/mod.rs index 1f0dd8b..0074d1e 100644 --- a/src/docker_data/mod.rs +++ b/src/docker_data/mod.rs @@ -146,12 +146,12 @@ impl DockerData { output .iter() .filter_map(|i| { - i.id.as_ref().map(|id| ( - i.state.as_ref().unwrap_or(&String::new()) == "running", - id.to_owned(), - )) - - + i.id.as_ref().map(|id| { + ( + i.state.as_ref().unwrap_or(&String::new()) == "running", + id.to_owned(), + ) + }) }) .collect::>() } diff --git a/src/input_handler/mod.rs b/src/input_handler/mod.rs index 5c1135e..c69f61d 100644 --- a/src/input_handler/mod.rs +++ b/src/input_handler/mod.rs @@ -99,16 +99,14 @@ impl InputHandler { } }; - let gui_state = Arc::clone(&self.gui_state); - - // If the info box sleep handle is currently being executed, as in m is pressed twice within a 4000ms window - // then cancel the first handle, as a new handle will be invoked - if let Some(info_sleep_timer) = self.info_sleep.as_ref() { - info_sleep_timer.abort(); + // If the info box sleep handle is currently being executed, as in m is pressed twice within a 4000ms window + // then cancel the first handle, as a new handle will be invoked + if let Some(info_sleep_timer) = self.info_sleep.as_ref() { + info_sleep_timer.abort(); } - // Some(self.info_sleep).as_ref().unwrap().ab - + let gui_state = Arc::clone(&self.gui_state); + // Show the info box - with "mouse capture enabled / disabled", for 4000 ms self.info_sleep = Some(tokio::spawn(async move { tokio::time::sleep(std::time::Duration::from_millis(4000)).await; gui_state.lock().reset_info_box() diff --git a/src/ui/draw_blocks.rs b/src/ui/draw_blocks.rs index bec51e4..0fe2370 100644 --- a/src/ui/draw_blocks.rs +++ b/src/ui/draw_blocks.rs @@ -460,7 +460,8 @@ pub fn draw_help_box(f: &mut Frame<'_, B>) { let description_text = format!("\n{}", DESCRIPTION); let mut help_text = String::from("\n ( tab ) or ( alt+tab ) to change panels"); - help_text.push_str("\n ( ↑ ↓ ) or ( j k ) or (PgUp PgDown) or (Home End) to change selected line"); + help_text + .push_str("\n ( ↑ ↓ ) or ( j k ) or (PgUp PgDown) or (Home End) to change selected line"); help_text.push_str("\n ( enter ) to send docker container commands"); help_text.push_str("\n ( h ) to toggle this help information"); help_text.push_str( From 9573512e92208ee816002e8ff693f6dda27eda9e Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Mon, 30 May 2022 01:10:08 +0000 Subject: [PATCH 10/24] fix: enable stopping restarting containers Show stop for restartig containers, so that if a container is in a restart loop can stop the loop --- src/app_data/container_state.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app_data/container_state.rs b/src/app_data/container_state.rs index aca3744..4c1ec93 100644 --- a/src/app_data/container_state.rs +++ b/src/app_data/container_state.rs @@ -160,6 +160,7 @@ impl DockerControls { match state { State::Dead | State::Exited => vec![Self::Start, Self::Restart], State::Paused => vec![Self::Unpause, Self::Stop], + State::Restarting => vec![Self::Stop], State::Running => vec![Self::Pause, Self::Restart, Self::Stop], _ => vec![], } From c5c859d6b6d91ca4b9ee8ed8127168e314651ed8 Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Mon, 30 May 2022 01:11:54 +0000 Subject: [PATCH 11/24] refactor: input_handler unwraps() feat: disregarding docker command errors replace if_some() +unwrap() with if let Some(). Docker commands unwrap() replace with unwrap_or(()) --- src/input_handler/mod.rs | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/input_handler/mod.rs b/src/input_handler/mod.rs index c69f61d..d8b863e 100644 --- a/src/input_handler/mod.rs +++ b/src/input_handler/mod.rs @@ -179,39 +179,37 @@ impl InputHandler { // Does is matter though? let panel = self.gui_state.lock().selected_panel; if panel == SelectablePanel::Commands { - let command = self.app_data.lock().get_docker_command(); + let option_command = self.app_data.lock().get_docker_command(); - if command.is_some() { - let id = self.app_data.lock().get_selected_container_id(); - if id.is_some() { - let id = id.unwrap(); - match command.unwrap() { - // TODO handle theses errors? + if let Some(command) = option_command { + let option_id = self.app_data.lock().get_selected_container_id(); + if let Some(id) = option_id { + match command { DockerControls::Pause => self .docker_sender .send(DockerMessage::Pause(id)) .await - .unwrap(), + .unwrap_or(()), DockerControls::Unpause => self .docker_sender .send(DockerMessage::Unpause(id)) .await - .unwrap(), + .unwrap_or(()), DockerControls::Start => self .docker_sender .send(DockerMessage::Start(id)) .await - .unwrap(), + .unwrap_or(()), DockerControls::Stop => self .docker_sender .send(DockerMessage::Stop(id)) .await - .unwrap(), + .unwrap_or(()), DockerControls::Restart => self .docker_sender .send(DockerMessage::Restart(id)) .await - .unwrap(), + .unwrap_or(()), } } } From 846fb60131c87f33d7c3863f9d754976d13df457 Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Mon, 30 May 2022 01:19:37 +0000 Subject: [PATCH 12/24] fix: docker data remove unwrap() use filter_map in update_containers iter, rather than map(i.unwrap()) --- src/app_data/mod.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/app_data/mod.rs b/src/app_data/mod.rs index c101a0e..a93c1da 100644 --- a/src/app_data/mod.rs +++ b/src/app_data/mod.rs @@ -99,9 +99,9 @@ impl AppData { self.error = Some(error); } - /// Find the if of the currently selected container - /// If any containers on system, will always return - /// Only returns None when no containers found + /// Find the if of the currently selected container. + /// If any containers on system, will always return a string. + /// Only returns None when no containers found. pub fn get_selected_container_id(&self) -> Option { let mut output = None; if let Some(index) = self.containers.state.selected() { @@ -296,7 +296,7 @@ impl AppData { for (index, id) in all_ids.iter().enumerate() { if !containers .iter() - .map(|i| i.id.as_ref().unwrap()) + .filter_map(|i| i.id.as_ref()) .any(|x| x == id) { // If removed container is currently selected, then change selected to previous From d68285a2331e7493780feab6c084fe28e0583eef Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Mon, 30 May 2022 01:30:24 +0000 Subject: [PATCH 13/24] fix: remove unwraps() update_containers use an if let Some() instead of an unwrtap().to_owned() --- src/app_data/mod.rs | 92 +++++++++++++++++++++++---------------------- 1 file changed, 47 insertions(+), 45 deletions(-) diff --git a/src/app_data/mod.rs b/src/app_data/mod.rs index a93c1da..5e6863a 100644 --- a/src/app_data/mod.rs +++ b/src/app_data/mod.rs @@ -310,54 +310,56 @@ impl AppData { } for i in containers.iter() { - let id = i.id.as_ref().unwrap().to_owned(); - let mut name = i - .names - .as_ref() - .unwrap_or(&vec!["".to_owned()]) - .get(0) - .unwrap() - .to_owned(); - if let Some(c) = name.chars().next() { - if c == '/' { - name.remove(0); + if let Some(id) = i.id.as_ref() { + let mut name = i + .names + .as_ref() + .unwrap_or(&vec!["".to_owned()]) + .get(0) + .unwrap() + .to_owned(); + if let Some(c) = name.chars().next() { + if c == '/' { + name.remove(0); + } } - } - let state = State::from(i.state.as_ref().unwrap_or(&"dead".to_owned()).trim()); - let status = i - .status - .as_ref() - .unwrap_or(&"".to_owned()) - .trim() - .to_owned(); - let image = i.image.as_ref().unwrap_or(&"".to_owned()).trim().to_owned(); - if let Some(current_container) = self.get_container_by_id(&id) { - if current_container.name != name { - current_container.name = name - }; - if current_container.status != status { - current_container.status = status - }; - if current_container.state != state { - current_container.docker_controls.items = DockerControls::gen_vec(&state); - - // Update the list state, needs to be None if the gen_vec returns an empty vec - match state { - State::Removing | State::Restarting | State::Unknown => { - current_container.docker_controls.state.select(None) - } - _ => current_container.docker_controls.start(), + let state = State::from(i.state.as_ref().unwrap_or(&"dead".to_owned()).trim()); + let status = i + .status + .as_ref() + .unwrap_or(&"".to_owned()) + .trim() + .to_owned(); + let image = i.image.as_ref().unwrap_or(&"".to_owned()).trim().to_owned(); + if let Some(current_container) = self.get_container_by_id(id) { + if current_container.name != name { + current_container.name = name }; - current_container.state = state; - }; - if current_container.image != image { - current_container.image = image - }; - } else { - let mut container = ContainerItem::new(id, status, image, state, name); - container.logs.end(); - self.containers.items.push(container); + if current_container.status != status { + current_container.status = status + }; + if current_container.state != state { + current_container.docker_controls.items = DockerControls::gen_vec(&state); + + // Update the list state, needs to be None if the gen_vec returns an empty vec + match state { + State::Removing | State::Restarting | State::Unknown => { + current_container.docker_controls.state.select(None) + } + _ => current_container.docker_controls.start(), + }; + current_container.state = state; + }; + if current_container.image != image { + current_container.image = image + }; + } else { + let mut container = + ContainerItem::new(id.to_owned(), status, image, state, name); + container.logs.end(); + self.containers.items.push(container); + } } } } From 78dca39a65c3b19facae7c03fa45635adbf840b8 Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Mon, 30 May 2022 01:39:15 +0000 Subject: [PATCH 14/24] fix: ui unwraps() replace unwraps with if let Ok() and unwrap_or(()) --- src/ui/mod.rs | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/src/ui/mod.rs b/src/ui/mod.rs index fcec35d..8a41d72 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -58,13 +58,13 @@ pub async fn create_ui( ) .await; - disable_raw_mode().unwrap(); + disable_raw_mode().unwrap_or(()); execute!( terminal.backend_mut(), LeaveAlternateScreen, DisableMouseCapture )?; - terminal.show_cursor().unwrap(); + terminal.show_cursor().unwrap_or(()); if let Err(err) = res { println!("{}", err); @@ -105,26 +105,27 @@ async fn run_app( let mut now = Instant::now(); loop { terminal.draw(|f| ui(f, &app_data, &gui_state)).unwrap(); - if crossterm::event::poll(input_poll_rate).unwrap() { - let event = event::read().unwrap(); - if let Event::Key(key) = event { - sender - .send(InputMessages::ButtonPress(key.code)) - .await - .unwrap_or(()); - } else if let Event::Mouse(m) = event { - sender - .send(InputMessages::MouseEvent(m)) - .await - .unwrap_or(()); - } else if let Event::Resize(_, _) = event { - gui_state.lock().clear_area_map(); - terminal.autoresize().unwrap_or(()); + if crossterm::event::poll(input_poll_rate).unwrap_or_default() { + if let Ok(event) = event::read() { + if let Event::Key(key) = event { + sender + .send(InputMessages::ButtonPress(key.code)) + .await + .unwrap_or(()); + } else if let Event::Mouse(m) = event { + sender + .send(InputMessages::MouseEvent(m)) + .await + .unwrap_or(()); + } else if let Event::Resize(_, _) = event { + gui_state.lock().clear_area_map(); + terminal.autoresize().unwrap_or(()); + } } } if now.elapsed() >= update_duration { - docker_sx.send(DockerMessage::Update).await.unwrap(); + docker_sx.send(DockerMessage::Update).await.unwrap_or(()); now = Instant::now(); } From 9c0e98a1d7a001ab2472ae54bd976581e9cb1341 Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Mon, 30 May 2022 02:05:56 +0000 Subject: [PATCH 15/24] docs: changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 049df74..064adf5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ + Readme one-liner to download & install latest version, [11d5ba361ee4c11d080f1c3c14d8bb677cbfd1fc] ### Fixes ++ Remove + replace as many unwrap()'s as possible, [d8e22d7444965f1874d7367259310440a889432b] + Help panel typo, [e497f3f2d9e1dca99469860c2e728c99e29353ad] # v0.0.4 From 63b7de5345e07d72b87e4ef9b66f0c6e282df86c Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Mon, 30 May 2022 02:13:17 +0000 Subject: [PATCH 16/24] fix: out of bounds error, closes [#8] use .is_some() and if let Some() to make sure that container indexes are still valid, without can cause out of bounds issue due to docker update frequencies --- src/app_data/container_state.rs | 2 +- src/app_data/mod.rs | 6 ++-- src/ui/draw_blocks.rs | 58 ++++++++++++++++++--------------- 3 files changed, 36 insertions(+), 30 deletions(-) diff --git a/src/app_data/container_state.rs b/src/app_data/container_state.rs index 4c1ec93..8c5952a 100644 --- a/src/app_data/container_state.rs +++ b/src/app_data/container_state.rs @@ -160,7 +160,7 @@ impl DockerControls { match state { State::Dead | State::Exited => vec![Self::Start, Self::Restart], State::Paused => vec![Self::Unpause, Self::Stop], - State::Restarting => vec![Self::Stop], + State::Restarting => vec![Self::Stop], State::Running => vec![Self::Pause, Self::Restart, Self::Stop], _ => vec![], } diff --git a/src/app_data/mod.rs b/src/app_data/mod.rs index 5e6863a..76b2022 100644 --- a/src/app_data/mod.rs +++ b/src/app_data/mod.rs @@ -304,8 +304,10 @@ impl AppData { if self.containers.state.selected().is_some() { self.containers.previous(); } - // docker rm -f $(docker ps -aq) will cause this to crash - self.containers.items.remove(index); + // Check is some, else can cause out of bounds error, if containers get removed before a docker update + if self.containers.items.get(index).is_some() { + self.containers.items.remove(index); + } } } diff --git a/src/ui/draw_blocks.rs b/src/ui/draw_blocks.rs index 0fe2370..27f2302 100644 --- a/src/ui/draw_blocks.rs +++ b/src/ui/draw_blocks.rs @@ -265,36 +265,40 @@ pub fn draw_chart( .direction(Direction::Horizontal) .constraints([Constraint::Percentage(50), Constraint::Percentage(50)].as_ref()) .split(area); - let (cpu, mem) = app_data.lock().containers.items[index].get_chart_data(); - let cpu_dataset = vec![Dataset::default() - .marker(symbols::Marker::Dot) - .style(Style::default().fg(Color::Magenta)) - .graph_type(GraphType::Line) - .data(&cpu.0)]; + // Check is some, else can cause out of bounds error, if containers get removed before a docker update + if let Some(data) = app_data.lock().containers.items.get(index) { + let (cpu, mem) = data.get_chart_data(); - let mem_dataset = vec![Dataset::default() - .marker(symbols::Marker::Dot) - .style(Style::default().fg(Color::Cyan)) - .graph_type(GraphType::Line) - .data(&mem.0)]; - let cpu_chart = make_chart( - cpu.2, - String::from("cpu"), - cpu_dataset, - CpuStats::new(cpu.0.last().unwrap_or(&(0.00, 0.00)).1), - cpu.1, - ); - let mem_chart = make_chart( - mem.2, - String::from("memory"), - mem_dataset, - ByteStats::new(mem.0.last().unwrap_or(&(0.0, 0.0)).1 as u64), - mem.1, - ); + let cpu_dataset = vec![Dataset::default() + .marker(symbols::Marker::Dot) + .style(Style::default().fg(Color::Magenta)) + .graph_type(GraphType::Line) + .data(&cpu.0)]; - f.render_widget(cpu_chart, area[0]); - f.render_widget(mem_chart, area[1]); + let mem_dataset = vec![Dataset::default() + .marker(symbols::Marker::Dot) + .style(Style::default().fg(Color::Cyan)) + .graph_type(GraphType::Line) + .data(&mem.0)]; + let cpu_chart = make_chart( + cpu.2, + String::from("cpu"), + cpu_dataset, + CpuStats::new(cpu.0.last().unwrap_or(&(0.00, 0.00)).1), + cpu.1, + ); + let mem_chart = make_chart( + mem.2, + String::from("memory"), + mem_dataset, + ByteStats::new(mem.0.last().unwrap_or(&(0.0, 0.0)).1 as u64), + mem.1, + ); + + f.render_widget(cpu_chart, area[0]); + f.render_widget(mem_chart, area[1]); + } } } From 9ce796f31d9a5cb67a8231190028bb1481027817 Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Mon, 30 May 2022 02:15:15 +0000 Subject: [PATCH 17/24] docs: changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 064adf5..b8cbf5a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ + Readme one-liner to download & install latest version, [11d5ba361ee4c11d080f1c3c14d8bb677cbfd1fc] ### Fixes ++ use Some() checks to make sure that container item indexes are still valid, else can create out-of-bounds errors, closes [#8], [4cf02e3f04426ef44ec5a7421687f2104ac5102f] + Remove + replace as many unwrap()'s as possible, [d8e22d7444965f1874d7367259310440a889432b] + Help panel typo, [e497f3f2d9e1dca99469860c2e728c99e29353ad] From 98c83f2f68f59e78f0c78270c59886630d98913c Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Mon, 30 May 2022 02:19:18 +0000 Subject: [PATCH 18/24] docs: bump docker-compose image versions use alpine 3.16 for redis & postgres in example docker-compose file --- docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 933b3ea..fd6905e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -4,7 +4,7 @@ networks: name: oxker-examaple-net services: postgres: - image: postgres:alpine + image: postgres:alpine3.16 container_name: postgres environment: - POSTGRES_PASSWORD=never_use_this_password_in_production @@ -18,7 +18,7 @@ services: limits: memory: 128M redis: - image: redis:alpine + image: redis:alpine3.16 container_name: redis ipc: private restart: always From 2ad9cbead9cbc724c74fbf1b473dab4f6ddafffb Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Mon, 30 May 2022 02:19:57 +0000 Subject: [PATCH 19/24] docs: CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b8cbf5a..f55423f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ ### Docs + Readme one-liner to download & install latest version, [11d5ba361ee4c11d080f1c3c14d8bb677cbfd1fc] ++ Example docker-compose.yml bump alpine version to 3.16, [98c83f2f68f59e78f0c78270c59886630d98913c] ### Fixes + use Some() checks to make sure that container item indexes are still valid, else can create out-of-bounds errors, closes [#8], [4cf02e3f04426ef44ec5a7421687f2104ac5102f] From b8b7bda32ddaeafd53c1c9148aaee49c018faa08 Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Mon, 30 May 2022 02:28:27 +0000 Subject: [PATCH 20/24] fix: core::fmt > std::fmt --- src/app_error.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app_error.rs b/src/app_error.rs index d6111cd..1f2d889 100644 --- a/src/app_error.rs +++ b/src/app_error.rs @@ -1,5 +1,5 @@ use crate::app_data::DockerControls; -use core::fmt; +use std::fmt; /// app errors to set in global state #[allow(unused)] From 28555d25b2cfaa765ed936ac25b0022bb15ba1f9 Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Mon, 30 May 2022 02:28:45 +0000 Subject: [PATCH 21/24] refactor: unwrap > unwrap_or --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index 2b38183..e94064a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -90,6 +90,6 @@ async fn main() { update_duration, ) .await - .unwrap(); + .unwrap_or(()) } } From f9075519ed80aa58c2360c2b3cce0e6daa4e6058 Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Mon, 30 May 2022 02:31:20 +0000 Subject: [PATCH 22/24] refactor: cargo fmt --- src/app_data/container_state.rs | 2 +- src/app_data/mod.rs | 2 +- src/ui/draw_blocks.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app_data/container_state.rs b/src/app_data/container_state.rs index 8c5952a..7f9bfdd 100644 --- a/src/app_data/container_state.rs +++ b/src/app_data/container_state.rs @@ -277,7 +277,7 @@ impl Stats for ByteStats { } } -// convert from bytes to kb, mb, gb etc +// convert from bytes to kB, MB, GB etc impl fmt::Display for ByteStats { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { let one_kb = 1000.0; diff --git a/src/app_data/mod.rs b/src/app_data/mod.rs index 76b2022..e39a7ec 100644 --- a/src/app_data/mod.rs +++ b/src/app_data/mod.rs @@ -304,7 +304,7 @@ impl AppData { if self.containers.state.selected().is_some() { self.containers.previous(); } - // Check is some, else can cause out of bounds error, if containers get removed before a docker update + // Check is some, else can cause out of bounds error, if containers get removed before a docker update if self.containers.items.get(index).is_some() { self.containers.items.remove(index); } diff --git a/src/ui/draw_blocks.rs b/src/ui/draw_blocks.rs index 27f2302..38d34b2 100644 --- a/src/ui/draw_blocks.rs +++ b/src/ui/draw_blocks.rs @@ -266,7 +266,7 @@ pub fn draw_chart( .constraints([Constraint::Percentage(50), Constraint::Percentage(50)].as_ref()) .split(area); - // Check is some, else can cause out of bounds error, if containers get removed before a docker update + // Check is some, else can cause out of bounds error, if containers get removed before a docker update if let Some(data) = app_data.lock().containers.items.get(index) { let (cpu, mem) = data.get_chart_data(); From 666e22e45438240a3ce2b06171490f5451129ab6 Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Mon, 30 May 2022 02:35:34 +0000 Subject: [PATCH 23/24] fix: chmod create_release.sh --- create_release.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 create_release.sh diff --git a/create_release.sh b/create_release.sh old mode 100644 new mode 100755 From 643e6e8cc5e92cd66112112862cafe1845463aac Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Mon, 30 May 2022 02:36:07 +0000 Subject: [PATCH 24/24] chore: release v0.0.5 --- .github/release-body.md | 10 ++++++++-- CHANGELOG.md | 13 ++++++++----- Cargo.toml | 2 +- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/.github/release-body.md b/.github/release-body.md index 73f27d7..77dcf87 100644 --- a/.github/release-body.md +++ b/.github/release-body.md @@ -1,7 +1,13 @@ -### 2022-05-08 +### 2022-05-30 + +### Docs ++ Readme one-liner to download & install latest version, [11d5ba361ee4c11d080f1c3c14d8bb677cbfd1fc] ++ Example docker-compose.yml bump alpine version to 3.16, [98c83f2f68f59e78f0c78270c59886630d98913c] ### Fixes -+ Help menu logo corrected, [2f5452027e86f714729b804d4bf65306e755df7f] ++ use Some() checks to make sure that container item indexes are still valid, else can create out-of-bounds errors, closes [#8], [4cf02e3f04426ef44ec5a7421687f2104ac5102f] ++ Remove + replace as many unwrap()'s as possible, [d8e22d7444965f1874d7367259310440a889432b] ++ Help panel typo, [e497f3f2d9e1dca99469860c2e728c99e29353ad] see CHANGELOG.md for more details diff --git a/CHANGELOG.md b/CHANGELOG.md index f55423f..56b9ffd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,11 +1,14 @@ +# v0.0.5 +### 2022-05-30 + ### Docs -+ Readme one-liner to download & install latest version, [11d5ba361ee4c11d080f1c3c14d8bb677cbfd1fc] -+ Example docker-compose.yml bump alpine version to 3.16, [98c83f2f68f59e78f0c78270c59886630d98913c] ++ Readme one-liner to download & install latest version, [11d5ba36](https://github.com/mrjackwills/oxker/commit/11d5ba361ee4c11d080f1c3c14d8bb677cbfd1fc), ++ Example docker-compose.yml bump alpine version to 3.16, [98c83f2f](https://github.com/mrjackwills/oxker/commit/98c83f2f68f59e78f0c78270c59886630d98913c), ### Fixes -+ use Some() checks to make sure that container item indexes are still valid, else can create out-of-bounds errors, closes [#8], [4cf02e3f04426ef44ec5a7421687f2104ac5102f] -+ Remove + replace as many unwrap()'s as possible, [d8e22d7444965f1874d7367259310440a889432b] -+ Help panel typo, [e497f3f2d9e1dca99469860c2e728c99e29353ad] ++ use Some() checks to make sure that container item indexes are still valid, else can create out-of-bounds errors, closes [#8](https://github.com/mrjackwills/oxker/issues/8), [4cf02e3f](https://github.com/mrjackwills/oxker/commit/4cf02e3f04426ef44ec5a7421687f2104ac5102f), ++ Remove + replace as many unwrap()'s as possible, [d8e22d74](https://github.com/mrjackwills/oxker/commit/d8e22d7444965f1874d7367259310440a889432b), ++ Help panel typo, [e497f3f2](https://github.com/mrjackwills/oxker/commit/e497f3f2d9e1dca99469860c2e728c99e29353ad), # v0.0.4 ### 2022-05-08 diff --git a/Cargo.toml b/Cargo.toml index 5f7a2ed..66c0e4f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "oxker" -version = "0.0.4" +version = "0.0.5" edition = "2021" authors = ["Jack Wills "] description = "a simple tui to view & control docker containers"