17 Commits
Author SHA1 Message Date
DragonSlayer_14andClaude Sonnet 5 c57d2da457 CI: Fuegt automatisiertes Nightly-Release und Testing-Registry-Publish hinzu, behebt Zeitzone bei geplanten Workflows
Testing Build, Check & Preview Release / Build, Check & Create Preview Release (push) Skipped
Code Quality (Auto-Format & Clippy-Fix) / Formatierung & Clippy automatisch beheben (push) Successful in 1m4s
Security Scans / Trivy & OSV-Scanner (push) Successful in 1m18s
Nightly Build & Publish / Erkenne relevante Code-Änderungen (push) Successful in 12s
Nightly Build & Publish / Build & Publish Nightly-Crate zur Gitea Registry (push) Waiting to run
TruffleHog Secret Scan / TruffleHog (push) Successful in 23s
- Neuer Workflow "nightly-pr.yaml": Erstellt und merged taeglich automatisch
  einen Pull Request von dev nach nightly (09:00 Uhr Europe/Berlin); legt den
  nightly-Branch bei Bedarf initial von dev an.
- Neuer Workflow "nightly.yaml": Testet, paketiert und veroeffentlicht bei
  Aenderungen auf nightly eine Pre-Release-Version (-nightly.<Zeitstempel>)
  in die Gitea Cargo Registry; erstellt bewusst kein Gitea-Release.
- testing.yaml veroeffentlicht nun zusaetzlich eine Pre-Release-Version
  (-testing.<Zeitstempel>) in die Gitea Cargo Registry, zusaetzlich zum
  bisherigen Preview-Release mit Crate-Anhang.
- Beide Versions-Suffixe sind SemVer-Pre-Releases, wodurch Renovates
  Standardverhalten (ignoreUnstable) sie automatisch ignoriert.
- CRON_TZ=Europe/Berlin in security-scan.yaml und trufflehog-scan.yaml
  ergaenzt: Gitea Actions interpretiert schedule-Cron sonst in der lokalen
  Zeitzone des Gitea-Servers statt in der beabsichtigten Zeitzone.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-21 00:27:42 +02:00
DragonSlayer_14 a14264b541 Feat: Hebt Version auf 1.1.0
Testing Build, Check & Preview Release / Build, Check & Create Preview Release (push) Skipped
TruffleHog Secret Scan / TruffleHog (push) Successful in 16s
Code Quality (Auto-Format & Clippy-Fix) / Formatierung & Clippy automatisch beheben (push) Successful in 30s
Security Scans / Trivy & OSV-Scanner (push) Successful in 43s
Auto Patch-Version-Bump (Dev → Testing PR) / Erkenne relevante Änderungen im PR (pull_request) Successful in 13s
TruffleHog Secret Scan / TruffleHog (pull_request) Successful in 22s
Auto Patch-Version-Bump (Dev → Testing PR) / Patch-Version erhöhen & auf Dev pushen (pull_request) Successful in 10s
Security Scans / Trivy & OSV-Scanner (pull_request) Successful in 42s
Unit-Tests / Unit-Tests (pull_request) Successful in 40s
2026-09-20 23:50:31 +02:00
DragonSlayer_14 b70db3d434 Merge remote-tracking branch 'origin/dev' into dev
Testing Build, Check & Preview Release / Build, Check & Create Preview Release (push) Skipped
TruffleHog Secret Scan / TruffleHog (push) Successful in 16s
Code Quality (Auto-Format & Clippy-Fix) / Formatierung & Clippy automatisch beheben (push) Successful in 28s
Security Scans / Trivy & OSV-Scanner (push) Successful in 32s
2026-09-20 23:49:29 +02:00
DragonSlayer_14andClaude Sonnet 5 5d15c15cb0 Fügt farbige Terminalausgabe je nach Log-Level hinzu
Die komplette Ausgabezeile wird nun abhängig vom Schweregrad eingefärbt
(Error rot, Warn gelb, Info grün, Debug cyan), aber nur wenn stdout/stderr
ein echtes Terminal ist und weder NO_COLOR noch TERM=dumb gesetzt sind.
Die Logdatei bleibt unverändert klartextbasiert ohne ANSI-Codes.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-20 23:49:20 +02:00
DragonSlayer_14andClaude Sonnet 5 91189e0cfc CI: Renovate-Schedule von wöchentlich auf täglich verkürzt
'before 6am on monday' erlaubte nur einmal pro Woche automatische
PR-Erstellung - jeder außerhalb dieses Fensters gefundene Update musste
im Dependency-Dashboard-Issue erst manuell abgehakt werden ("Awaiting
Schedule"), auch nach der letzten Automerge-Änderung. 'before 6am' (ohne
Wochentag) öffnet das Fenster jetzt täglich, PRs für sichere Updates
laufen dadurch spürbar zeitnaher und größtenteils ohne manuelles
Abhaken durch.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-20 23:49:20 +02:00
DragonSlayer_14andClaude Sonnet 5 ec1066a56d CI: Renovate merged sichere Updates automatisch, unit-tests laufen jetzt auch für PRs gegen dev
Patch-/Minor-/Digest-Updates (Cargo, Gitea Actions, Docker-Images)
werden künftig automatisch gemergt, sobald alle CI-Checks erfolgreich
sind - Major-Updates bleiben weiterhin manuell zu prüfen, da sie eher
brechende Änderungen enthalten.

