diff --git a/.gitea/workflows/main.yml b/.gitea/workflows/main.yaml similarity index 100% rename from .gitea/workflows/main.yml rename to .gitea/workflows/main.yaml diff --git a/.gitea/workflows/dev.yml b/.gitea/workflows/testing.yaml similarity index 98% rename from .gitea/workflows/dev.yml rename to .gitea/workflows/testing.yaml index 4aae563..46ba782 100644 --- a/.gitea/workflows/dev.yml +++ b/.gitea/workflows/testing.yaml @@ -1,4 +1,4 @@ -name: Dev Build, Publish & Preview Release +name: Testing Build, Publish & Preview Release on: push: @@ -90,7 +90,7 @@ jobs: VERSION="$(sed -n 's/^version = "\(.*\)"/\1/p' Cargo.toml | head -n1)" TAG_NAME="v${VERSION}-preview" RELEASE_TITLE="Preview Release ${TAG_NAME}" - RELEASE_NOTES="Automatisches Preview-Release für docker-update ${VERSION} (Branch: dev)." + RELEASE_NOTES="Automatisches Preview-Release für docker-update ${VERSION} (Branch: Testing)." echo "Erstelle oder hole Preview-Release für Tag ${TAG_NAME} in ${REPO}..." @@ -109,7 +109,7 @@ jobs: CREATE_PAYLOAD=$(cat < - - diff --git a/AGENTS.md b/AGENTS.md index 1d03492..95bd7d9 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -29,8 +29,8 @@ lädt diese herunter, startet betroffene Services neu und bereinigt ungenutzte Z DockerUpdate/ ├── .gitea/ │ └── workflows/ -│ ├── dev.yml # CI/CD für dev-Branch (Tests, Testing-Packages & Preview-Release) -│ └── main.yml # CI/CD für main-Branch (Tests, Stable-Packages & Release) +│ ├── testing.yaml # CI/CD für testing-Branch (Tests, Testing-Packages & Preview-Release) +│ └── main.yaml # CI/CD für main-Branch (Tests, Stable-Packages & Release) ├── Cargo.toml # Rust-Manifest, Abhängigkeiten und Metadaten für cargo-deb / generate-rpm ├── Cargo.lock ├── LICENSE # GPL-3.0 Lizenztext @@ -76,10 +76,11 @@ DockerUpdate/ - `is_run_as_root()`: Nutzt `libc::geteuid() == 0`. - `run_as_root()`: Führt `sudo ` per `exec` aus. - **`.gitea/workflows/`**: - - `dev.yml`: Führt bei Push auf `dev` Tests und Builds durch, veröffentlicht Pakete in der Gitea Package Registry + - `testing.yaml`: Führt bei Push auf `testing` Tests und Builds durch, veröffentlicht Pakete in der Gitea Package + Registry (`distribution: testing`, `component: main` bzw. Gruppe/Repo `testing`) und erstellt ein Gitea Preview-Release mit den Paketen als Assets. - - `main.yml`: Führt bei Push auf `main` Tests und Builds durch, veröffentlicht Pakete in der Gitea Package Registry + - `main.yaml`: Führt bei Push auf `main` Tests und Builds durch, veröffentlicht Pakete in der Gitea Package Registry (`distribution: stable`, `component: main` bzw. Gruppe/Repo `stable`) und erstellt ein Gitea Release mit den Paketen als Assets. - **`packaging/`**: diff --git a/README.md b/README.md index 37cd265..0aca80d 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ auf neuere Versionen prüft, aktualisiert und neu startet. ## Installation aus der Gitea-Paket-Registry -Über die CI/CD-Pipelines werden bei jedem Push auf den `main`-Branch (Release / Stable) und `dev`-Branch (Preview / +Über die CI/CD-Pipelines werden bei jedem Push auf den `main`-Branch (Release / Stable) und `testing`-Branch (Preview / Testing) automatisch Pakete für **Debian/Ubuntu**, **Fedora/RHEL** und **Arch Linux** in der Gitea-Paket-Registry bereitgestellt. @@ -61,7 +61,7 @@ sudo apt update sudo apt install docker-update ``` -#### Testing (Vorschau / Dev) +#### Testing (Vorschau / Testing) ```bash # Keyring installieren @@ -95,7 +95,7 @@ EOF sudo dnf install docker-update ``` -#### Testing (Vorschau / Dev) +#### Testing (Vorschau / Testing) ```bash sudo tee /etc/yum.repos.d/docker-update-testing.repo << 'EOF' @@ -130,7 +130,7 @@ Installiere das Paket anschließend: sudo pacman -Sy docker-update ``` -#### Testing (Vorschau / Dev) +#### Testing (Vorschau / Testing) Füge das Testing-Repository in `/etc/pacman.conf` ein: diff --git a/src/log.rs b/src/log.rs index f36016a..7d4bba1 100644 --- a/src/log.rs +++ b/src/log.rs @@ -1,10 +1,10 @@ //! Einfaches, threadsicheres Logging-Modul. //! //! Merkmale: -//! - Ausgabe in Terminal (stdout/stderr) und zusätzlich in eine Logdatei im temporären Verzeichnis. +//! - Ausgabe auf Standard-Streams (stdout/stderr) und zusätzlich in eine Logdatei im temporären Verzeichnis. //! - Nachrichtenvorlage: `[DD.MM.YYYY HH:MM:SS.mmm][LEVEL][TAG]: ` mit Präfix ([!]/[?]/[i]/[d]). //! - Der aktuell verwendete Schweregradfilter ist statisch (`LOG_LEVEL`) und wird zur Laufzeit nicht geändert. -//! - Terminal-Erkennung und Dateihandle werden lazily initialisiert und zwischengespeichert (`OnceLock`). +//! - Dateihandle wird lazily initialisiert und zwischengespeichert (`OnceLock`). //! //! Hinweise: //! - Bei einem leeren `tag` wird ein leerer Tag-Abschnitt erzeugt. @@ -22,13 +22,13 @@ use std::env; use std::fmt::{Display, Formatter}; -use std::fs::{create_dir_all, File, OpenOptions}; -use std::io::{stdout, IsTerminal, Write}; +use std::fs::{File, OpenOptions, create_dir_all}; +use std::io::Write; use std::sync::{Mutex, OnceLock}; use crate::config; use crate::program; -use time::{macros::format_description, OffsetDateTime}; +use time::{OffsetDateTime, macros::format_description}; /// Schweregrade für Logeinträge in aufsteigender Detailtiefe. /// @@ -71,14 +71,11 @@ impl TryFrom for LogLevel { "warn" => Ok(LogLevel::Warn), "info" => Ok(LogLevel::Info), "debug" => Ok(LogLevel::Debug), - _ => Err(LogLevel::Info) + _ => Err(LogLevel::Info), } } } -/// Zwischenspeicher für die einmalig ermittelte Terminal-Fähigkeit von `stdout`. -static IS_TERMINAL: OnceLock = OnceLock::new(); - /// Globaler Schweregradfilter für Ausgabe. static LOG_LEVEL: OnceLock = OnceLock::new(); @@ -89,7 +86,7 @@ static LOG_FILE: OnceLock>> = OnceLock::new(); /// /// Verhalten: /// - Wenn `log_level` größer als der globale Filter ist, wird nichts ausgegeben. -/// - Bei Terminalausgabe gehen `Error`-Meldungen nach `stderr`, alle anderen nach `stdout`. +/// - `Error`-Meldungen gehen nach `stderr`, alle anderen nach `stdout`. /// - Zusätzlich wird in eine tägliche Logdatei im Temp-Verzeichnis geschrieben (wenn erfolgreich geöffnet). /// /// Parameter: @@ -109,12 +106,10 @@ pub fn log(tag: &str, message: &str, log_level: LogLevel) { if log_level <= get_log_level() { let message: String = format_message(tag, message, &log_level); - if is_terminal() { - if log_level == LogLevel::Error { - eprintln!("{}", message) - } else { - println!("{}", message) - } + if log_level == LogLevel::Error { + eprintln!("{}", message); + } else { + println!("{}", message); } let file_lock = get_or_init_log_file(); @@ -138,17 +133,7 @@ fn get_log_level() -> LogLevel { *LOG_LEVEL.get_or_init(|| { let log_level = &config::get_config().general.log_level; LogLevel::try_from(log_level.to_string()).unwrap_or(LogLevel::Info) - } - ) -} - -/// Ermittelt einmalig, ob `stdout` ein Terminal ist, und cached das Ergebnis. -/// -/// Rückgabe: -/// - `true`, wenn `stdout` ein TTY/Terminal ist. -/// - `false` andernfalls. -fn is_terminal() -> bool { - *IS_TERMINAL.get_or_init(|| stdout().is_terminal()) + }) } /// Formatiert eine Lognachricht mit Zeitstempel, Level, Tag und Präfix. @@ -234,10 +219,7 @@ fn open_log_file() -> std::io::Result { let file_name = format!("log-{}.log", date_str); dir.push(file_name); - OpenOptions::new() - .create(true) - .append(true) - .open(dir) + OpenOptions::new().create(true).append(true).open(dir) } #[cfg(test)] diff --git a/src/updater.rs b/src/updater.rs index 778bbc8..90ecc0d 100644 --- a/src/updater.rs +++ b/src/updater.rs @@ -104,7 +104,7 @@ pub fn run_compose_command(dir: &Path, args: &[&str]) -> std::io::Result .output(); match output { - Ok(out) if out.status.success() || out.status.code() != Some(127) => Ok(out), + Ok(out) if out.status.success() => Ok(out), _ => { // Fallback auf docker-compose (v1) Command::new("docker-compose")