first commit
This commit is contained in:
44
.gitea/metadata.yml
Normal file
44
.gitea/metadata.yml
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
name: Update Wine Metadata
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
# Запускаем каждый день в 3:00 UTC
|
||||||
|
- cron: '0 3 * * *'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
update-metadata:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: https://gitea.com/actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y jq curl
|
||||||
|
|
||||||
|
- name: Make script executable
|
||||||
|
run: chmod +x generate_wine_metadata.sh
|
||||||
|
|
||||||
|
- name: Generate wine metadata
|
||||||
|
run: bash generate_wine_metadata.sh
|
||||||
|
|
||||||
|
- name: Check if metadata changed
|
||||||
|
id: check_changes
|
||||||
|
run: |
|
||||||
|
if git diff --quiet wine_metadata.json; then
|
||||||
|
echo "changed=false" >> $GITHUB_OUTPUT
|
||||||
|
else
|
||||||
|
echo "changed=true" >> $GITHUB_OUTPUT
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Commit and push changes
|
||||||
|
if: steps.check_changes.outputs.changed == 'true'
|
||||||
|
env:
|
||||||
|
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
|
||||||
|
GITEA_ACTOR: ${{ gitea.actor }}
|
||||||
|
GITEA_SERVER: "git.linux-gaming.ru"
|
||||||
|
GITEA_REPOSITORY: ${{ gitea.repository }}
|
||||||
|
run: bash push-to-gitea.sh
|
210
generate_wine_metadata.sh
Executable file
210
generate_wine_metadata.sh
Executable file
@@ -0,0 +1,210 @@
|
|||||||
|
#!/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 page=1
|
||||||
|
local temp_file="$TEMP_DIR/$(basename "$output_file" .json)_page"
|
||||||
|
|
||||||
|
> "$output_file"
|
||||||
|
|
||||||
|
local all_releases="$TEMP_DIR/all_$(basename "$output_file")"
|
||||||
|
echo "[]" > "$all_releases"
|
||||||
|
|
||||||
|
while true; do
|
||||||
|
local url="https://api.github.com/repos/$repo/releases?page=$page&per_page=100"
|
||||||
|
local response="$temp_file$page"
|
||||||
|
|
||||||
|
if ! curl -s -H "Accept: application/vnd.github.v3+json" "$url" > "$response"; then
|
||||||
|
log "Ошибка при получении страницы $page для $repo"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! jq -e '. | length > 0' "$response" >/dev/null 2>&1; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
|
||||||
|
jq -s '.[0] + .[1]' "$all_releases" "$response" > "$all_releases.tmp" && mv "$all_releases.tmp" "$all_releases"
|
||||||
|
|
||||||
|
((page++))
|
||||||
|
|
||||||
|
if [[ $page -gt 50 ]]; then
|
||||||
|
log "Предупреждение: достигнут лимит страниц (50) для $repo"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
|
||||||
|
sleep 0.5
|
||||||
|
done
|
||||||
|
|
||||||
|
cp "$all_releases" "$output_file"
|
||||||
|
|
||||||
|
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$" "Proton-6\\.5-GE-2|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$" "6\\.3|-x86|-wow64" > "$TEMP_DIR/wine_kron4ek.json"
|
||||||
|
|
||||||
|
# WINE_GE_CUSTOM
|
||||||
|
fetch_github_releases "GloriousEggroll/wine-ge-custom" "$TEMP_DIR/wine_ge_custom_releases.json"
|
||||||
|
create_wine_entries "$TEMP_DIR/wine_ge_custom_releases.json" "\\.tar\\.xz$" "6\\.23" > "$TEMP_DIR/wine_ge_custom.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'
|
||||||
|
{
|
||||||
|
"metadata": {
|
||||||
|
"generated_at": "TIMESTAMP_PLACEHOLDER",
|
||||||
|
"description": "PortProton Wine versions metadata"
|
||||||
|
},
|
||||||
|
"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'
|
||||||
|
],
|
||||||
|
"wine_ge_custom": [
|
||||||
|
JSON_CONTINUE2
|
||||||
|
|
||||||
|
if [[ -s "$TEMP_DIR/wine_ge_custom.json" ]]; then
|
||||||
|
sed '$!s/$/,/' "$TEMP_DIR/wine_ge_custom.json" | sed 's/^/ /'
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat << 'JSON_CONTINUE3'
|
||||||
|
],
|
||||||
|
"proton_lg": [
|
||||||
|
JSON_CONTINUE3
|
||||||
|
|
||||||
|
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 wine_ge_custom 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
28
push-to-gitea.sh
Executable 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}"
|
Reference in New Issue
Block a user