Voraussetzung dafür: unit-tests.yaml (der eigentliche 'cargo test'-Lauf)
löste bisher nur bei Pull Requests gegen 'testing' aus, nicht gegen
'dev' - Renovate-PRs zielen aber auf 'dev' und wurden damit nie durch
einen echten Build/Test abgesichert, nur durch die Security-/Secret-
Scans. Jetzt läuft er auch dort.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-20 23:49:20 +02:00
DragonSlayer_14andClaude Sonnet 5 56e8c5c8a3 CI: Ersetzt rohes actions/cache für Cargo-Build-Artefakte durch Swatinem/rust-cache
Ein rohes 'actions/cache' auf target/ lieferte zwar einen technischen
Cache-Hit, Cargo kompilierte die Abhängigkeiten aber 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. Swatinem/rust-cache
behebt das gezielt (u. a. gezielte Mtime-Korrektur nach dem Restore).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-20 23:49:20 +02:00
Renovate-Bot b96e4a62a6 chore(deps): update gitea actions 2026-09-20 23:49:20 +02:00
Renovate-Bot e216dd07c8 chore(deps): update gitea actions 2026-09-20 23:49:20 +02:00
DragonSlayer_14 1e2d4cf187 Merge pull request 'Merge testing in main: Release 1.0.5' (#17) 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 7s
Security Scans / Trivy & OSV-Scanner (push) Successful in 37s
Main Release & Publish / Build, Publish Crate to Gitea Registry & Create Release (push) Successful in 1m16s
TruffleHog Secret Scan / TruffleHog (push) Successful in 21s
Reviewed-on: #17
2026-09-13 12:44:49 +00:00
DragonSlayer_14 bd8e8c1550 Merge pull request 'Merge dev in testing: Aktualisiert dependencys und Workflows' (#16) from dev into testing
Unit-Tests / Unit-Tests (pull_request) Skipped
Testing Build, Check & Preview Release / Erkenne relevante Code-Änderungen (push) Successful in 9s
Auto-PR (Testing → Main) / Erstelle automatisch PR von testing nach main (push) Successful in 14s
Security Scans / Trivy & OSV-Scanner (push) Successful in 42s
TruffleHog Secret Scan / TruffleHog (pull_request) Successful in 31s
Security Scans / Trivy & OSV-Scanner (pull_request) Successful in 55s
Testing Build, Check & Preview Release / Build, Check & Create Preview Release (push) Successful in 1m11s
TruffleHog Secret Scan / TruffleHog (push) Successful in 25s
Reviewed-on: #16
2026-09-13 12:40:31 +00:00
DragonSlayer_14 7bf0e52271 Merge pull request 'Merge testing in main: Passt Workflows an' (#13) from testing into main
TruffleHog Secret Scan / TruffleHog (push) Successful in 28s
Testing Build, Check & Preview Release / Build, Check & Create Preview Release (push) Skipped
Security Scans / Trivy & OSV-Scanner (push) Successful in 52s
Main Release & Publish / Build, Publish Crate to Gitea Registry & Create Release (push) Failing after 1m13s
Main Release & Publish / Erkenne relevante Code-Änderungen (push) Successful in 13s
Reviewed-on: #13
2026-09-13 10:19:17 +00:00
DragonSlayer_14 8b1ede0af3 Merge pull request 'Merge dev in testing: Passt Workflows an' (#12) from dev into testing
Unit-Tests / Unit-Tests (pull_request) Skipped
Testing Build, Check & Preview Release / Erkenne relevante Code-Änderungen (push) Successful in 13s
TruffleHog Secret Scan / TruffleHog (push) Successful in 29s
TruffleHog Secret Scan / TruffleHog (pull_request) Successful in 26s
Security Scans / Trivy & OSV-Scanner (push) Successful in 55s
Security Scans / Trivy & OSV-Scanner (pull_request) Successful in 50s
Testing Build, Check & Preview Release / Build, Check & Create Preview Release (push) Successful in 1m8s
Reviewed-on: #12
2026-09-13 10:14:55 +00:00
DragonSlayer_14 4f6a05dd3b Merge pull request 'Merge testing in main: Release 1.0.4' (#10) from testing into main
Testing Build, Check & Preview Release / Build, Check & Create Preview Release (push) Skipped
Security Scans / Trivy & OSV-Scanner (push) Successful in 55s
Main Release & Publish / Build, Publish Crate to Gitea Registry & Create Release (push) Successful in 1m17s
TruffleHog Secret Scan / TruffleHog (push) Successful in 24s
Reviewed-on: #10
2026-09-12 22:58:38 +00:00
DragonSlayer_14 2bd85e61bf Merge pull request 'Merge dev in testing: Feat: Fügt Workflows für Security-Scans, Code-Qualität, Unit-Tests und Dependency-Management hinzu sowie Python-Skript zur Erstellung von Security-Berichten. Hebt Version auf 1.0.4 an.' (#9) from dev into testing
Unit-Tests / Unit-Tests (pull_request) Skipped
Security Scans / Trivy & OSV-Scanner (push) Successful in 28s
Testing Build, Check & Preview Release / Build, Check & Create Preview Release (push) Successful in 40s
TruffleHog Secret Scan / TruffleHog (pull_request) Successful in 18s
Security Scans / Trivy & OSV-Scanner (pull_request) Successful in 33s
TruffleHog Secret Scan / TruffleHog (push) Successful in 20s
Reviewed-on: #9
2026-09-12 22:56:33 +00:00
DragonSlayer_14 c34f094569 Merge pull request 'Mereg testing in main: Release 1.0.3' (#8) from testing into main
Main Release & Publish / Build, Publish Crate to Gitea Registry & Create Release (push) Successful in 22s
Reviewed-on: #8
2026-08-26 18:12:04 +00:00
DragonSlayer_14 84e6796455 Merge pull request 'Merge dev in testing: Ersetzt die Ermittlung des Programmnamen durch die Crate program-ctdra' (#7) from dev into testing
Testing Build, Check & Preview Release / Build, Check & Create Preview Release (push) Successful in 23s
Reviewed-on: #7
2026-08-26 18:11:10 +00:00
10 changed files with 276 additions and 8 deletions
+91
View File
@@ -0,0 +1,91 @@
name: Nightly Auto-Merge (Dev → Nightly)
on:
schedule:
# Gitea Actions interpretiert 'schedule'-Cron standardmaessig in der lokalen
# Zeitzone des Gitea-Servers (anders als GitHub Actions, das immer UTC nutzt).
# Das CRON_TZ-Praefix ist eine Gitea-Erweiterung und legt die Zeitzone explizit
# und DST-sicher fest, unabhaengig von der Server-Konfiguration.
- cron: "CRON_TZ=Europe/Berlin 0 9 * * *"
workflow_dispatch:
jobs:
merge-dev-into-nightly:
name: Erstelle & merge automatisch PR von dev nach nightly
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v7
with:
fetch-depth: 0
token: ${{ secrets.PACKAGE_TOKEN || secrets.RELEASE_TOKEN || secrets.PUBLISH_TOKEN || secrets.API_TOKEN || secrets.PAT_TOKEN || secrets.CUSTOM_TOKEN || secrets.GITEA_TOKEN || secrets.GITHUB_TOKEN || github.token }}
- name: Stelle sicher, dass der nightly-Branch existiert
run: |
git fetch origin dev
if git ls-remote --exit-code --heads origin nightly > /dev/null 2>&1; then
echo "nightly-Branch existiert bereits."
else
echo "nightly-Branch existiert noch nicht, erstelle ihn initial von dev..."
git push origin origin/dev:refs/heads/nightly
fi
- name: Prüfe auf Unterschiede zwischen dev und nightly
id: diff
run: |
git fetch origin nightly
if git diff --quiet origin/nightly origin/dev; then
echo "Keine Unterschiede zwischen dev und nightly, überspringe."
echo "has_changes=false" >> "$GITHUB_OUTPUT"
else
echo "has_changes=true" >> "$GITHUB_OUTPUT"
fi
- name: Prüfe auf bereits offenen PR nach nightly
id: check_pr
if: steps.diff.outputs.has_changes == 'true'
env:
GITEA_URL: ${{ gitea.server_url || github.server_url }}
REPO: ${{ gitea.repository || github.repository }}
TOKEN: ${{ secrets.PACKAGE_TOKEN || secrets.RELEASE_TOKEN || secrets.PUBLISH_TOKEN || secrets.API_TOKEN || secrets.PAT_TOKEN || secrets.CUSTOM_TOKEN || secrets.GITEA_TOKEN || secrets.GITHUB_TOKEN || github.token }}
run: |
OPEN_PRS=$(curl -s -H "Authorization: token ${TOKEN}" "${GITEA_URL}/api/v1/repos/${REPO}/pulls?state=open&limit=50")
PR_NUMBER=$(echo "$OPEN_PRS" | jq -r '[.[] | select(.base.ref == "nightly" and .head.ref == "dev")][0].number // empty')
echo "Bereits offener dev→nightly PR: ${PR_NUMBER:-keiner}"
echo "pr_number=${PR_NUMBER}" >> "$GITHUB_OUTPUT"
- name: Erstelle PR (dev -> nightly)
id: create_pr
if: steps.diff.outputs.has_changes == 'true' && steps.check_pr.outputs.pr_number == ''
env:
GITEA_URL: ${{ gitea.server_url || github.server_url }}
REPO: ${{ gitea.repository || github.repository }}
TOKEN: ${{ secrets.PACKAGE_TOKEN || secrets.RELEASE_TOKEN || secrets.PUBLISH_TOKEN || secrets.API_TOKEN || secrets.PAT_TOKEN || secrets.CUSTOM_TOKEN || secrets.GITEA_TOKEN || secrets.GITHUB_TOKEN || github.token }}
run: |
DATE="$(date -u +%Y-%m-%d)"
PAYLOAD=$(jq -n --arg title "Nightly-Build: Merge dev in nightly (${DATE})" --arg head "dev" --arg base "nightly" \
'{title: $title, head: $head, base: $base}')
RESP=$(curl -f -s -S -X POST \
-H "Authorization: token ${TOKEN}" \
-H "Content-Type: application/json" \
-d "$PAYLOAD" \
"${GITEA_URL}/api/v1/repos/${REPO}/pulls")
PR_NUMBER=$(echo "$RESP" | jq -r '.number')
echo "PR #${PR_NUMBER} erstellt."
echo "pr_number=${PR_NUMBER}" >> "$GITHUB_OUTPUT"
- name: Merge PR automatisch
if: steps.diff.outputs.has_changes == 'true'
env:
GITEA_URL: ${{ gitea.server_url || github.server_url }}
REPO: ${{ gitea.repository || github.repository }}
TOKEN: ${{ secrets.PACKAGE_TOKEN || secrets.RELEASE_TOKEN || secrets.PUBLISH_TOKEN || secrets.API_TOKEN || secrets.PAT_TOKEN || secrets.CUSTOM_TOKEN || secrets.GITEA_TOKEN || secrets.GITHUB_TOKEN || github.token }}
PR_NUMBER: ${{ steps.create_pr.outputs.pr_number || steps.check_pr.outputs.pr_number }}
run: |
echo "Merge PR #${PR_NUMBER} automatisch (dev -> nightly)..."
curl -f -s -S -X POST \
-H "Authorization: token ${TOKEN}" \
-H "Content-Type: application/json" \
-d '{"Do": "merge"}' \
"${GITEA_URL}/api/v1/repos/${REPO}/pulls/${PR_NUMBER}/merge"
echo "PR #${PR_NUMBER} erfolgreich gemerged."
+97
View File
@@ -0,0 +1,97 @@
name: Nightly Build & Publish
on:
push:
branches:
- nightly
jobs:
detect-changes:
name: Erkenne relevante Code-Änderungen
runs-on: ubuntu-latest
outputs:
code_changed: ${{ steps.filter.outputs.code }}
steps:
- name: Checkout Repository
uses: actions/checkout@v7
- name: Prüfe auf Änderungen am Programmcode
uses: dorny/paths-filter@v4
id: filter
with:
filters: |
code:
- 'src/**'
- 'Cargo.toml'
- 'Cargo.lock'
- 'scripts/**'
- '.cargo/**'
- '.gitea/workflows/nightly.yaml'
build-and-publish:
name: Build & Publish Nightly-Crate zur Gitea Registry
needs: detect-changes
if: needs.detect-changes.outputs.code_changed == 'true'
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v7
- name: Install Rust Toolchain
uses: actions-rust-lang/setup-rust-toolchain@v2
with:
toolchain: stable
cache: false
- name: Cache Cargo-Abhängigkeiten & Build-Artefakte
uses: Swatinem/rust-cache@v2
- name: Run Tests
run: |
cargo test
- name: Compiler Check
run: |
cargo check --all-targets
# Nightly-Builds duerfen nie als regulaeres Update erscheinen: Ein SemVer-Pre-Release-
# Suffix (-nightly.<Zeitstempel>) sorgt dafuer, dass Renovates Standardverhalten
# (ignoreUnstable: true) diese Version automatisch ignoriert, solange die Basis-Version
# in Cargo.toml selbst kein Pre-Release ist. Die Aenderung ist rein fuer den Build-
# Workspace bestimmt und wird nie zurueck in den Branch committet.
- name: Ermittle & setze Nightly-Version (temporär, wird nicht committet)
id: nightly_version
run: |
BASE_VERSION="$(sed -n 's/^version = "\(.*\)"/\1/p' Cargo.toml | head -n1)"
TIMESTAMP="$(date -u +%Y%m%d%H%M)"
NIGHTLY_VERSION="${BASE_VERSION}-nightly.${TIMESTAMP}"
echo "Basis-Version: ${BASE_VERSION} -> Nightly-Version: ${NIGHTLY_VERSION}"
sed -i "0,/^version = \"${BASE_VERSION}\"/s//version = \"${NIGHTLY_VERSION}\"/" Cargo.toml
echo "version=${NIGHTLY_VERSION}" >> "$GITHUB_OUTPUT"
- name: Package Crate
run: |
cargo package --allow-dirty
- name: Publish Nightly-Crate zur Gitea Package Registry
env:
GITEA_URL: ${{ gitea.server_url || github.server_url }}
REPO_OWNER: ${{ gitea.repository_owner || github.repository_owner }}
TOKEN: ${{ secrets.PACKAGE_TOKEN || secrets.RELEASE_TOKEN || secrets.PUBLISH_TOKEN || secrets.API_TOKEN || secrets.PAT_TOKEN || secrets.CUSTOM_TOKEN || secrets.GITEA_TOKEN || secrets.GITHUB_TOKEN || github.token }}
run: |
mkdir -p ~/.cargo
cat <<EOF > ~/.cargo/config.toml
[registries.gitea]
index = "sparse+${GITEA_URL}/api/packages/${REPO_OWNER}/cargo/"
EOF
cat <<EOF > ~/.cargo/credentials.toml
[registries.gitea]
token = "Bearer ${TOKEN}"
EOF
export CARGO_REGISTRIES_GITEA_INDEX="sparse+${GITEA_URL}/api/packages/${REPO_OWNER}/cargo/"
export CARGO_REGISTRIES_GITEA_TOKEN="Bearer ${TOKEN}"
echo "Veröffentliche Nightly-Crate ${{ steps.nightly_version.outputs.version }} in Gitea Cargo Package Registry..."
cargo publish --registry gitea --allow-dirty
+1 -1
View File
@@ -8,7 +8,7 @@ on:
- dev
pull_request:
schedule:
- cron: "0 5 * * 1"
- cron: "CRON_TZ=Europe/Berlin 0 5 * * 1"
workflow_dispatch:
jobs:
+47 -2
View File
@@ -60,9 +60,54 @@ jobs:
run: |
cargo check --all-targets
- name: Ermittle Basis-Version (für Release-Tag)
id: base_version
run: |
BASE_VERSION="$(sed -n 's/^version = "\(.*\)"/\1/p' Cargo.toml | head -n1)"
echo "version=${BASE_VERSION}" >> "$GITHUB_OUTPUT"
# Testing-Builds duerfen nie als regulaeres Update erscheinen: Ein SemVer-Pre-Release-
# Suffix (-testing.<Zeitstempel>) sorgt dafuer, dass Renovates Standardverhalten
# (ignoreUnstable: true) diese Version automatisch ignoriert, solange die Basis-Version
# in Cargo.toml selbst kein Pre-Release ist. Die Aenderung ist rein fuer den Build-
# Workspace bestimmt und wird nie zurueck in den Branch committet; der Release-Tag
# weiter unten nutzt bewusst die zuvor ermittelte Basis-Version, damit er stabil bleibt.
- name: Ermittle & setze Testing-Version (temporär, wird nicht committet)
id: testing_version
run: |
BASE_VERSION="${{ steps.base_version.outputs.version }}"
TIMESTAMP="$(date -u +%Y%m%d%H%M)"
TESTING_VERSION="${BASE_VERSION}-testing.${TIMESTAMP}"
echo "Basis-Version: ${BASE_VERSION} -> Testing-Version: ${TESTING_VERSION}"
sed -i "0,/^version = \"${BASE_VERSION}\"/s//version = \"${TESTING_VERSION}\"/" Cargo.toml
echo "version=${TESTING_VERSION}" >> "$GITHUB_OUTPUT"
- name: Package Crate
run: |
cargo package
cargo package --allow-dirty
- name: Publish Testing-Crate zur Gitea Package Registry
env:
GITEA_URL: ${{ gitea.server_url || github.server_url }}
REPO_OWNER: ${{ gitea.repository_owner || github.repository_owner }}
TOKEN: ${{ secrets.PACKAGE_TOKEN || secrets.RELEASE_TOKEN || secrets.PUBLISH_TOKEN || secrets.API_TOKEN || secrets.PAT_TOKEN || secrets.CUSTOM_TOKEN || secrets.GITEA_TOKEN || secrets.GITHUB_TOKEN || github.token }}
run: |
mkdir -p ~/.cargo
cat <<EOF > ~/.cargo/config.toml
[registries.gitea]
index = "sparse+${GITEA_URL}/api/packages/${REPO_OWNER}/cargo/"
EOF
cat <<EOF > ~/.cargo/credentials.toml
[registries.gitea]
token = "Bearer ${TOKEN}"
EOF
export CARGO_REGISTRIES_GITEA_INDEX="sparse+${GITEA_URL}/api/packages/${REPO_OWNER}/cargo/"
export CARGO_REGISTRIES_GITEA_TOKEN="Bearer ${TOKEN}"
echo "Veröffentliche Testing-Crate ${{ steps.testing_version.outputs.version }} in Gitea Cargo Package Registry..."
cargo publish --registry gitea --allow-dirty
- name: Create Gitea Pre-Release and Upload Assets
env:
@@ -71,7 +116,7 @@ jobs:
REPO_NAME: ${{ gitea.repository_name || github.event.repository.name }}
TOKEN: ${{ secrets.PACKAGE_TOKEN || secrets.RELEASE_TOKEN || secrets.PUBLISH_TOKEN || secrets.API_TOKEN || secrets.PAT_TOKEN || secrets.CUSTOM_TOKEN || secrets.GITEA_TOKEN || secrets.GITHUB_TOKEN || github.token }}
run: |
VERSION="$(sed -n 's/^version = "\(.*\)"/\1/p' Cargo.toml | head -n1)"
VERSION="${{ steps.base_version.outputs.version }}"
TAG_NAME="v${VERSION}-preview"
RELEASE_TITLE="Preview Release ${TAG_NAME}"
RELEASE_NOTES="Automatisches Preview-Release für ${REPO_NAME} Crate ${VERSION} (Branch: Testing)."
+1 -1
View File
@@ -4,7 +4,7 @@ on:
push:
pull_request:
schedule:
- cron: "0 6 * * 1"
- cron: "CRON_TZ=Europe/Berlin 0 6 * * 1"
workflow_dispatch:
jobs:
+1
View File
@@ -4,6 +4,7 @@
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/tests" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/examples" isTestSource="false" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
Generated
+1 -1
View File
@@ -16,7 +16,7 @@ checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2"
[[package]]
name = "logger-ctdra"
version = "1.0.5"
version = "1.1.0"
dependencies = [
"program-ctdra",
"time",
+1 -1
View File
@@ -1,6 +1,6 @@
[package]
name = "logger-ctdra"
version = "1.0.5"
version = "1.1.0"
edition = "2024"
authors = ['DragonSlayer_14']
readme = "README.md"
+1
View File
@@ -10,6 +10,7 @@
- `Warn` (2) — Warnungen (Ausgabe auf `stdout` mit `[?]`-Präfix)
- `Info` (3) — Betriebsinformationen (Ausgabe auf `stdout` mit `[i]`-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.
- **Einheitliches Format**: `[Präfix][DD.MM.YYYY HH:MM:SS.mmm][LEVEL][Tag]: Nachricht`
- **Flexible Konfiguration**:
+35 -2
View File
@@ -24,7 +24,7 @@
use std::env;
use std::fmt::{Display, Formatter};
use std::fs::{File, OpenOptions, create_dir_all};
use std::io::Write;
use std::io::{IsTerminal, Write};
use std::path::PathBuf;
use std::str::FromStr;
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.
///
/// Format:
@@ -224,7 +251,13 @@ pub fn log(tag: &str, message: &str, log_level: LogLevel) {
let formatted = format_message(tag, message, &log_level);
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 {
println!("{}", formatted);
}