first commit

Signed-off-by: Boris Yumankulov <boria138@altlinux.org>
This commit is contained in:
2025-07-23 13:04:52 +05:00
commit 831c3a05a8
3 changed files with 238 additions and 0 deletions

View File

@@ -0,0 +1,45 @@
name: Update Wine Metadata
run-name: Fetch and Write wine metadata
on:
workflow_dispatch:
schedule:
# Запускаем каждый день в 3:00 UTC
- cron: '0 3 * * *'
jobs:
changes:
runs-on: ubuntu-latest
outputs:
metadata: ${{ steps.check.outputs.metadata }}
steps:
- uses: https://gitea.com/actions/checkout@v4
with:
fetch-depth: 0
- name: Install system dependencies
run: |
sudo apt update
sudo apt install -y jq curl git
- name: Generate wine metadata
run: bash generate_wine_metadata.sh
- name: Check changed files
id: check
env:
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
GITEA_ACTOR: ${{ gitea.actor }}
GITEA_SERVER: "git.linux-gaming.ru"
GITEA_REPOSITORY: ${{ gitea.repository }}
run: |
# Get changed files
git diff --name-only > changed_files.txt
echo "Changed files:"
cat changed_files.txt
if grep -q "wine_metadata.json" changed_files.txt; then
rm -v changed_files.txt
bash push-to-gitea.sh
fi

165
generate_wine_metadata.sh Executable file
View File

