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"