Merge pull request 'Merge testing in main: Release 1.1.0' (#21) from testing into main
Testing Build, Check & Preview Release / Build, Check & Create Preview Release (push) Skipped
Main Release & Publish / Erkenne relevante Code-Änderungen (push) Successful in 15s
Security Scans / Trivy & OSV-Scanner (push) Successful in 1m11s
Main Release & Publish / Build, Publish Crate to Gitea Registry & Create Release (push) Successful in 1m11s
TruffleHog Secret Scan / TruffleHog (push) Successful in 18s

Reviewed-on: #21
This commit was merged in pull request #21.
This commit is contained in:
2026-09-20 22:08:00 +00:00
13 changed files with 106 additions and 48 deletions
+7 -9
View File
@@ -24,16 +24,14 @@ jobs:
components: clippy, rustfmt components: clippy, rustfmt
cache: false cache: false
# Ein rohes 'actions/cache' auf target/ liefert zwar einen technischen Cache-Hit (Dateien
# werden wiederhergestellt), Cargo kompiliert die Abhängigkeiten aber oft trotzdem neu:
# Der tar-basierte Restore-Vorgang setzt bei allen wiederhergestellten Dateien dieselbe
# Mtime, wodurch Cargos Fingerprinting nicht mehr zuverlässig erkennen kann, was
# älter/neuer als was ist, und sicherheitshalber alles neu baut. Swatinem/rust-cache ist
# genau dafür gebaut (u. a. gezielte Mtime-Korrektur nach dem Restore).
- name: Cache Cargo-Abhängigkeiten & Build-Artefakte - name: Cache Cargo-Abhängigkeiten & Build-Artefakte
uses: actions/cache@v6 uses: Swatinem/rust-cache@v2
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: cargo-${{ runner.os }}-${{ hashFiles('Cargo.lock') }}
restore-keys: |
cargo-${{ runner.os }}-
- name: Formatierung automatisch beheben - name: Formatierung automatisch beheben
run: cargo fmt run: cargo fmt
+7 -9
View File
@@ -54,16 +54,14 @@ jobs:
toolchain: stable toolchain: stable
cache: false cache: false
# Ein rohes 'actions/cache' auf target/ liefert zwar einen technischen Cache-Hit (Dateien
# werden wiederhergestellt), Cargo kompiliert die Abhängigkeiten aber oft trotzdem neu:
# Der tar-basierte Restore-Vorgang setzt bei allen wiederhergestellten Dateien dieselbe
# Mtime, wodurch Cargos Fingerprinting nicht mehr zuverlässig erkennen kann, was
# älter/neuer als was ist, und sicherheitshalber alles neu baut. Swatinem/rust-cache ist
# genau dafür gebaut (u. a. gezielte Mtime-Korrektur nach dem Restore).
- name: Cache Cargo-Abhängigkeiten & Build-Artefakte - name: Cache Cargo-Abhängigkeiten & Build-Artefakte
uses: actions/cache@v6 uses: Swatinem/rust-cache@v2
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: cargo-${{ runner.os }}-${{ hashFiles('Cargo.lock') }}
restore-keys: |
cargo-${{ runner.os }}-
- name: Run Tests - name: Run Tests
run: | run: |
+1 -1
View File
@@ -9,7 +9,7 @@ jobs:
renovate: renovate:
name: Dependency-Updates prüfen & Pull Requests erstellen name: Dependency-Updates prüfen & Pull Requests erstellen
runs-on: ubuntu-latest runs-on: ubuntu-latest
container: ghcr.io/renovatebot/renovate:44.83.0 container: ghcr.io/renovatebot/renovate:44.103.6
steps: steps:
- name: Renovate ausführen - name: Renovate ausführen
run: renovate run: renovate
+1 -1
View File
@@ -17,7 +17,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
env: env:
TRIVY_VERSION: "0.74.0" TRIVY_VERSION: "0.74.0"
OSV_SCANNER_VERSION: "2.5.1" OSV_SCANNER_VERSION: "2.6.0"
steps: steps:
- name: Checkout Repository - name: Checkout Repository
uses: actions/checkout@v7 uses: actions/checkout@v7
+7 -9
View File
@@ -43,16 +43,14 @@ jobs:
toolchain: stable toolchain: stable
cache: false cache: false
# Ein rohes 'actions/cache' auf target/ liefert zwar einen technischen Cache-Hit (Dateien
# werden wiederhergestellt), Cargo kompiliert die Abhängigkeiten aber oft trotzdem neu:
# Der tar-basierte Restore-Vorgang setzt bei allen wiederhergestellten Dateien dieselbe
# Mtime, wodurch Cargos Fingerprinting nicht mehr zuverlässig erkennen kann, was
# älter/neuer als was ist, und sicherheitshalber alles neu baut. Swatinem/rust-cache ist
# genau dafür gebaut (u. a. gezielte Mtime-Korrektur nach dem Restore).
- name: Cache Cargo-Abhängigkeiten & Build-Artefakte - name: Cache Cargo-Abhängigkeiten & Build-Artefakte
uses: actions/cache@v6 uses: Swatinem/rust-cache@v2
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: cargo-${{ runner.os }}-${{ hashFiles('Cargo.lock') }}
restore-keys: |
cargo-${{ runner.os }}-
- name: Run Tests - name: Run Tests
run: | run: |
+1 -1
View File
@@ -12,7 +12,7 @@ jobs:
name: TruffleHog name: TruffleHog
runs-on: ubuntu-latest runs-on: ubuntu-latest
env: env:
TRUFFLEHOG_VERSION: "3.97.4" TRUFFLEHOG_VERSION: "3.97.5"
steps: steps:
- name: Checkout Repository - name: Checkout Repository
uses: actions/checkout@v7 uses: actions/checkout@v7
+8 -9
View File
@@ -8,6 +8,7 @@ on:
- reopened - reopened
branches: branches:
- testing - testing
- dev
jobs: jobs:
test: test:
@@ -23,16 +24,14 @@ jobs:
toolchain: stable toolchain: stable
cache: false cache: false
# Ein rohes 'actions/cache' auf target/ liefert zwar einen technischen Cache-Hit (Dateien
# werden wiederhergestellt), Cargo kompiliert die Abhängigkeiten aber oft trotzdem neu:
# Der tar-basierte Restore-Vorgang setzt bei allen wiederhergestellten Dateien dieselbe
# Mtime, wodurch Cargos Fingerprinting nicht mehr zuverlässig erkennen kann, was
# älter/neuer als was ist, und sicherheitshalber alles neu baut. Swatinem/rust-cache ist
# genau dafür gebaut (u. a. gezielte Mtime-Korrektur nach dem Restore).
- name: Cache Cargo-Abhängigkeiten & Build-Artefakte - name: Cache Cargo-Abhängigkeiten & Build-Artefakte
uses: actions/cache@v6 uses: Swatinem/rust-cache@v2
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: cargo-${{ runner.os }}-${{ hashFiles('Cargo.lock') }}
restore-keys: |
cargo-${{ runner.os }}-
- name: Run Tests - name: Run Tests
run: cargo test run: cargo test
+1
View File
@@ -4,6 +4,7 @@
<content url="file://$MODULE_DIR$"> <content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/tests" isTestSource="true" /> <sourceFolder url="file://$MODULE_DIR$/tests" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/examples" isTestSource="false" />
<excludeFolder url="file://$MODULE_DIR$/target" /> <excludeFolder url="file://$MODULE_DIR$/target" />
</content> </content>
<orderEntry type="inheritedJdk" /> <orderEntry type="inheritedJdk" />
Generated
+1 -1
View File
@@ -16,7 +16,7 @@ checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2"
[[package]] [[package]]
name = "logger-ctdra" name = "logger-ctdra"
version = "1.0.5" version = "1.1.0"
dependencies = [ dependencies = [
"program-ctdra", "program-ctdra",
"time", "time",
+1 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "logger-ctdra" name = "logger-ctdra"
version = "1.0.5" version = "1.1.0"
edition = "2024" edition = "2024"
authors = ['DragonSlayer_14'] authors = ['DragonSlayer_14']
readme = "README.md" readme = "README.md"
+1
View File
@@ -10,6 +10,7 @@
- `Warn` (2) — Warnungen (Ausgabe auf `stdout` mit `[?]`-Präfix) - `Warn` (2) — Warnungen (Ausgabe auf `stdout` mit `[?]`-Präfix)
- `Info` (3) — Betriebsinformationen (Ausgabe auf `stdout` mit `[i]`-Präfix) - `Info` (3) — Betriebsinformationen (Ausgabe auf `stdout` mit `[i]`-Präfix)
- `Debug` (4) — Diagnoseausgaben (Ausgabe auf `stdout` mit `[d]`-Präfix) - `Debug` (4) — Diagnoseausgaben (Ausgabe auf `stdout` mit `[d]`-Präfix)
- **Farbige Terminalausgabe**: Jede Zeile wird je nach Schweregrad eingefärbt (`Error` rot, `Warn` gelb, `Info` grün, `Debug` cyan). Farben werden nur ausgegeben, wenn `stdout`/`stderr` ein echtes Terminal ist (keine Umleitung in Datei/Pipe), `NO_COLOR` nicht gesetzt ist und `TERM` nicht `dumb` ist. Die Logdatei enthält stets reinen Text ohne ANSI-Codes.
- **Threadsicherheit**: Dateischreibzugriffe und Konfiguration sind thread-sicher serialisiert. - **Threadsicherheit**: Dateischreibzugriffe und Konfiguration sind thread-sicher serialisiert.
- **Einheitliches Format**: `[Präfix][DD.MM.YYYY HH:MM:SS.mmm][LEVEL][Tag]: Nachricht` - **Einheitliches Format**: `[Präfix][DD.MM.YYYY HH:MM:SS.mmm][LEVEL][Tag]: Nachricht`
- **Flexible Konfiguration**: - **Flexible Konfiguration**:
+35 -5
View File
@@ -1,29 +1,59 @@
{ {
"$schema": "https://docs.renovatebot.com/renovate-schema.json", "$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": ["config:recommended"], "extends": [
"config:recommended"
],
"timezone": "Europe/Berlin", "timezone": "Europe/Berlin",
"schedule": ["before 6am on monday"], "schedule": [
"before 6am"
],
"baseBranchPatterns": [ "baseBranchPatterns": [
"dev" "dev"
], ],
"packageRules": [ "packageRules": [
{ {
"matchFileNames": [".gitea/workflows/**"], "matchFileNames": [
".gitea/workflows/**"
],
"groupName": "Gitea Actions", "groupName": "Gitea Actions",
"separateMajorMinor": false, "separateMajorMinor": false,
"separateMinorPatch": false "separateMinorPatch": false
}, },
{ {
"matchManagers": ["cargo"], "matchManagers": [
"cargo"
],
"groupName": "Cargo Dependencies", "groupName": "Cargo Dependencies",
"separateMajorMinor": false, "separateMajorMinor": false,
"separateMinorPatch": false "separateMinorPatch": false
}, },
{ {
"matchManagers": ["dockerfile", "docker-compose"], "matchManagers": [
"dockerfile",
"docker-compose"
],
"groupName": "Docker-Images", "groupName": "Docker-Images",
"separateMajorMinor": false, "separateMajorMinor": false,
"separateMinorPatch": false "separateMinorPatch": false
},
{
"description": "Patch-/Minor-/Digest-Updates automatisch mergen, sobald alle CI-Checks (inkl. Unit-Tests) erfolgreich sind - Major-Updates sind unten explizit ausgenommen (siehe nächste Regel).",
"matchUpdateTypes": [
"patch",
"minor",
"digest",
"lockFileMaintenance"
],
"automerge": true,
"automergeType": "pr",
"platformAutomerge": true
},
{
"description": "Major-Updates immer manuell prüfen, da potenziell brechende Änderungen.",
"matchUpdateTypes": [
"major"
],
"automerge": false
} }
], ],
"customManagers": [ "customManagers": [
+35 -2
View File
@@ -24,7 +24,7 @@
use std::env; use std::env;
use std::fmt::{Display, Formatter}; use std::fmt::{Display, Formatter};
use std::fs::{File, OpenOptions, create_dir_all}; use std::fs::{File, OpenOptions, create_dir_all};
use std::io::Write; use std::io::{IsTerminal, Write};
use std::path::PathBuf; use std::path::PathBuf;
use std::str::FromStr; use std::str::FromStr;
use std::sync::atomic::{AtomicU8, Ordering}; use std::sync::atomic::{AtomicU8, Ordering};
@@ -156,6 +156,33 @@ pub fn set_log_dir(path: impl Into<PathBuf>) {
} }
} }
/// ANSI-Escape-Sequenz zum Zurücksetzen der Textfarbe.
const ANSI_RESET: &str = "\x1b[0m";
/// Liefert die ANSI-Farbsequenz für den jeweiligen Schweregrad.
///
/// Farben: `Error` -> Rot, `Warn` -> Gelb, `Info` -> Grün, `Debug` -> Cyan.
fn ansi_color(log_level: &LogLevel) -> &'static str {
match log_level {
LogLevel::Error => "\x1b[31m",
LogLevel::Warn => "\x1b[33m",
LogLevel::Info => "\x1b[32m",
LogLevel::Debug => "\x1b[36m",
}
}
/// Prüft, ob Farbausgabe für den gegebenen Stream sinnvoll ist.
///
/// Voraussetzungen:
/// - Der Stream muss ein echtes Terminal sein (`is_terminal`), keine Umleitung in eine Datei oder Pipe.
/// - Die Umgebungsvariable `NO_COLOR` darf nicht gesetzt sein (siehe <https://no-color.org/>).
/// - `TERM` darf nicht auf `dumb` stehen.
fn color_supported(stream_is_terminal: bool) -> bool {
stream_is_terminal
&& env::var_os("NO_COLOR").is_none()
&& env::var("TERM").map(|term| term != "dumb").unwrap_or(true)
}
/// Formatiert eine Lognachricht mit Zeitstempel, Level, Tag und Präfix. /// Formatiert eine Lognachricht mit Zeitstempel, Level, Tag und Präfix.
/// ///
/// Format: /// Format:
@@ -224,7 +251,13 @@ pub fn log(tag: &str, message: &str, log_level: LogLevel) {
let formatted = format_message(tag, message, &log_level); let formatted = format_message(tag, message, &log_level);
if log_level == LogLevel::Error { if log_level == LogLevel::Error {
eprintln!("{}", formatted); if color_supported(std::io::stderr().is_terminal()) {
eprintln!("{}{}{}", ansi_color(&log_level), formatted, ANSI_RESET);
} else {
eprintln!("{}", formatted);
}
} else if color_supported(std::io::stdout().is_terminal()) {
println!("{}{}{}", ansi_color(&log_level), formatted, ANSI_RESET);
} else { } else {
println!("{}", formatted); println!("{}", formatted);
} }