From 194f86144b71ec2c688b2780a30aa905ec5d7bf4 Mon Sep 17 00:00:00 2001 From: Alex Clarke Date: Fri, 12 Sep 2025 11:20:02 -0600 Subject: [PATCH] refactor: Renamed the provider field in a config file to type to make things a little easier to understand; also removed husky --- .cargo-husky/hooks/pre-commit | 13 ----- .cargo-husky/hooks/pre-push | 13 ----- Cargo.lock | 7 --- Cargo.toml | 1 - README.md | 8 +-- .../chocolatey/chocolateyinstall.ps1.template | 20 +++++++ .../chocolatey/managarr.nuspec.template | 53 +++++++++++++++++++ deployment/chocolatey/packager.py | 28 ++++++++++ deployment/homebrew/managarr.rb.template | 24 +++++++++ deployment/homebrew/packager.py | 31 +++++++++++ src/config.rs | 23 ++++---- tests/bin/cli_tests.rs | 4 +- tests/config_tests.rs | 8 +-- 13 files changed, 178 insertions(+), 55 deletions(-) delete mode 100755 .cargo-husky/hooks/pre-commit delete mode 100755 .cargo-husky/hooks/pre-push create mode 100644 deployment/chocolatey/chocolateyinstall.ps1.template create mode 100644 deployment/chocolatey/managarr.nuspec.template create mode 100644 deployment/chocolatey/packager.py create mode 100644 deployment/homebrew/managarr.rb.template create mode 100644 deployment/homebrew/packager.py diff --git a/.cargo-husky/hooks/pre-commit b/.cargo-husky/hooks/pre-commit deleted file mode 100755 index 06a5053..0000000 --- a/.cargo-husky/hooks/pre-commit +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -set -e - -echo "Running pre-push hook:" - -echo "Executing: cargo fmt" -cargo fmt - -echo "Executing: make lint" -make lint - -echo "Executing: cargo test" -cargo test -- --skip prop_ diff --git a/.cargo-husky/hooks/pre-push b/.cargo-husky/hooks/pre-push deleted file mode 100755 index 0ef71b8..0000000 --- a/.cargo-husky/hooks/pre-push +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -set -e - -echo "Running pre-push hook:" - -echo "Executing: cargo fmt --check" -cargo fmt --check - -echo "Executing: make lint" -make lint - -echo "Executing: cargo test" -cargo test -- --skip prop_ diff --git a/Cargo.lock b/Cargo.lock index c2c4c09..09acb76 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -224,12 +224,6 @@ version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" -[[package]] -name = "cargo-husky" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b02b629252fe8ef6460461409564e2c21d0c8e77e0944f3d189ff06c4e932ad" - [[package]] name = "cc" version = "1.2.36" @@ -714,7 +708,6 @@ dependencies = [ "assert_cmd", "backtrace", "base64", - "cargo-husky", "chacha20poly1305", "chrono", "clap", diff --git a/Cargo.toml b/Cargo.toml index 81b9620..ffbc095 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -48,7 +48,6 @@ tempfile = "3.10.1" proptest = "1.5.0" assert_cmd = "2.0.16" predicates = "3.1.2" -cargo-husky = { version = "1.5.0", default-features = false, features = ["user-hooks"] } [[bin]] diff --git a/README.md b/README.md index e3b7a95..2ef9036 100644 --- a/README.md +++ b/README.md @@ -126,7 +126,7 @@ gman supports multiple providers. Select one as the default and then list provid default_provider: local providers: - name: local - provider: local + type: local password_file: ~/.gman_password # Optional Git sync settings for the 'local' provider git_branch: main # Defaults to 'main' @@ -191,7 +191,7 @@ For use across multiple systems, `gman` can sync with a remote Git repository (r default_provider: local providers: - name: local - provider: local + type: local git_branch: main git_remote_url: "git@github.com:my-user/gman-secrets.git" git_user_name: "Your Name" @@ -397,13 +397,13 @@ Example: two AWS Secrets Manager providers named `lab` and `prod`. default_provider: prod providers: - name: lab - provider: local + type: local password_file: /home/user/.lab_gman_password git_branch: main git_remote_url: git@github.com:username/lab-vault.git - name: prod - provider: local + type: local password_file: /home/user/.prod_gman_password git_branch: main git_remote_url: git@github.com:username/prod-vault.git diff --git a/deployment/chocolatey/chocolateyinstall.ps1.template b/deployment/chocolatey/chocolateyinstall.ps1.template new file mode 100644 index 0000000..c872b37 --- /dev/null +++ b/deployment/chocolatey/chocolateyinstall.ps1.template @@ -0,0 +1,20 @@ +$ErrorActionPreference = 'Stop'; + +$PackageName = 'managarr' +$toolsDir = "$(Split-Path -parent $MyInvocation.MyCommand.Definition)" +$url64 = 'https://github.com/Dark-Alex-17/managarr/releases/download/v$version/managarr-windows.tar.gz' +$checksum64 = '$hash_64' + +$packageArgs = @{ + packageName = $packageName + softwareName = $packageName + unzipLocation = $toolsDir + fileType = 'exe' + url = $url64 + checksum = $checksum64 + checksumType = 'sha256' + +} +Install-ChocolateyZipPackage @packageArgs +$File = Get-ChildItem -File -Path $env:ChocolateyInstall\lib\$packageName\tools\ -Filter *.tar +Get-ChocolateyUnzip -fileFullPath $File.FullName -destination $env:ChocolateyInstall\lib\$packageName\tools\ diff --git a/deployment/chocolatey/managarr.nuspec.template b/deployment/chocolatey/managarr.nuspec.template new file mode 100644 index 0000000..954bd9d --- /dev/null +++ b/deployment/chocolatey/managarr.nuspec.template @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + managarr + $version + + + + Managarr + Alex Clarke + https://github.com/Dark-Alex-17/managarr + https://github.com/Dark-Alex-17/managarr/blob/main/LICENSE + true + https://github.com/Dark-Alex-17/managarr + https://github.com/Dark-Alex-17/managarr/blob/main/README.md + https://github.com/Dark-Alex-17/managarr/issues + cli cross-platform terminal servarr tui sonarr radarr rust + A TUI and CLI for managing *arr servers. + + A TUI and CLI for managing *arr servers. Built with love in Rust! + + **Usage** + To use, run `managarr` in a terminal. + + For more [documentation and usage](https://github.com/Dark-Alex-17/managarr/blob/main/README.md), see the [official repo](https://github.com/Dark-Alex-17/managarr). + + + https://github.com/Dark-Alex-17/managarr/releases/tag/v$version/ + + + + + + + diff --git a/deployment/chocolatey/packager.py b/deployment/chocolatey/packager.py new file mode 100644 index 0000000..1c26f3c --- /dev/null +++ b/deployment/chocolatey/packager.py @@ -0,0 +1,28 @@ +import hashlib +import sys +from string import Template + +sys.stdout.reconfigure(encoding='utf-8') +args = sys.argv +version = args[1].replace("v", "") +template_file_path = args[2] +generated_file_path = args[3] + +# Deployment files +hash_64 = args[4].strip() + +print("Generating formula") +print(" VERSION: %s" % version) +print(" TEMPLATE PATH: %s" % template_file_path) +print(" SAVING AT: %s" % generated_file_path) +print(" HASH: %s" % hash_64) + +with open(template_file_path, "r", encoding="utf-8") as template_file: + template = Template(template_file.read()) + substitute = template.safe_substitute(version=version, hash_64=hash_64) + print("\n================== Generated package file ==================\n") + print(substitute) + print("\n============================================================\n") + + with open(generated_file_path, "w", encoding="utf-8") as generated_file: + generated_file.write(substitute) diff --git a/deployment/homebrew/managarr.rb.template b/deployment/homebrew/managarr.rb.template new file mode 100644 index 0000000..91c68fd --- /dev/null +++ b/deployment/homebrew/managarr.rb.template @@ -0,0 +1,24 @@ +# Documentation: https://docs.brew.sh/Formula-Cookbook +# https://rubydoc.brew.sh/Formula +class Managarr < Formula + desc "A fast and simple dashboard for Kubernetes written in Rust" + homepage "https://github.com/Dark-Alex-17/managarr" + if OS.mac? and Hardware::CPU.arm? + url "https://github.com/Dark-Alex-17/managarr/releases/download/v$version/managarr-macos-arm64.tar.gz" + sha256 "$hash_mac_arm" + elsif OS.mac? and Hardware::CPU.intel? + url "https://github.com/Dark-Alex-17/managarr/releases/download/v$version/managarr-macos.tar.gz" + sha256 "$hash_mac" + else + url "https://github.com/Dark-Alex-17/managarr/releases/download/v$version/managarr-linux-musl.tar.gz" + sha256 "$hash_linux" + end + version "$version" + license "MIT" + + def install + bin.install "managarr" + ohai "You're done! Run with \"managarr\"" + ohai "For runtime flags, see \"managarr --help\"" + end +end diff --git a/deployment/homebrew/packager.py b/deployment/homebrew/packager.py new file mode 100644 index 0000000..e0263ff --- /dev/null +++ b/deployment/homebrew/packager.py @@ -0,0 +1,31 @@ +import hashlib +import sys +from string import Template + +args = sys.argv +version = args[1] +template_file_path = args[2] +generated_file_path = args[3] + +# Deployment files +hash_mac = args[4].strip() +hash_mac_arm = args[5].strip() +hash_linux = args[6].strip() + +print("Generating formula") +print(" VERSION: %s" % version) +print(" TEMPLATE PATH: %s" % template_file_path) +print(" SAVING AT: %s" % generated_file_path) +print(" MAC HASH: %s" % hash_mac) +print(" MAC ARM HASH: %s" % hash_mac_arm) +print(" LINUX HASH: %s" % hash_linux) + +with open(template_file_path, "r") as template_file: + template = Template(template_file.read()) + substitute = template.safe_substitute(version=version, hash_mac=hash_mac, hash_mac_arm=hash_mac_arm, hash_linux=hash_linux) + print("\n================== Generated package file ==================\n") + print(substitute) + print("\n============================================================\n") + + with open(generated_file_path, "w") as generated_file: + generated_file.write(substitute) diff --git a/src/config.rs b/src/config.rs index 45fde61..c38384f 100644 --- a/src/config.rs +++ b/src/config.rs @@ -25,7 +25,7 @@ use anyhow::Result; use log::debug; use serde::{Deserialize, Serialize}; use serde_with::serde_as; -use serde_with::{DisplayFromStr, skip_serializing_none}; +use serde_with::{skip_serializing_none, DisplayFromStr}; use std::borrow::Cow; use std::path::PathBuf; use validator::{Validate, ValidationError}; @@ -107,8 +107,8 @@ fn flags_or_files(run_config: &RunConfig) -> Result<(), ValidationError> { /// use gman::providers::local::LocalProvider; /// use validator::Validate; /// -/// let provider = SupportedProvider::Local(LocalProvider); -/// let provider_config = ProviderConfig { provider, ..Default::default() }; +/// let provider_type = SupportedProvider::Local(LocalProvider); +/// let provider_config = ProviderConfig { provider_type, ..Default::default() }; /// provider_config.validate().unwrap(); /// ``` #[derive(Debug, Clone, Validate, Serialize, Deserialize, PartialEq, Eq)] @@ -116,7 +116,8 @@ pub struct ProviderConfig { #[validate(required)] pub name: Option, #[serde_as(as = "DisplayFromStr")] - pub provider: SupportedProvider, + #[serde(rename(deserialize = "type"))] + pub provider_type: SupportedProvider, pub password_file: Option, pub git_branch: Option, pub git_remote_url: Option, @@ -130,7 +131,7 @@ impl Default for ProviderConfig { fn default() -> Self { Self { name: Some("local".into()), - provider: SupportedProvider::Local(LocalProvider), + provider_type: SupportedProvider::Local(LocalProvider), password_file: Config::local_provider_password_file(), git_branch: Some("main".into()), git_remote_url: None, @@ -146,11 +147,11 @@ impl ProviderConfig { /// /// ```no_run /// # use gman::config::ProviderConfig; - /// let provider = ProviderConfig::default().extract_provider(); - /// println!("using provider: {}", provider.name()); + /// let provider_config = ProviderConfig::default().extract_provider(); + /// println!("using provider: {}", provider_config.name()); /// ``` pub fn extract_provider(&self) -> Box { - match &self.provider { + match &self.provider_type { SupportedProvider::Local(p) => { debug!("Using local secret provider"); Box::new(*p) @@ -171,8 +172,8 @@ impl ProviderConfig { /// use gman::providers::local::LocalProvider; /// use validator::Validate; /// -/// let provider = SupportedProvider::Local(LocalProvider); -/// let provider_config = ProviderConfig { provider, ..Default::default() }; +/// let provider_type = SupportedProvider::Local(LocalProvider); +/// let provider_config = ProviderConfig { provider_type, ..Default::default() }; /// let cfg = Config{ providers: vec![provider_config], ..Default::default() }; /// cfg.validate().unwrap(); /// ``` @@ -256,7 +257,7 @@ pub fn load_config() -> Result { config .providers .iter_mut() - .filter(|p| matches!(p.provider, SupportedProvider::Local(_))) + .filter(|p| matches!(p.provider_type, SupportedProvider::Local(_))) .for_each(|p| { if p.password_file.is_none() && let Some(local_password_file) = Config::local_provider_password_file() diff --git a/tests/bin/cli_tests.rs b/tests/bin/cli_tests.rs index 5a5ad56..c5b8037 100644 --- a/tests/bin/cli_tests.rs +++ b/tests/bin/cli_tests.rs @@ -24,7 +24,7 @@ fn write_yaml_config(xdg_config_home: &Path, password_file: &Path, run_profile: r#"default_provider: local providers: - name: local - provider: local + type: local password_file: {} run_configs: - name: {} @@ -38,7 +38,7 @@ run_configs: r#"default_provider: local providers: - name: local - provider: local + type: local password_file: {} "#, password_file.display() diff --git a/tests/config_tests.rs b/tests/config_tests.rs index 2290427..daefb53 100644 --- a/tests/config_tests.rs +++ b/tests/config_tests.rs @@ -1,8 +1,8 @@ #[cfg(test)] mod tests { use gman::config::{Config, ProviderConfig, RunConfig}; - use gman::providers::SupportedProvider; use gman::providers::local::LocalProvider; + use gman::providers::SupportedProvider; use pretty_assertions::assert_eq; use validator::Validate; @@ -165,7 +165,7 @@ mod tests { fn test_provider_config_valid() { let config = ProviderConfig { name: Some("local-test".to_string()), - provider: SupportedProvider::Local(LocalProvider), + provider_type: SupportedProvider::Local(LocalProvider), password_file: None, git_branch: None, git_remote_url: None, @@ -181,7 +181,7 @@ mod tests { fn test_provider_config_invalid_email() { let config = ProviderConfig { name: Some("local-test".to_string()), - provider: SupportedProvider::Local(LocalProvider), + provider_type: SupportedProvider::Local(LocalProvider), password_file: None, git_branch: None, git_remote_url: None, @@ -197,7 +197,7 @@ mod tests { fn test_provider_config_missing_name() { let config = ProviderConfig { name: None, - provider: SupportedProvider::Local(LocalProvider), + provider_type: SupportedProvider::Local(LocalProvider), password_file: None, git_branch: None, git_remote_url: None,