@@ -0,0 +1,165 @@
#!/usr/bin/env bash
OUTPUT_FILE="wine_metadata.json"
TEMP_DIR="/tmp/wine_metadata_$$"
mkdir -p "$TEMP_DIR"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >&2
}
cleanup() {
rm -rf "$TEMP_DIR"
}
trap cleanup EXIT
fetch_github_releases() {
local repo="$1"
local output_file="$2"
log "Получение релизов из $repo..."
local url="https://api.github.com/repos/$repo/releases"
if ! curl -s -H "Accept: application/vnd.github.v3+json" "$url" > "$output_file"; then
log "Ошибка при получении релизов для $repo"
return 1
fi
local count=$(jq '. | length' "$output_file" 2>/dev/null || echo "0")
log "Получено данных для $repo: $count релизов"
}
create_wine_entries() {
local input_file="$1"
local file_extension="$2"
local exclude_patterns="$3"
jq -r --arg ext "$file_extension" '
.[] |
.assets[] |
select(.browser_download_url | test($ext)) |
{
name: (.name | gsub($ext; "")),
url: .browser_download_url,
size: .size,
created_at: .created_at
}
' "$input_file" | \
if [[ -n "$exclude_patterns" ]]; then
jq -c --arg patterns "$exclude_patterns" '
select(.name | test($patterns) | not)
'
else
jq -c '.'
fi
}
log "Начало генерации метаданных..."
# PROTON_GE
fetch_github_releases "GloriousEggroll/proton-ge-custom" "$TEMP_DIR/proton_ge_releases.json"
create_wine_entries "$TEMP_DIR/proton_ge_releases.json" "\\.tar\\.gz$" "github-action" > "$TEMP_DIR/proton_ge.json"
# WINE_KRON4EK
fetch_github_releases "Kron4ek/Wine-Builds" "$TEMP_DIR/wine_kron4ek_releases.json"
create_wine_entries "$TEMP_DIR/wine_kron4ek_releases.json" "\\.tar\\.xz$" "-x86|-wow64" > "$TEMP_DIR/wine_kron4ek.json"
# PROTON_LG
fetch_github_releases "Castro-Fidel/wine_builds" "$TEMP_DIR/proton_lg_releases.json"
create_wine_entries "$TEMP_DIR/proton_lg_releases.json" "\\.tar\\.xz$" "plugins" > "$TEMP_DIR/proton_lg.json"
# PROTON_CACHYOS
fetch_github_releases "CachyOS/proton-cachyos" "$TEMP_DIR/proton_cachyos_releases.json"
create_wine_entries "$TEMP_DIR/proton_cachyos_releases.json" "\\.tar\\.xz$" "v3|znver4" > "$TEMP_DIR/proton_cachyos.json"
# PROTON_SAREK
fetch_github_releases "pythonlover02/Proton-Sarek" "$TEMP_DIR/proton_sarek_releases.json"
create_wine_entries "$TEMP_DIR/proton_sarek_releases.json" "\\.tar\\.gz$" "" > "$TEMP_DIR/proton_sarek.json"
# PROTON_EM
fetch_github_releases "Etaash-mathamsetty/Proton" "$TEMP_DIR/proton_em_releases.json"
create_wine_entries "$TEMP_DIR/proton_em_releases.json" "\\.tar\\.xz$" "" > "$TEMP_DIR/proton_em.json"
# Создание итогового JSON файла
log "Создание итогового JSON файла..."
{
cat << 'JSON_START'
{
"proton_ge": [
JSON_START
if [[ -s "$TEMP_DIR/proton_ge.json" ]]; then
sed '$!s/$/,/' "$TEMP_DIR/proton_ge.json" | sed 's/^/ /'
fi
cat << 'JSON_CONTINUE'
],
"wine_kron4ek": [
JSON_CONTINUE
if [[ -s "$TEMP_DIR/wine_kron4ek.json" ]]; then
sed '$!s/$/,/' "$TEMP_DIR/wine_kron4ek.json" | sed 's/^/ /'
fi
cat << 'JSON_CONTINUE2'
],
"proton_lg": [
JSON_CONTINUE2
if [[ -s "$TEMP_DIR/proton_lg.json" ]]; then
sed '$!s/$/,/' "$TEMP_DIR/proton_lg.json" | sed 's/^/ /'
fi
cat << 'JSON_CONTINUE4'
],
"proton_cachyos": [
JSON_CONTINUE4
if [[ -s "$TEMP_DIR/proton_cachyos.json" ]]; then
sed '$!s/$/,/' "$TEMP_DIR/proton_cachyos.json" | sed 's/^/ /'
fi
cat << 'JSON_CONTINUE5'
],
"proton_sarek": [
JSON_CONTINUE5
if [[ -s "$TEMP_DIR/proton_sarek.json" ]]; then
sed '$!s/$/,/' "$TEMP_DIR/proton_sarek.json" | sed 's/^/ /'
fi
cat << 'JSON_CONTINUE6'
],
"proton_em": [
JSON_CONTINUE6
if [[ -s "$TEMP_DIR/proton_em.json" ]]; then
sed '$!s/$/,/' "$TEMP_DIR/proton_em.json" | sed 's/^/ /'
fi
cat << 'JSON_END'
]
}
JSON_END
} > "$OUTPUT_FILE"
sed -i "s/TIMESTAMP_PLACEHOLDER/$(date -u +%Y-%m-%dT%H:%M:%SZ)/" "$OUTPUT_FILE"
if jq empty "$OUTPUT_FILE" 2>/dev/null; then
log "JSON файл создан успешно и валиден: $OUTPUT_FILE"
else
log "ОШИБКА: Созданный JSON файл невалиден!"
exit 1
fi
echo
log "Статистика созданного файла:"
for category in proton_ge wine_kron4ek proton_lg proton_cachyos proton_sarek proton_em; do
count=$(jq -r ".${category} | length" "$OUTPUT_FILE" 2>/dev/null || echo "0")
log " $category: $count версий"
done
log "Генерация метаданных завершена: $OUTPUT_FILE"

28
push-to-gitea.sh Executable file
View File

@@ -0,0 +1,28 @@
#!/bin/sh
set -e
timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
AUTHOR_EMAIL='gitea-actions@users.noreply.gitea.com'
AUTHOR_NAME='Gitea Actions'
MESSAGE="chore: metadata list ${timestamp}"
BRANCH=main
echo "Push to branch $BRANCH"
[ -z "${GITEA_TOKEN}" ] && {
echo 'Missing input "gitea_token: bcde86030adcb863b8ff96f994ecf248ced607e4".'
exit 1
}
cd "."
remote_repo="https://${GITEA_ACTOR}:${GITEA_TOKEN}@${GITEA_SERVER}/${GITEA_REPOSITORY}.git"
git config http.sslVerify false
git config --local user.email "${AUTHOR_EMAIL}"
git config --local user.name "${AUTHOR_NAME}"
git add -A
git commit -m "${MESSAGE}" || exit 0
git push "${remote_repo}" HEAD:"${BRANCH}"