From 9b09146aadae5727a5fee4de5fe0c1d70c581c22 Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Mon, 2 Jan 2023 03:53:35 +0000 Subject: [PATCH 01/10] chore: dependencies updated --- Cargo.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8f4f2e6..2776d80 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -540,9 +540,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" +checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66" [[package]] name = "os_str_bytes" @@ -558,7 +558,7 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "oxker" -version = "0.1.9" +version = "0.1.10" dependencies = [ "anyhow", "bollard", @@ -724,9 +724,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.36.5" +version = "0.36.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3807b5d10909833d3e9acd1eb5fb988f79376ff10fce42937de71a449c4c588" +checksum = "4feacf7db682c6c329c4ede12649cd36ecab0f3be5b7d74e6a20304725db4549" dependencies = [ "bitflags", "errno", @@ -750,18 +750,18 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "serde" -version = "1.0.151" +version = "1.0.152" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fed41fc1a24994d044e6db6935e69511a1153b52c15eb42493b26fa87feba0" +checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.151" +version = "1.0.152" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "255abe9a125a985c05190d687b320c12f9b1f0b99445e608c21ba0782c719ad8" +checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" dependencies = [ "proc-macro2", "quote", From 3cdc5fae02097628799209f371ae9292e513e76c Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Tue, 3 Jan 2023 04:43:43 +0000 Subject: [PATCH 02/10] refactor: input sort executed in app_data struct `sort_by_header()` --- src/input_handler/mod.rs | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/src/input_handler/mod.rs b/src/input_handler/mod.rs index 77f4204..93a3110 100644 --- a/src/input_handler/mod.rs +++ b/src/input_handler/mod.rs @@ -18,7 +18,7 @@ use tui::layout::Rect; mod message; use crate::{ - app_data::{AppData, DockerControls, Header, SortedOrder}, + app_data::{AppData, DockerControls, Header}, app_error::AppError, docker_data::DockerMessage, ui::{GuiState, SelectablePanel, Status}, @@ -121,19 +121,9 @@ impl InputHandler { self.mouse_capture = !self.mouse_capture; } - /// Sort containers based on a given header, if headings match, and already ascending, remove sorting + /// Sort the containers by a given header fn sort(&self, selected_header: Header) { - let mut locked_data = self.app_data.lock(); - let mut output = Some((selected_header, SortedOrder::Asc)); - if let Some((current_header, order)) = locked_data.get_sorted() { - if current_header == selected_header { - match order { - SortedOrder::Desc => output = None, - SortedOrder::Asc => output = Some((selected_header, SortedOrder::Desc)), - } - } - } - locked_data.set_sorted(output); + self.app_data.lock().set_sort_by_header(selected_header); } /// Send a quit message to docker, to abort all spawns, if an error is returned, set is_running to false here instead @@ -173,7 +163,7 @@ impl InputHandler { } } else { match key_code { - KeyCode::Char('0') => self.app_data.lock().set_sorted(None), + KeyCode::Char('0') => self.app_data.lock().reset_sorted(), KeyCode::Char('1') => self.sort(Header::State), KeyCode::Char('2') => self.sort(Header::Status), KeyCode::Char('3') => self.sort(Header::Cpu), From cfdea77594e48c8c20a4d6e6c7ea31c9181361a1 Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Tue, 3 Jan 2023 04:44:47 +0000 Subject: [PATCH 03/10] fix: sort containers on every `update_stats()`, if a sort is set --- src/app_data/mod.rs | 57 ++++++++++++++++++++++++++++++------------ src/docker_data/mod.rs | 27 +++++++++++--------- 2 files changed, 56 insertions(+), 28 deletions(-) diff --git a/src/app_data/mod.rs b/src/app_data/mod.rs index 0e7dc7b..b61970d 100644 --- a/src/app_data/mod.rs +++ b/src/app_data/mod.rs @@ -56,21 +56,6 @@ impl fmt::Display for Header { } impl AppData { - pub const fn get_sorted(&self) -> Option<(Header, SortedOrder)> { - self.sorted_by - } - - /// Change the sorted order, also set the selected container state to match new order - pub fn set_sorted(&mut self, x: Option<(Header, SortedOrder)>) { - self.sorted_by = x; - self.sort_containers(); - self.containers - .state - .select(self.containers.items.iter().position(|i| { - self.get_selected_container_id() - .map_or(false, |id| i.id == id) - })); - } /// Generate a default app_state pub fn default(args: CliArgs) -> Self { Self { @@ -82,6 +67,41 @@ impl AppData { } } + pub const fn get_sorted(&self) -> Option<(Header, SortedOrder)> { + self.sorted_by + } + + /// Remove the sorted header & order, and sort by default - created datetime + pub fn reset_sorted(&mut self) { + self.set_sorted(None); + } + + /// 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 { + match order { + SortedOrder::Desc => output = None, + SortedOrder::Asc => output = Some((selected_header, SortedOrder::Desc)), + } + } + } + self.set_sorted(output); + } + + /// Change the sorted order, also set the selected container state to match new order + fn set_sorted(&mut self, x: Option<(Header, SortedOrder)>) { + self.sorted_by = x; + self.sort_containers(); + self.containers + .state + .select(self.containers.items.iter().position(|i| { + self.get_selected_container_id() + .map_or(false, |id| i.id == id) + })); + } + /// Current time as unix timestamp #[allow(clippy::expect_used)] fn get_systemtime() -> u64 { @@ -185,7 +205,7 @@ impl AppData { /// Sort the containers vec, based on a heading, either ascending or descending, /// If not sort set, then sort by created time - fn sort_containers(&mut self) { + pub fn sort_containers(&mut self) { if let Some((head, ord)) = self.sorted_by { match head { Header::State => match ord { @@ -411,6 +431,7 @@ impl AppData { } /// Update container mem, cpu, & network stats, in single function so only need to call .lock() once + /// Will also, if a sort is set, sort the containers pub fn update_stats( &mut self, id: &ContainerId, @@ -439,6 +460,10 @@ impl AppData { container.tx.update(tx); container.mem_limit.update(mem_limit); } + // need to benchmark this? + if self.get_sorted().is_some() { + self.sort_containers(); + } } /// Update, or insert, containers diff --git a/src/docker_data/mod.rs b/src/docker_data/mod.rs index af53655..7e89b90 100644 --- a/src/docker_data/mod.rs +++ b/src/docker_data/mod.rs @@ -156,18 +156,20 @@ impl DockerData { let docker = Arc::clone(&self.docker); let app_data = Arc::clone(&self.app_data); let spawns = Arc::clone(&self.spawns); - let key = SpawnId::Stats((id.clone(), self.binate)); - let spawn_key = key.clone(); - self.spawns.lock().entry(key).or_insert_with(|| { - tokio::spawn(Self::update_container_stat( - docker, - id.clone(), - app_data, - *is_running, - spawns, - spawn_key, - )) - }); + let spawn_key = SpawnId::Stats((id.clone(), self.binate)); + self.spawns + .lock() + .entry(spawn_key.clone()) + .or_insert_with(|| { + tokio::spawn(Self::update_container_stat( + docker, + id.clone(), + app_data, + *is_running, + spawns, + spawn_key, + )) + }); } self.binate = self.binate.toggle(); } @@ -299,6 +301,7 @@ impl DockerData { } }; self.update_all_container_stats(&all_ids); + self.app_data.lock().sort_containers(); } /// Animate the loading icon From a21e2d3bf83dc801343450fd91d40b591618d27a Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Tue, 3 Jan 2023 16:58:40 +0000 Subject: [PATCH 04/10] docs: changelog --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ac2d75b..b3cf345 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +### Chores ++ dependencies updated, [9b09146aadae5727a5fee4de5fe0c1d70c581c22] + +### Fixes ++ If a sort order is set, sort containers on every `update_stats()`, [cfdea77594e48c8c20a4d6e6c7ea31c9181361a1] + +### Refactors ++ input sort executed in app_data struct `sort_by_header()`, [3cdc5fae02097628799209f371ae9292e513e76c] + # v0.1.10 ### 2022-12-25 From e0703b76a1a28cfe266f130a7f7dec92f1b5ad58 Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Tue, 3 Jan 2023 17:08:06 +0000 Subject: [PATCH 05/10] feat: install.sh script added --- install.sh | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100755 install.sh diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..f24eb27 --- /dev/null +++ b/install.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +case "$(arch)" in + x86_64) SUFFIX="x86_64";; + aarch64) SUFFIX="aarch64";; + armv6l) SUFFIX="armv6";; +esac + +if [ -n "$SUFFIX" ]; then + wget "https://github.com/mrjackwills/oxker/releases/latest/download/oxker_linux_${SUFFIX}.tar.gz" + tar xzvf "oxker_linux_${SUFFIX}.tar.gz" oxker + install -Dm 755 oxker -t "${HOME}/.local/bin" + rm "oxker_linux_${SUFFIX}.tar.gz" oxker +fi From 7a42eba6b0968314af40ff87bcc42d288f6860bc Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Tue, 3 Jan 2023 17:32:39 +0000 Subject: [PATCH 06/10] feat: readme auto download/install added --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 80875ea..f2c21dd 100644 --- a/README.md +++ b/README.md @@ -49,6 +49,14 @@ install -Dm 755 oxker -t "${HOME}/.local/bin" && rm oxker_linux_x86_64.tar.gz oxker ``` +or, automatically select platform, download, and install to `$HOME/.local/bin` + +*One should verify all scripts before running in your shell* + +```bash +curl https://raw.githubusercontent.com/mrjackwills/oxker/main/install.sh | bash +``` + ## Run ```oxker``` From 32816dcca525ae509b61f256bc856777ae3f3eaa Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Tue, 3 Jan 2023 17:54:11 +0000 Subject: [PATCH 07/10] docs: changlog --- CHANGELOG.md | 5 ++++- create_release.sh | 4 +--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b3cf345..5985362 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,11 @@ ### Chores + dependencies updated, [9b09146aadae5727a5fee4de5fe0c1d70c581c22] +### Features ++ `install.sh` script added, [7a42eba6b0968314af40ff87bcc42d288f6860bc], [e0703b76a1a28cfe266f130a7f7dec92f1b5ad58] + ### Fixes -+ If a sort order is set, sort containers on every `update_stats()`, [cfdea77594e48c8c20a4d6e6c7ea31c9181361a1] ++ If a sort order is set, sort containers on every `update_stats()` execution, [cfdea77594e48c8c20a4d6e6c7ea31c9181361a1] ### Refactors + input sort executed in app_data struct `sort_by_header()`, [3cdc5fae02097628799209f371ae9292e513e76c] diff --git a/create_release.sh b/create_release.sh index 2a0a409..64e5193 100755 --- a/create_release.sh +++ b/create_release.sh @@ -153,7 +153,6 @@ check_tag () { break;; *) error_close "invalid option $REPLY" - break;; esac done } @@ -268,8 +267,7 @@ main() { do case $choice in 0) - exit - break;; + exit;; 1) cargo_test main From d1672d28a6fd074e9dedc3165ca115a4815fdc94 Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Tue, 3 Jan 2023 18:14:25 +0000 Subject: [PATCH 08/10] docs: readme --- CHANGELOG.md | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5985362..76dd3f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ + dependencies updated, [9b09146aadae5727a5fee4de5fe0c1d70c581c22] ### Features -+ `install.sh` script added, [7a42eba6b0968314af40ff87bcc42d288f6860bc], [e0703b76a1a28cfe266f130a7f7dec92f1b5ad58] ++ `install.sh` script added, for automated platform selected, download, and installation, [7a42eba6b0968314af40ff87bcc42d288f6860bc], [e0703b76a1a28cfe266f130a7f7dec92f1b5ad58] ### Fixes + If a sort order is set, sort containers on every `update_stats()` execution, [cfdea77594e48c8c20a4d6e6c7ea31c9181361a1] diff --git a/README.md b/README.md index f2c21dd..a9be6f7 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ install -Dm 755 oxker -t "${HOME}/.local/bin" && rm oxker_linux_x86_64.tar.gz oxker ``` -or, automatically select platform, download, and install to `$HOME/.local/bin` +or, automatically select platform, download, and installation to `$HOME/.local/bin` *One should verify all scripts before running in your shell* From 8499c335987d567e87f278e341f1725cfc5cafd0 Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Tue, 3 Jan 2023 19:03:39 +0000 Subject: [PATCH 09/10] docs: changelog/readme --- CHANGELOG.md | 2 +- README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 76dd3f5..de96855 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ + dependencies updated, [9b09146aadae5727a5fee4de5fe0c1d70c581c22] ### Features -+ `install.sh` script added, for automated platform selected, download, and installation, [7a42eba6b0968314af40ff87bcc42d288f6860bc], [e0703b76a1a28cfe266f130a7f7dec92f1b5ad58] ++ `install.sh` script added, for automated platform selection, download, and installation, [7a42eba6b0968314af40ff87bcc42d288f6860bc], [e0703b76a1a28cfe266f130a7f7dec92f1b5ad58] ### Fixes + If a sort order is set, sort containers on every `update_stats()` execution, [cfdea77594e48c8c20a4d6e6c7ea31c9181361a1] diff --git a/README.md b/README.md index a9be6f7..c73c654 100644 --- a/README.md +++ b/README.md @@ -49,7 +49,7 @@ install -Dm 755 oxker -t "${HOME}/.local/bin" && rm oxker_linux_x86_64.tar.gz oxker ``` -or, automatically select platform, download, and installation to `$HOME/.local/bin` +or, for automatic platform selection, download, and installation (to `$HOME/.local/bin`) *One should verify all scripts before running in your shell* From 8bd6c94b49d35c886621fce95d2441dad85ba2ac Mon Sep 17 00:00:00 2001 From: Jack Wills <32690432+mrjackwills@users.noreply.github.com> Date: Tue, 3 Jan 2023 19:23:20 +0000 Subject: [PATCH 10/10] chore: release v0.1.11 --- .github/release-body.md | 11 +++++------ CHANGELOG.md | 11 +++++++---- Cargo.toml | 2 +- src/app_data/mod.rs | 2 +- 4 files changed, 14 insertions(+), 12 deletions(-) diff --git a/.github/release-body.md b/.github/release-body.md index cd2db50..be03e66 100644 --- a/.github/release-body.md +++ b/.github/release-body.md @@ -1,17 +1,16 @@ -### 2022-12-25 +### 2023-01-03 ### Chores -+ dependencies updated, [1525b3150293015c0fb2f2161da463b21ac2694c], [8d539ab14809136d743c49d60779687fc8eeef6d], [1774217a8a657d261397d213e5ecee667cf3b6b1] -+ Rust 1.66 linting, [bf9dcac7045c0d2314df147ec2744a3ad886564b] ++ dependencies updated, [9b09146aadae5727a5fee4de5fe0c1d70c581c22] ### Features -+ Caching on github action, [a91c9aa45ffd5c998cd1b83d8e90d0912893c31f] ++ `install.sh` script added, for automated platform selection, download, and installation, [7a42eba6b0968314af40ff87bcc42d288f6860bc], [e0703b76a1a28cfe266f130a7f7dec92f1b5ad58] ### Fixes -+ comment typo, [7899b773569fed86343a035d3023bf34297fdabb] ++ If a sort order is set, sort containers on every `update_stats()` execution, [cfdea77594e48c8c20a4d6e6c7ea31c9181361a1] ### Refactors -+ remove_ansi() to single liner, [57c3a6c186b916faba24bf7b5cdbbda31d636a7e] ++ input sort executed in app_data struct `sort_by_header()`, [3cdc5fae02097628799209f371ae9292e513e76c] see CHANGELOG.md for more details diff --git a/CHANGELOG.md b/CHANGELOG.md index de96855..5219847 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,14 +1,17 @@ +# v0.1.11 +### 2023-01-03 + ### Chores -+ dependencies updated, [9b09146aadae5727a5fee4de5fe0c1d70c581c22] ++ dependencies updated, [9b09146a](https://github.com/mrjackwills/oxker/commit/9b09146aadae5727a5fee4de5fe0c1d70c581c22) ### Features -+ `install.sh` script added, for automated platform selection, download, and installation, [7a42eba6b0968314af40ff87bcc42d288f6860bc], [e0703b76a1a28cfe266f130a7f7dec92f1b5ad58] ++ `install.sh` script added, for automated platform selection, download, and installation, [7a42eba6](https://github.com/mrjackwills/oxker/commit/7a42eba6b0968314af40ff87bcc42d288f6860bc), [e0703b76](https://github.com/mrjackwills/oxker/commit/e0703b76a1a28cfe266f130a7f7dec92f1b5ad58) ### Fixes -+ If a sort order is set, sort containers on every `update_stats()` execution, [cfdea77594e48c8c20a4d6e6c7ea31c9181361a1] ++ If a sort order is set, sort containers on every `update_stats()` execution, [cfdea775](https://github.com/mrjackwills/oxker/commit/cfdea77594e48c8c20a4d6e6c7ea31c9181361a1) ### Refactors -+ input sort executed in app_data struct `sort_by_header()`, [3cdc5fae02097628799209f371ae9292e513e76c] ++ input sort executed in app_data struct `sort_by_header()`, [3cdc5fae](https://github.com/mrjackwills/oxker/commit/3cdc5fae02097628799209f371ae9292e513e76c) # v0.1.10 ### 2022-12-25 diff --git a/Cargo.toml b/Cargo.toml index 7c6aa3a..5eb5908 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "oxker" -version = "0.1.10" +version = "0.1.11" edition = "2021" authors = ["Jack Wills "] description = "A simple tui to view & control docker containers" diff --git a/src/app_data/mod.rs b/src/app_data/mod.rs index b61970d..8b92466 100644 --- a/src/app_data/mod.rs +++ b/src/app_data/mod.rs @@ -462,7 +462,7 @@ impl AppData { } // need to benchmark this? if self.get_sorted().is_some() { - self.sort_containers(); + self.sort_containers(); } }