Merge remote-tracking branch 'origin/cooker' into feat/game-downloader

This commit is contained in:
XargonWan 2024-12-27 11:45:10 +00:00
commit 82e60ebd0d
6074 changed files with 277543 additions and 12480 deletions
.github/workflows
.gitignore.gitmodulesREADME.md
automation_tools
config
PCSX2
cemu
citra
dolphin
duckstation
ecwolf
es-de
gzdoom
mame
melonds
patches/updates
pico-8
portmaster
ppssppsdl
primehack

102
.github/workflows/build-godot.yml vendored Normal file
View file

@ -0,0 +1,102 @@
name: GoDot Configurator Build Debug
run-name: Build Godot Configurator(DEBUG) for RetroDECK
on:
workflow_dispatch:
inputs:
job_target:
description: 'Select the platform'
required: true
default: 'linux'
type: choice
options:
- linux
- windows
- mac
- all
env:
GODOT_VERSION: 4.3
GODOT_PROJECT_LOCATION: tools/configurator/project.godot
EXPORT_FOLDER_LINUX: bin/Linux
EXPORT_FOLDER_WINDOWS: bin/Windows
EXPORT_FOLDER_MAC: bin/macOS
APPLICATION_NAME: godot_configurator
jobs:
linux-build:
runs-on: ubuntu-latest
container:
image: archlinux:latest
steps:
- name: Set up variable
run: |
echo "DATE=$(date +'%Y-%m-%d')" >> $GITHUB_ENV
echo "MAIN_FOLDER=$(pwd)" >> $GITHUB_ENV
- name: Installing dependencies
run: pacman -Syu --noconfirm git bash yasm python python-pip scons gcc diffutils make wget unzip tar mingw-w64
- name: Checkout
uses: actions/checkout@v4
with:
submodules: recursive
- name: Prepare Godot
run: |
wget -q -O godot_linux.zip https://github.com/godotengine/godot-builds/releases/download/${GODOT_VERSION}-stable/Godot_v${GODOT_VERSION}-stable_linux.x86_64.zip
unzip godot_linux.zip
wget -q -O godot_export_templates.tpz https://github.com/godotengine/godot-builds/releases/download/${GODOT_VERSION}-stable/Godot_v${GODOT_VERSION}-stable_export_templates.tpz
mkdir -p ~/.local/share/godot/export_templates/${GODOT_VERSION}.stable
unzip godot_export_templates.tpz -d ~/.local/share/godot/export_templates/${GODOT_VERSION}.stable
mv ~/.local/share/godot/export_templates/${GODOT_VERSION}.stable/templates/* ~/.local/share/godot/export_templates/${GODOT_VERSION}.stable/
sed -i 's/config\/version=\"[^"]\*"/config\/version=\"${{ env.DATE }}-debug\"/' ${{ env.GODOT_PROJECT_LOCATION }}
# DEBUG BUILDS
# LINUX
- name: Building debug Linux
if: ${{ github.event.inputs.job_target == 'linux' || github.event.inputs.job_target == 'all' }}
run: |
mkdir -p ${{ env.EXPORT_FOLDER_LINUX }}
./Godot_v${GODOT_VERSION}-stable_linux.x86_64 --import ${{ env.GODOT_PROJECT_LOCATION }} --quiet --headless --export-debug "Linux/X11 64-bit" ${{ env.MAIN_FOLDER }}/${{ env.EXPORT_FOLDER_LINUX }}/${{ env.APPLICATION_NAME}}.x86_64
chmod +x ${{ env.EXPORT_FOLDER_LINUX }}/${{ env.APPLICATION_NAME }}.sh
chmod +x ${{ env.EXPORT_FOLDER_LINUX }}/${{ env.APPLICATION_NAME }}.x86_64
# TAR to keep permissions set above
- name: Tar File
if: ${{ github.event.inputs.job_target == 'linux' || github.event.inputs.job_target == 'all' }}
run: tar cvf ${{ env.APPLICATION_NAME}}_linux_debug_${{ env.DATE}}.tar ${{ env.EXPORT_FOLDER_LINUX}}
- name: Uploading GDExtension artifact debug
if: ${{ github.event.inputs.job_target == 'linux' || github.event.inputs.job_target == 'all' }}
uses: actions/upload-artifact@v4
with:
name: ${{ env.APPLICATION_NAME }}_linux_debug_${{ env.DATE }}.tar
path: ${{ env.APPLICATION_NAME }}_linux_debug_${{ env.DATE }}.tar
# WINDOWS
- name: Building debug Windows
if: ${{ github.event.inputs.job_target == 'windows' || github.event.inputs.job_target == 'all' }}
run: |
mkdir -p ${{ env.EXPORT_FOLDER_WINDOWS }}
./Godot_v${GODOT_VERSION}-stable_linux.x86_64 --import ${{ env.GODOT_PROJECT_LOCATION }} --quiet --headless --export-debug "windows" ${{ env.MAIN_FOLDER }}/${{ env.EXPORT_FOLDER_WINDOWS }}/${{ env.APPLICATION_NAME}}.exe
- name: Uploading GDExtension artifact debug
if: ${{ github.event.inputs.job_target == 'windows' || github.event.inputs.job_target == 'all' }}
uses: actions/upload-artifact@v4
with:
name: ${{ env.APPLICATION_NAME }}_windows_debug_${{ env.DATE }}
path: ${{ env.EXPORT_FOLDER_WINDOWS }}/
#MAC
- name: Building debug macOS
if: ${{ github.event.inputs.job_target == 'mac' || github.event.inputs.job_target == 'all' }}
run: |
mkdir -p ${{ env.EXPORT_FOLDER_MAC }}
./Godot_v${GODOT_VERSION}-stable_linux.x86_64 --import ${{ env.GODOT_PROJECT_LOCATION }} --quiet --headless --export-debug "macOS" ${{ env.MAIN_FOLDER }}/${{ env.EXPORT_FOLDER_MAC}}/${{ env.APPLICATION_NAME}}.app
- name: Uploading GDExtension artifact debug
if: ${{ github.event.inputs.job_target == 'mac' || github.event.inputs.job_target == 'all' }}
uses: actions/upload-artifact@v4
with:
name: ${{ env.APPLICATION_NAME }}_mac_debug_${{ env.DATE }}
path: ${{ env.EXPORT_FOLDER_MAC }}/

359
.github/workflows/build_release.yml vendored Normal file
View file

@ -0,0 +1,359 @@
name: "Build RetroDECK"
on:
push:
branches:
- main
- cooker*
- feat*
- branch/cooker*
paths:
- '.github/workflows/**'
- 'automation_tools/**'
- 'config/**'
- 'functions/**'
- 'rd-submodules/**'
- '*.sh'
- 'net.retrodeck.retrodeck.yml'
- 'net.retrodeck.retrodeck.appdata.xml'
pull_request:
branches:
- main
- cooker*
workflow_dispatch:
permissions:
contents: write
jobs:
# Build RetroDECK Job
Build_RetroDECK:
runs-on: retrodeck
outputs:
TAG: ${{ steps.version-tag.outputs.TAG }}
RELEASE_BODY: ${{ steps.version-tag.outputs.RELEASE_BODY }}
MAKE_LATEST: ${{ steps.version-tag.outputs.MAKE_LATEST }}
steps:
# Remove Stuck Mounts
- name: Remove stuck mounts
run: |
sudo umount -f /home/ubuntu/actions-runner/_work/RetroDECK/RetroDECK/.flatpak-builder/rofiles/*
sudo umount -f $HOME/actions-run/_work/RetroDECK/RetroDECK/.flatpak-builder/rofiles/*
continue-on-error: true
# Clone Repository
- name: Clone RetroDECK repo
uses: actions/checkout@v4
with:
submodules: true
# Install Dependencies
- name: Install dependencies
run: curl "https://raw.githubusercontent.com/RetroDECK/components-template/main/automation_tools/install_dependencies.sh" | bash
# Generate Build ID for Cooker Branches
- name: Generate cooker build ID
if: github.ref != 'refs/heads/main'
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/cooker_build_id.sh"
# Getting branch name, this needs as PR should be managed in a different way
- name: Get Branch Name
run: |
if [[ "$GITHUB_EVENT_NAME" == "pull_request" || "$GITHUB_EVENT_NAME" == "pull_request_target" ]]; then
branch_name="$GITHUB_HEAD_REF"
else
branch_name="$GITHUB_REF_NAME"
fi
echo "Branch name: $branch_name"
echo "BRANCH_NAME=$branch_name" >> $GITHUB_ENV
# Generates a version tag based on the event type (main branch, PR, or cooker) and sets it as output.
- name: Generate Version Tag
id: version-tag
run: |
# Source the version extractor script and fetch the manifest version
source automation_tools/version_extractor.sh
MANIFEST_VERSION="$(fetch_manifest_version)"
# Ensure the manifest version was successfully extracted
if [[ -z "$MANIFEST_VERSION" ]]; then
echo "[ERROR] Failed to extract the manifest version."
exit 1
fi
# Determine the tag based on the GitHub event context
if [[ "$GITHUB_REF" == "refs/heads/main" ]]; then
# Main branch tag
TAG="$MANIFEST_VERSION"
MAKE_LATEST=true
elif [[ "$GITHUB_EVENT_NAME" == "pull_request" || "$GITHUB_EVENT_NAME" == "pull_request_target" ]]; then
# Pull request tag, sanitize the source branch
source_branch="${GITHUB_HEAD_REF//\//-}"
TAG="PR-$source_branch-${{ github.run_id }}"
MAKE_LATEST=false
else
# Other branches (cooker branches)
TAG="$MANIFEST_VERSION-${{ env.BUILD_ID }}"
MAKE_LATEST=true
fi
echo "TAG=$TAG" >> $GITHUB_ENV
echo "MAKE_LATEST=$MAKE_LATEST" >> $GITHUB_ENV
echo "TAG=$TAG" >> $GITHUB_OUTPUT
echo "MAKE_LATEST=$MAKE_LATEST" >> $GITHUB_OUTPUT
# backing up manifest in case download fails and hashes must be recalculated
- name: Manifest backup
run: "cp ${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml ${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml.bak"
- name: Run pre-build automation tasks
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/pre_build_automation.sh"
- name: "Adding flatpak portal for automated updates (Cooker only)"
if: github.ref != 'refs/heads/main'
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/cooker_flatpak_portal_add.sh"
- name: "Updating release notes in appdata"
run: "automation_tools/appdata_management.sh"
- name: "[DEBUG] Outputting manifest"
run: cat net.retrodeck.retrodeck.yml
# Get Commits Since Last Published Release (Cooker only)
- name: Get commits since last published release
id: get-commits
if: github.ref != 'refs/heads/main'
run: |
# Get the latest published release tag
LATEST_TAG=$(git describe --tags $(git rev-list --tags --max-count=1) 2>/dev/null || echo "")
if [ -z "$LATEST_TAG" ]; then
echo "[INFO] No previous release found. Using all commits."
COMMITS=$(git log HEAD --pretty=format:"- %s")
else
echo "[INFO] Latest published release tag: $LATEST_TAG"
COMMITS=$(git log ${LATEST_TAG}..HEAD --pretty=format:"- %s")
fi
# Debug: Print the commits list
echo "Commits since $LATEST_TAG:"
echo "$COMMITS"
# Export the commits list to the GitHub environment
echo "COMMITS=$COMMITS" >> $GITHUB_ENV
# - name: Extract XML Description
# uses: Mudlet/xmlstarlet-action@master
# id: extract-description
# with:
# args: sel -t -v "/component/releases/release[1]/description//text()" ./net.retrodeck.retrodeck.appdata.xml
# Generate Release Body
- name: Generate release body text
id: generate-body
run: |
# Initialize the release body text
RELEASE_BODY="# Release Notes\n"
RELEASE_BODY+="This is a cooker snapshot based on the commit: ${{ github.event.repository.full_name }}@${{github.sha}}."
RELEASE_BODY+="On branch [${{env.BRANCH_NAME}}](https://repo.retrodeck.net/RetroDECK/RetroDECK/src/branch/${{env.BRANCH_NAME}})."
RELEASE_BODY+="## Commits since last release\n"
RELEASE_BODY+="$COMMITS\n\n"
#raw_description="${{ steps.extract-description.outputs.result }}"
# Convert <p> tags to markdown headers using sed
markdown_description=$(echo "$raw_description" | sed -e 's|<p>|\n### |g' -e 's|</p>||g')
# Convert <li> tags to bullet points and trim spaces
markdown_description=$(echo "$markdown_description" | sed -e 's|<ul>||g' -e 's|</ul>||g' -e 's|<li>|- |g' -e 's|</li>||g' | awk '{$1=$1;print}')
# Remove any remaining XML tags
markdown_description=$(echo "$markdown_description" | sed -e 's/<[^>]*>//g')
# Debug: Print the markdown description
echo "Markdown Description:"
echo "$markdown_description"
# Append markdown content to the release body
RELEASE_BODY+="$markdown_description"
printf "RELEASE_BODY=%s\n" "$RELEASE_BODY" >> $GITHUB_ENV
printf "RELEASE_BODY=%s\n" "$RELEASE_BODY" >> $GITHUB_OUTPUT
echo "[DEBUG] CHECKPOINT 8"
- name: Generate a token for Rekku
id: generate-rekku-token
uses: actions/create-github-app-token@v1
with:
app-id: ${{ vars.REKKU_APP_ID }}
private-key: ${{ secrets.REKKU_PRIVATE_KEY }}
repositories: "RetroDECK,Cooker"
owner: "RetroDECK"
- name: "Build flatpak: download only"
id: flatpak-download
run: |
git config --global credential.helper store
echo "https://${{ steps.generate-rekku-token.outputs.token }}@github.com" > ~/.git-credentials
"${GITHUB_WORKSPACE}/automation_tools/flatpak_build_download_only.sh"
# Sometimes flatpak download fails, in this case it tries a second time
- name: "Build flatpak: download only (retry)"
if: steps.flatpak-download.outcome == 'failure'
run: |
git config --global credential.helper store
echo "https://${{ steps.generate-rekku-token.outputs.token }}@github.com" > ~/.git-credentials
echo "Download failed, maybe some hash changed since the build start."
echo "Recalculating hashes and retrying download..."
rm -f "{GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml"
cp "${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml.bak" "${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml"
"${GITHUB_WORKSPACE}/automation_tools/pre_build_automation.sh"
"${GITHUB_WORKSPACE}/automation_tools/flatpak_build_download_only.sh"
- name: Build flatpak
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_only.sh"
- name: Create Bundle
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_bundle.sh"
# Upload artifacts for other jobs
- name: Upload Build Artifacts
uses: actions/upload-artifact@v4
with:
name: retrodeck-artifacts
include-hidden-files: true
path: |
RetroDECK*.flatpak
RetroDECK*.flatpak.sha
RetroDECK*Artifact.tar.gz
GitHub-publish:
runs-on: ubuntu-latest
needs: Build_RetroDECK
env:
TAG: ${{ needs.Build_RetroDECK.outputs.TAG }}
RELEASE_BODY: ${{ needs.Build_RetroDECK.outputs.RELEASE_BODY }}
MAKE_LATEST: ${{ needs.Build_RetroDECK.outputs.MAKE_LATEST }}
steps:
- name: Generate a token for Rekku
id: generate-rekku-token
uses: actions/create-github-app-token@v1
with:
app-id: ${{ vars.REKKU_APP_ID }}
private-key: ${{ secrets.REKKU_PRIVATE_KEY }}
repositories: "RetroDECK,Cooker"
owner: "RetroDECK"
- name: Download all workflow run artifacts
uses: actions/download-artifact@v4.1.8
# Determine if Target Repository is Main or not, in that case is a Cooker build
- name: Determine target repository
id: set-repo
run: |
if [[ "$GITHUB_REF" == "refs/heads/main" ]]; then
echo "REPO_NAME=RetroDECK" >> $GITHUB_ENV
else
echo "REPO_NAME=Cooker" >> $GITHUB_ENV
fi
# Publish Release
- name: Publish release
uses: ncipollo/release-action@v1
with:
tag: ${{ env.TAG }}
name: "RetroDECK ${{ env.TAG }}"
body: ${{ env.RELEASE_BODY }}
artifacts: "retrodeck-artifacts/*.flatpak,retrodeck-artifacts/*.flatpak.sha,retrodeck-artifacts/*Artifact.tar.gz"
allowUpdates: true
makeLatest: ${{ env.MAKE_LATEST }}
repo: ${{ env.REPO_NAME }}
token: ${{ steps.generate-rekku-token.outputs.token }}
# Rewrite Tag (for Main Branch Only)
- name: Rewrite Tag
if: github.ref == 'refs/heads/main'
run: |
git submodule deinit -f --all
git fetch --tags
if git rev-parse --verify "${{ env.TAG }}" >/dev/null 2>&1; then
git tag -d "${{ env.TAG }}"
git push --delete origin "${{ env.TAG }}"
fi
git tag "${{ env.TAG }}"
git push origin "${{ env.TAG }}"
env:
GITHUB_TOKEN: ${{ steps.generate-rekku-token.outputs.token }}
# As backup we're even publishing the build on our own selfhosted Fogejo instance
# Forgejo Publish Job if main branch
# Forgejo-publish:
# runs-on: ubuntu-latest
# needs: Build_RetroDECK
# env:
# TAG: ${{ needs.Build_RetroDECK.outputs.TAG }}
# RELEASE_BODY: ${{ needs.Build_RetroDECK.outputs.RELEASE_BODY }}
# MAKE_LATEST: ${{ needs.Build_RetroDECK.outputs.MAKE_LATEST }}
# steps:
#
# - name: Download all workflow run artifacts
# uses: actions/download-artifact@v4.1.8
#
# - name: Forgejo-publish
# if: github.ref == 'refs/heads/main'
# uses: RetroDECK/components-template/.github/workflows/fogejo_publish_release.yml@main
# with:
# release_body: ${{ env.RELEASE_BODY }}
# artifacts: "retrodeck-artifacts/*.flatpak,retrodeck-artifacts/*.flatpak.sha,retrodeck-artifacts/*Artifact.tar.gz"
# tag: ${{ env.TAG }}
# Automated Tests
Automated_Tests:
runs-on: ubuntu-latest
needs: Build_RetroDECK
continue-on-error: true
steps:
# Clone Repository
- name: Clone RetroDECK repo
uses: actions/checkout@v4
with:
submodules: true
# Download RetroDECK Artifacts
- name: Download all workflow run artifacts
uses: actions/download-artifact@v4.1.8
# Install Dependencies
- name: Install dependencies
run: curl "https://raw.githubusercontent.com/RetroDECK/components-template/main/automation_tools/install_dependencies.sh" | bash
# Install RetroDECK Flatpak
- name: Install RetroDECK Flatpak
continue-on-error: true
run: |
ls -lah retrodeck-artifacts
flatpak install --user --bundle --noninteractive -y "retrodeck-artifacts/RetroDECK"*".flatpak
# Run Post Build Checks
- name: Run Post Build Checks
continue-on-error: true
run: /bin/bash ./automation_tools/post_build_check.sh
# Search for Missing Libraries
- name: Search for Missing Libraries
continue-on-error: true
run: /bin/bash ./automation_tools/search_missing_libs.sh
# Uninstall RetroDECK Flatpak - Not needed on a thorwaway ubuntu-latest
# - name: Uninstall RetroDECK Flatpak
# run: |
# flatpak remove --user --noninteractive -y net.retrodeck.retrodeck

View file

@ -1,219 +0,0 @@
name: "Build cooker"
on:
push:
branches:
- cooker*
- feat*
paths:
- '.github/workflows/**'
- 'automation_tools/**'
- 'emu-configs/**'
- 'es-configs/**'
- 'functions/**'
- 'rd-submodules/**'
- '*.sh'
- 'net.retrodeck.retrodeck.yml'
- 'net.retrodeck.retrodeck.appdata.xml'
pull_request:
branches:
- cooker*
# Italy (CET): 11:00 PM
# Japan (JST): 7:00 AM
# schedule:
# - cron: '0 22 * * *'
workflow_dispatch:
jobs:
Building_RetroDECK:
runs-on: self-hosted
steps:
# Circumventing this bug: https://github.com/flatpak/flatpak-builder/issues/317
- name: Remove stuck mounts
run: sudo umount -f /home/ubuntu/actions-runner/_work/RetroDECK/RetroDECK/.flatpak-builder/rofiles/*
continue-on-error: true
- name: Clone RetroDECK repo
uses: actions/checkout@v3
with:
submodules: 'true'
- name: "Install dependencies"
run: "automation_tools/install_dependencies.sh"
- name: Generate cooker build ID
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/cooker_build_id.sh"
- name: Get branch name
id: branch_name
run: echo "BRANCH_NAME=$(echo $GITHUB_REF | sed 's|refs/heads/||')" >> $GITHUB_ENV
# if it's a feature branch it will not marked as "latest" cooker version
- name: "Set makeLatest (cooker only)"
run: |
if [[ "$BRANCH_NAME" == 'feat/'* || "$BRANCH_NAME" == 'refs/'* ]]; then
echo "MAKE_LATEST=false" >> $GITHUB_ENV
else
echo "MAKE_LATEST=true" >> $GITHUB_ENV
fi
# if the branch is coming from a PR the tag should be manually built
- name: "Generate version tag"
run: |
if [[ "$BRANCH_NAME" == 'refs/'* ]]; then
pr_number=$(echo ${{env.BRANCH_NAME}} | awk -F'/' '{print $3}')
source_branch=$(curl -s "https://api.github.com/repos/XargonWan/RetroDECK/pulls/$pr_number" | jq -r '.head.ref')
source_branch=${source_branch//\//-}
echo "[DEBUG] source branch is: $source_branch"
echo "TAG=PR-$pr_number-$source_branch-${{ env.buildid }}" >> $GITHUB_ENV
else
echo "TAG=${{env.BRANCH_NAME}}-${{ env.buildid }}" >> $GITHUB_ENV
fi
echo "Version TAG: ${{ env.TAG }}"
# backing up manifest in case download fails and hashes must be recalculated
- name: Manifest backup
run: "cp ${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml ${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml.bak"
- name: Run pre-build automation tasks
run : "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/pre_build_automation.sh"
- name: "Adding flatpak portal for automated updates (cooker only)"
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/cooker_flatpak_portal_add.sh"
- name: "Updating release notes in appdata"
run: "automation_tools/appdata_management.sh"
- name: "[DEBUG] Outputting manifest"
run: cat net.retrodeck.retrodeck.yml
- name: "Build flatpak: download only"
id: "flatpak-download"
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_download_only.sh"
continue-on-error: true
# Sometimes flatpak download fails, in this case it tries a second time
- name: "Build flatpak: download only (retry)"
if: steps.flatpak-download.outcome == 'failure'
run: |
echo "Download failed, maybe some hash changed since the build start."
echo "Recalculating hashes and retrying download..."
rm -f "{GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml"
cp "${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml.bak" "${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml"
"${GITHUB_WORKSPACE}/automation_tools/pre_build_automation.sh"
"${GITHUB_WORKSPACE}/automation_tools/flatpak_build_download_only.sh"
- name: Build flatpak
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_only.sh"
- name: Create Artifact for flathub
run: |
tar -czf ${GITHUB_WORKSPACE}/RetroDECK-Artifact-cooker.tar.gz -C ${GITHUB_WORKSPACE}/retrodeck-flatpak-cooker .
hash=($(sha256sum ${GITHUB_WORKSPACE}/RetroDECK-Artifact-cooker.tar.gz))
echo $hash > ${GITHUB_WORKSPACE}/RetroDECK-Artifact-cooker.sha
mv -f RetroDECK-Artifact-cooker.* ${{ secrets.ARTIFACT_REPO }}
continue-on-error: true
- name: Create Bundle
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_bundle.sh"
- name: Set environment variable with current branch name
run: echo "GITHUB_REF_SLUG=$(git rev-parse --abbrev-ref HEAD)" >> $GITHUB_ENV
- name: Get commits since last release
run: |
# Get the latest release tag
LATEST_TAG=$(git describe --tags --abbrev=0)
# Get all commits since the latest release tag
COMMITS=$(git log $LATEST_TAG..HEAD --pretty=format:"- %s")
# Set the output variable
echo "::set-output name=commits::$COMMITS"
id: commits
continue-on-error: true
- name: Publish the flatpak in a new cooker release
uses: ncipollo/release-action@v1
with:
tag: "${{env.TAG}}"
body: |
# Release Notes (Cooker)
This is a cooker snapshot based on the commit: ${{ github.event.repository.full_name }}@${{github.sha}}.
On branch [${{env.BRANCH_NAME}}](https://github.com/XargonWan/RetroDECK/tree/${{env.BRANCH_NAME}}).
## Commits since last release
${{ steps.commits.outputs.commits }}
For the full release note for this build please refer to the channel [#BETA-TESTING](https://discord.gg/WDc5C9YWMx) on our Discord server.
Cooker channel is provided for the community to test fixes and explore new functionality.
Please DO NOT open issues or ask support on this build.
artifacts: "RetroDECK-cooker.flatpak,RetroDECK-cooker.flatpak.sha,RetroDECK-Artifact.tar.gz"
allowUpdates: true
makeLatest: ${{env.MAKE_LATEST}} # if it's a feat branch is not considered the latest build
token: ${{ secrets.TRIGGER_BUILD_TOKEN }}
repo: RetroDECK-cooker
continue-on-error: true
# In case it cannot publish the release at least it's providing the flatpak file for creating a manual release
- name: Upload RetroDECK-cooker.flatpak
uses: actions/upload-artifact@v3
with:
name: retrodeck-flatpak
path: RetroDECK-cooker.flatpak
continue-on-error: true
# - name: Upload RetroDECK-cooker.flatpak to Gitea Release
# run: |
# # Set variables for Gitea host, organization, repository, access token, and release details
# GITEA_HOST="repo.retrodeck.net"
# ORGANIZATION="RetroDECK"
# REPO="RetroDECK-cooker"
# GITEA_TOKEN="${{ secrets.GITEA_TRIGGER_BUILD_TOKEN }}"
# RELEASE_NAME="RetroDECK ${{env.TAG}}"
# TAG="${{env.TAG}}"
# RELEASE_BODY="# Release Notes (Cooker)
# This is a cooker snapshot based on the commit: ${{ github.event.repository.full_name }}@${{github.sha}}.
# On branch [${{env.BRANCH_NAME}}](https://repo.retrodeck.net/RetroDECK/RetroDECK/src/branch/${{env.BRANCH_NAME}}).
# ## Commits since last release
# ${{ steps.commits.outputs.commits }}
# For the full release note for this build please refer to the channel [#BETA-TESTING](https://discord.gg/WDc5C9YWMx) on our Discord server.
# Cooker channel is provided for the community to test fixes and explore new functionality.
# Please DO NOT open issues or ask support on this build."
# # Create a release using curl and capture the release ID
# release_response=$(curl -X POST \
# -H "Authorization: token ${GITEA_TOKEN}" \
# -H "Content-Type: application/json" \
# -d "{\"tag_name\":\"$TAG\",\"name\":\"$RELEASE_NAME\",\"body\":\"$RELEASE_BODY\"}" \
# "http://$GITEA_HOST/api/v1/repos/$ORGANIZATION/$REPO/releases")
# # Extract the release ID from the response
# release_id=$(echo $release_response | jq -r '.id')
# # Upload artifacts
# curl -X POST \
# -H "Authorization: token ${GITEA_TOKEN}" \
# -H "Content-Type: multipart/form-data" \
# -F "attachment=@RetroDECK-cooker.flatpak" \
# "http://$GITEA_HOST/api/v1/repos/$ORGANIZATION/$REPO/releases/$release_id/assets?name=RetroDECK-cooker.flatpak"
# # Upload artifacts sha
# curl -X POST \
# -H "Authorization: token ${GITEA_TOKEN}" \
# -H "Content-Type: multipart/form-data" \
# -F "attachment=@RetroDECK-cooker.flatpak.sha" \
# "http://$GITEA_HOST/api/v1/repos/$ORGANIZATION/$REPO/releases/$release_id/assets?name=RetroDECK-cooker.flatpak.sha"
# curl -X POST \
# -H "Authorization: token ${GITEA_TOKEN}" \
# -H "Content-Type: multipart/form-data" \
# -F "attachment=@RetroDECK-Artifact.tar.gz" \
# "http://$GITEA_HOST/api/v1/repos/$ORGANIZATION/$REPO/releases/$release_id/assets?name=RetroDECK-Artifact.tar.gz"

56
.github/workflows/emulator-updates.yaml vendored Normal file
View file

@ -0,0 +1,56 @@
name: Check Emulator Updates
on:
# schedule:
# - cron: '0 18 * * *'
# push:
# branches:
# - main
workflow_dispatch:
jobs:
check-updates:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: '3.x'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install flatpak-builder-tools
- name: Check for emulator updates
run: |
flatpak-builder --check-updates ./net.retrodeck.retrodeck.yml --modules "modulo1,modulo2" # Sostituisci modulo1,modulo2 con i tuoi moduli specifici
- name: Configure Git
run: |
git config --global user.name "github-actions[bot]"
git config --global user.email "github-actions[bot]@users.noreply.github.com"
- name: Create or update branch
run: |
git fetch origin
if git rev-parse --verify origin/feat/auto-emulator-updates; then
git branch -D feat/auto-emulator-updates
fi
git checkout -b feat/auto-emulator-updates
git add .
git commit -m "Update emulators"
git push --set-upstream origin feat/auto-emulator-updates --force
- name: Create Pull Request
uses: peter-evans/create-pull-request@v5
with:
token: ${{ secrets.GITHUB_TOKEN }}
source: feat/auto-emulator-updates
destination: cooker-0.8.2b
title: 'Automated Emulator Updates'
body: 'This PR contains automated updates for specified emulators.'

View file

@ -26,7 +26,7 @@ jobs:
fi
git clone --recursive https://github.com/flathub/net.retrodeck.retrodeck.git flathub
cd $gits_folder
git clone --recursive https://github.com/XargonWan/RetroDECK RetroDECK
git clone --recursive https://github.com/RetroDECK/RetroDECK RetroDECK
cd $gits_folder/RetroDECK
relname="main-"$(git rev-parse --short HEAD)
@ -83,7 +83,7 @@ jobs:
# curl -sL \
# -H "Accept: application/vnd.github+json" \
# -H "Authorization: Bearer ${{ secrets.TRIGGER_BUILD_TOKEN }}" \
# https://api.github.com/repos/XargonWan/RetroDECK-cooker/releases \
# https://api.github.com/repos/RetroDECK/Cooker/releases \
# | jq .[0].tag_name \
# | tr -d \" \
# )

26
.github/workflows/godot.yml vendored Normal file
View file

@ -0,0 +1,26 @@
name: Building a mOnKeyX Project
on:
push:
branches: [ feat/godot-uk ]
pull_request:
branches: [ feat/godot-uk ]
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name : exportGame
uses: firebelley/godot-export@v5.2.1
with:
godot_executable_download_url: https://download.tuxfamily.org/godotengine/4.2.2/Godot_v4.2.2-stable_linux.x86_64.zip
godot_export_templates_download_url: https://download.tuxfamily.org/godotengine/4.2.2/Godot_v4.2.2-stable_export_templates.tpz
relative_project_path: tools/rd-config-test/
create_release: true
env:
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}

View file

@ -1,157 +0,0 @@
name: "Build main"
on:
push:
branches:
- main
paths:
- '.github/workflows/**'
- 'automation_tools/**'
- 'emu-configs/**'
- 'es-configs/**'
- 'functions/**'
- 'rd-submodules/**'
- '*.sh'
- 'net.retrodeck.retrodeck.yml'
- 'net.retrodeck.retrodeck.appdata.xml'
pull_request:
branches:
- main
workflow_dispatch:
jobs:
Building_RetroDECK:
runs-on: self-hosted
steps:
# Circumventing this bug: https://github.com/flatpak/flatpak-builder/issues/317
- name: Remove stuck mounts
run: sudo umount -f /home/ubuntu/actions-runner/_work/RetroDECK/RetroDECK/.flatpak-builder/rofiles/*
continue-on-error: true
- name: Clone RetroDECK repo
uses: actions/checkout@v3
with:
submodules: 'true'
- name: "Install dependencies"
run: "automation_tools/install_dependencies.sh"
# backing up manifest in case download fails and hashes must be recalculated
- name: Manifest backup
run: "cp ${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml ${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml.bak"
- name: Run pre-build automation tasks
run : "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/pre_build_automation.sh"
- name: Read manifest content
id: read_manifest
run: echo "::set-output name=file_content::$(cat net.retrodeck.retrodeck.yml)"
# - name: "Updating release notes in appdata"
# run: "automation_tools/appdata_management.sh"
- name: Check versions (main only)
id: check_version_string
run: "automation_tools/main_version_checker.sh"
- name: "[DEBUG] Outputting manifest"
run: cat net.retrodeck.retrodeck.yml
- name: "Build flatpak: download only"
id: "flatpak-download"
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_download_only.sh"
continue-on-error: true
# Sometimes flatpak download fails, in this case it tries a second time
- name: "Build flatpak: download only (retry)"
if: steps.flatpak-download.outcome == 'failure'
run: |
echo "Download failed, maybe some hash changed since the build start."
echo "Recalculating hashes and retrying download..."
rm -f "{GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml"
cp "${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml.bak" "${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml"
"${GITHUB_WORKSPACE}/automation_tools/pre_build_automation.sh"
"${GITHUB_WORKSPACE}/automation_tools/flatpak_build_download_only.sh"
- name: Build flatpak
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_only.sh"
- name: Create Artifact for flathub
run: |
tar -czf ${GITHUB_WORKSPACE}/RetroDECK-Artifact.tar.gz -C ${GITHUB_WORKSPACE}/retrodeck-flatpak-main .
hash=($(sha256sum ${GITHUB_WORKSPACE}/RetroDECK-Artifact.tar.gz))
echo $hash > ${GITHUB_WORKSPACE}/RetroDECK-Artifact.sha
mv -f RetroDECK-Artifact.* ${{ secrets.ARTIFACT_REPO }}
- name: Create Bundle
run: "/bin/bash ${GITHUB_WORKSPACE}/automation_tools/flatpak_build_bundle.sh"
- name: Getting version info
id: version
run: |
appdata="https://raw.githubusercontent.com/XargonWan/RetroDECK/main/net.retrodeck.retrodeck.appdata.xml"
REL_VER=$(curl -s $appdata | xmlstarlet sel -t -v "//release/@version" | head -1)
DES="$(curl -s $appdata | xmlstarlet sel -t -m "//release[1]" -v "description" -n | sed '1,2d;$d;s/^ */- /;/^- $/d')"
echo "REL_VER=$REL_VER" >> $GITHUB_ENV
echo -e "# Release Notes\n" >> "body.md"
echo "$DES" >> "body.md"
- name: Publish the flatpak in a new release
uses: ncipollo/release-action@v1
env:
REL_VER: ${{ env.REL_VER }}
with:
tag: ${{ env.REL_VER }}
name: "RetroDECK v${{ env.REL_VER }}"
bodyFile: "body.md"
artifacts: "RetroDECK.flatpak,RetroDECK.flatpak.sha,RetroDECK-Artifact.tar.gz"
allowUpdates: true
makeLatest: true
token: ${{ secrets.TRIGGER_BUILD_TOKEN }}
repo: RetroDECK
continue-on-error: true
# In case it cannot publish the release at least it's providing the flatpak file for creating a manual release
- name: Upload RetroDECK.flatpak
uses: actions/upload-artifact@v3
with:
name: retrodeck-flatpak
path: RetroDECK.flatpak
continue-on-error: true
- name: Publish the flatpak in a new release on Gitea
uses: ncipollo/release-action@v1
env:
REL_VER: ${{ env.REL_VER }}
with:
tag: ${{ env.REL_VER }}
name: "RetroDECK v${{ env.REL_VER }}"
bodyFile: "body.md"
artifacts: "RetroDECK.flatpak,RetroDECK-Artifact.tar.gz"
allowUpdates: true
makeLatest: true
token: ${{ secrets.GITEA_TRIGGER_BUILD_TOKEN }}
repo: "https://repo.retrodeck.net/RetroDECK/RetroDECK"
continue-on-error: true
- name: Upload RetroDECK.flatpak to Gitea Release
run: |
curl -X POST \
-H "Authorization: token ${GITEA_TOKEN}" \
-F "file=@RetroDECK.flatpak" \
"https://repo.retrodeck.net/RetroDECK/RetroDECK/releases/${{ env.REL_VER }}/assets?name=RetroDECK.flatpak"
env:
GITEA_TOKEN: ${{ secrets.GITEA_TRIGGER_BUILD_TOKEN }}
- name: Upload RetroDECK.flatpak.sha to Gitea Release
run: |
curl -X POST \
-H "Authorization: token ${GITEA_TOKEN}" \
-F "file=@RetroDECK.flatpak.sha" \
"https://repo.retrodeck.net/RetroDECK/RetroDECK/releases/${{ env.REL_VER }}/assets?name=RetroDECK.flatpak.sha"
env:
GITEA_TOKEN: ${{ secrets.GITEA_TRIGGER_BUILD_TOKEN }}

6
.gitignore vendored
View file

@ -18,10 +18,14 @@ backup
tmp
.godot
rd-submodules/es-de/patches-tmp*
.local/
retrodeck-repo
buildid
*.bak
incconfigs/
.github/workflows/cooker-monkeyx.yml
*.flatpak
*.flatpak.sha
net.retrodeck.retrodeck.cached.yml
# Python #
##########

9
.gitmodules vendored
View file

@ -1,9 +0,0 @@
[submodule "rd-submodules/shared-modules"]
path = rd-submodules/shared-modules
url = https://github.com/flathub/shared-modules.git
[submodule "rd-submodules/retroarch"]
path = rd-submodules/retroarch
url = https://github.com/flathub/org.libretro.RetroArch.git
[submodule "rd-submodules/ryujinx"]
path = rd-submodules/ryujinx
url = https://github.com/flathub/org.ryujinx.Ryujinx

View file

@ -1,13 +1,13 @@
<p float="center">
<img src="https://github.com/XargonWan/RetroDECK/blob/main/res/logo.png?raw=true" alt="RetroDECK logo" width="600"/>
<img src="https://github.com/RetroDECK/RetroDECK/blob/main/res/logo.png?raw=true" alt="RetroDECK logo" width="600"/>
</p>
# RetroDECK on your device!
<p float="center">
<img src="https://github.com/XargonWan/RetroDECK/blob/main/res/screenshots/screen05.jpeg?raw=true" alt="screenshot" width="300"/>
<img src="https://github.com/XargonWan/RetroDECK/blob/main/res/screenshots/screen06.jpeg?raw=true" alt="screenshot" width="300"/>
<img src="https://github.com/RetroDECK/RetroDECK/blob/main/res/screenshots/screen05.jpeg?raw=true" alt="screenshot" width="300"/>
<img src="https://github.com/RetroDECK/RetroDECK/blob/main/res/screenshots/screen06.jpeg?raw=true" alt="screenshot" width="300"/>
</p>
Instead of having several different emulators, engines and frontends on your Linux/SteamOS system you only need one: RetroDECK.
@ -15,7 +15,7 @@ Instead of having several different emulators, engines and frontends on your Lin
![Flathub](https://img.shields.io/flathub/downloads/net.retrodeck.retrodeck)
![Flathub](https://img.shields.io/flathub/v/net.retrodeck.retrodeck)
![Discord](https://img.shields.io/discord/951662718102962256?label=discord)
![GitHub](https://img.shields.io/github/license/XargonWan/RetroDECK)
![GitHub](https://img.shields.io/github/license/RetroDECK/RetroDECK)
[![Documentation Status](https://readthedocs.org/projects/retrodeck/badge/?version=latest)](https://retrodeck.readthedocs.io/en/latest/?badge=latest)
**The RetroDECK Wiki & FAQ**
@ -77,7 +77,7 @@ For our long term vision you can check out the following wiki page:
Use the supports channels on [Discord](https://discord.gg/WDc5C9YWMx) `🤝-community-support` and `🆘-support`.
### The RetroDECK community:
[Website](https://retrodeck.net) <br/>
[Wiki](https://github.com/XargonWan/RetroDECK/wiki) <br/>
[Wiki](https://github.com/RetroDECK/RetroDECK/wiki) <br/>
[Discord](https://discord.gg/WDc5C9YWMx)<br/>
[Lemmy](https://lemmy.zip/c/retrodeck)<br/>
[Subreddit](https://www.reddit.com/r/retrodeck)
@ -96,21 +96,22 @@ Read up here on how to help out, there is something for everyone:
## Our repositories:
| Name | Description |
|-------------------------------------------------------------|-----------------------------------------------------------|
| [RetroDECK](https://github.com/XargonWan/RetroDECK) | This one, our main repo where the core of the project is |
| [RetroDECK-cooker](https://github.com/XargonWan/RetroDECK-cooker) | Where we publish our test build, no code is hosted here |
| [RetroDECK-Wiki](https://github.com/XargonWan/RetroDECK-Wiki) | Where our wiki source code is |
| [RetroDECK-website](https://github.com/XargonWan/RetroDECK-website) | Where our website source code is |
| [RetroDECK](https://github.com/RetroDECK/RetroDECK) | This one, our main repo where the core of the project is |
| [Cooker](https://github.com/RetroDECK/Cooker) | Where we publish our test build, no code is hosted here |
| [RetroDECK/Wiki](https://github.com/RetroDECK/Wiki) | Where our wiki source code is |
| [RetroDECK-website](https://github.com/RetroDECK/RetroDECK-website) | Where our website source code is |
| [RetroDECK on Flathub](https://github.com/flathub/net.retrodeck.retrodeck) | Our little space in Flathub's organization |
| [RetroDECK-MAME](https://github.com/XargonWan/RetroDECK-MAME) | MAME is big to build, so it's pre-built here and then imported in the build |
| [RetroDECK-ES-DE](https://github.com/XargonWan/RetroDECK-ES-DE) | This is where we store our patched fork of ES-DE |
| [RetroDECK/MAME](https://github.com/RetroDECK/MAME) | MAME is big to build, so it's pre-built here and then imported in the build |
| [RetroDECK/ES-DE](https://github.com/RetroDECK/ES-DE) | This is where we store our patched fork of ES-DE |
And many more, for the full list please check our [repositories page on GitHub](https://github.com/orgs/RetroDECK/repositories).
# The RetroDECK Wiki
Please check out the [Wiki](https://github.com/XargonWan/RetroDECK/wiki) for even more information.
Please check out the [Wiki](https://github.com/RetroDECK/RetroDECK/wiki) for even more information.
## The FAQ
The RetroDECK [FAQ](https://github.com/XargonWan/RetroDECK/wiki/FAQs%3A-Frequently-asked-questions) on the wiki has a vast variety of questions and answers.
The RetroDECK [FAQ](https://github.com/RetroDECK/RetroDECK/wiki/FAQs%3A-Frequently-asked-questions) on the wiki has a vast variety of questions and answers.
# How to get support?
Use the supports channels on [Discord](https://discord.gg/WDc5C9YWMx).

View file

@ -7,30 +7,30 @@ source automation_tools/version_extractor.sh
# Fetch appdata version
appdata_version=$(fetch_appdata_version)
log i "Appdata:\t\t$appdata_version"
echo -e "Appdata:\t\t$appdata_version"
# Defining manifest file location
appdata_file="net.retrodeck.retrodeck.appdata.xml"
# Check if release with appdata_version already exists
if grep -q "version=\"$appdata_version\"" "$appdata_file"; then
log i "Deleting existing release version $appdata_version..."
echo -e "Deleting existing release version $appdata_version..."
# Remove the existing release entry
sed -i "/<release version=\"$appdata_version\"/,/<\/release>/d" "$appdata_file"
fi
log i "Adding new release version $appdata_version..."
echo -e "Adding new release version $appdata_version..."
# Get today's date in the required format (YYYY-MM-DD)
today_date=$(date +"%Y-%m-%d")
log i "Today is $today_date"
echo -e "Today is $today_date"
# Construct the release snippet
release_snippet="\
<releases>
<release version=\"$appdata_version\" date=\"$today_date\">
<url>https://github.com/XargonWan/RetroDECK/releases/tag/$appdata_version</url>
<url>https://github.com/RetroDECK/RetroDECK/releases/tag/$appdata_version</url>
<description>
RELEASE_NOTES_PLACEHOLDER
</description>
@ -41,7 +41,8 @@ xml_content=$(cat "$appdata_file")
# Replace RELEASE_NOTES_PLACEHOLDER with the actual release notes
# TODO
git clone https://github.com/XargonWan/RetroDECK.wiki.git /tmp/wiki
rm -rf /tmp/wiki
git clone https://github.com/RetroDECK/RetroDECK.wiki.git /tmp/wiki
# Path to the markdown file
wiki="/tmp/wiki/Version-history:-Patch-Notes.md"

View file

@ -1,15 +1,29 @@
# The proper format for this file is
# ACTION^PLACEHOLDERTEXT^URL^REPO(Optional)
# hash^DOOMSHAPLACEHOLDER^https://buildbot.libretro.com/assets/cores/DOOM/Doom%20%28Shareware%29.zip
hash^DUCKSTATIONSHAPLACEHOLDER^https://github.com/stenzek/duckstation/releases/download/preview/DuckStation-x64.AppImage
# Please leave some newlines in the end of this file or it will break
latestcommit^UNIVERSALDYNAMICINPUTCOMMITPLACEHOLDER^https://github.com/Venomalia/UniversalDynamicInput^main
outside_file^VERSIONPLACEHOLDER^${GITHUB_WORKSPACE}/buildid
branch^THISBRANCH
THISREPO^THISREPO
#hash^RASHAPLACEHOLDER^https://buildbot.libretro.com/nightly/linux/x86_64/RetroArch.7z
hash^SAMEDUCKSHAPLACEHOLDER^https://buildbot.libretro.com/nightly/linux/x86_64/latest/sameduck_libretro.so.zip
hash^PPSSPPBIOSHASHPLACEHOLDER^https://github.com/hrydgard/ppsspp/archive/refs/heads/master.zip
hash^MSXBIOSHASHPLACEHOLDER^http://bluemsx.msxblue.com/rel_download/blueMSXv282full.zip
hash^XEMUHDDHASHPLACEHOLDER^https://github.com/mborgerson/xemu-hdd-image/releases/latest/download/xbox_hdd.qcow2.zip
hash^VITA3KSHAPLACEHOLDER^https://github.com/Vita3K/Vita3K/releases/download/continuous/ubuntu-latest.zip
hash^RANIGHTLYCORESPLACEHOLDER^https://buildbot.libretro.com/nightly/linux/x86_64/RetroArch_cores.7z
hash^RETRODECKMAMEPLACEHOLDER^"https://github.com/XargonWan/RetroDECK-MAME/releases/download/$(curl -s https://api.github.com/repos/XargonWan/RetroDECK-MAME/releases/latest | grep -oP '"tag_name": "\K(.*?)(?=")')/RetroDECK-MAME-Artifact.tar.gz"
url^RETRODECKMAMEURLPLACEHOLDER^"https://github.com/XargonWan/RetroDECK-MAME/releases/download/$(curl -s https://api.github.com/repos/XargonWan/RetroDECK-MAME/releases/latest | grep -oP '"tag_name": "\K(.*?)(?=")')/RetroDECK-MAME-Artifact.tar.gz"
latestcommit^UNIVERSALDYNAMICINPUTCOMMITPLACEHOLDER^https://github.com/Venomalia/UniversalDynamicInput^main
outside_file^VERSIONPLACEHOLDER^${GITHUB_WORKSPACE}/buildid
branch^THISBRANCH
hash^RETRODECKESDELATEST^https://github.com/RetroDECK/ES-DE/releases/latest/download/RetroDECK-ES-DE-Artifact.tar.gz
hash^RETRODECKPPSSPPLATEST^https://github.com/RetroDECK/org.ppsspp.PPSSPP/releases/latest/download/RetroDECK-PPSSPP-Artifact.tar.gz
hash^RETRODECKDOLPHINLATEST^https://github.com/RetroDECK/org.DolphinEmu.dolphin-emu/releases/latest/download/RetroDECK-dolphin-Artifact.tar.gz
hash^RETRODECKPRIMEHACKLATEST^https://github.com/RetroDECK/io.github.shiiion.primehack/releases/latest/download/RetroDECK-primehack-Artifact.tar.gz
hash^RETRODECKMELONDSLATEST^https://github.com/RetroDECK/net.kuribo64.melonDS/releases/latest/download/RetroDECK-melonds-Artifact.tar.gz
hash^RETRODECKSOLARUSLATEST^https://github.com/RetroDECK/org.solarus_games.solarus.Launcher/releases/latest/download/RetroDECK-solarus-Artifact.tar.gz
hash^RETRODECKGZDOOMLATEST^https://github.com/RetroDECK/org.zdoom.GZDoom/releases/latest/download/RetroDECK-gzdoom-Artifact.tar.gz
hash^RETRODECKMAMELATEST^https://github.com/RetroDECK/MAME/releases/latest/download/RetroDECK-MAME-Artifact.tar.gz
hash^PORTMASTERLATESTSHA^https://github.com/PortsMaster/PortMaster-GUI/releases/latest/download/retrodeck.portmaster.zip
hash^RACITRAPLACEHOLDER^https://buildbot.libretro.com/nightly/linux/x86_64/latest/citra_libretro.so.zip
hash^RETRODECKRPCS3LATEST^https://github.com/RetroDECK/net.rpcs3.RPCS3/releases/latest/download/RetroDECK-Artifact.tar.gz

File diff suppressed because it is too large Load diff

View file

@ -6,5 +6,5 @@ word2=$(shuf -n 1 ${GITHUB_WORKSPACE}/automation_tools/codename_wordlist.txt)
capitalized_word2="$(tr '[:lower:]' '[:upper:]' <<< ${word2:0:1})${word2:1}"
result=$capitalized_word1$capitalized_word2
echo $result > ${GITHUB_WORKSPACE}/buildid
echo "buildid=$result" >> $GITHUB_ENV
echo "BUILD_ID=$result" >> $GITHUB_ENV
echo "VersionID is $result"

View file

@ -3,9 +3,9 @@
# This is building the bundle RetroDECK.flatpak after the download and build steps are done
if [ "${GITHUB_REF##*/}" = "main" ]; then
flatpak build-bundle "${GITHUB_WORKSPACE}/.local" "$GITHUB_WORKSPACE/RetroDECK.flatpak" net.retrodeck.retrodeck
flatpak build-bundle "${GITHUB_WORKSPACE}/retrodeck-repo" "$GITHUB_WORKSPACE/RetroDECK.flatpak" net.retrodeck.retrodeck
sha256sum RetroDECK.flatpak > RetroDECK.flatpak.sha
else
flatpak build-bundle "${GITHUB_WORKSPACE}/.local" "$GITHUB_WORKSPACE/RetroDECK-cooker.flatpak" net.retrodeck.retrodeck
flatpak build-bundle "${GITHUB_WORKSPACE}/retrodeck-repo" "$GITHUB_WORKSPACE/RetroDECK-cooker.flatpak" net.retrodeck.retrodeck
sha256sum RetroDECK-cooker.flatpak > RetroDECK-cooker.flatpak.sha
fi

View file

@ -12,12 +12,12 @@ else
FOLDER=retrodeck-flatpak-cooker
fi
mkdir -vp "${GITHUB_WORKSPACE}"/{.local,retrodeck-flatpak-cooker}
mkdir -vp "${GITHUB_WORKSPACE}"/{retrodeck-repo,retrodeck-flatpak-cooker}
flatpak-builder --user --force-clean \
--install-deps-from=flathub \
--install-deps-from=flathub-beta \
--repo="${GITHUB_WORKSPACE}/.local" \
--repo="${GITHUB_WORKSPACE}/retrodeck-repo" \
--download-only \
"${GITHUB_WORKSPACE}/${FOLDER}" \
net.retrodeck.retrodeck.yml

View file

@ -12,13 +12,23 @@ else
FOLDER=retrodeck-flatpak-cooker
fi
mkdir -vp ${GITHUB_WORKSPACE}/.local
mkdir -vp ${GITHUB_WORKSPACE}/retrodeck-repo
mkdir -vp ${GITHUB_WORKSPACE}/"$FOLDER"
flatpak-builder --user --force-clean \
# Pass the args to Flatpak Builder
FLATPAK_BUILD_EXTRA_ARGS="${@}"
echo "Passing additional args to flatpak builder: $FLATPAK_BUILD_EXTRA_ARGS"
command="flatpak-builder --user --force-clean $FLATPAK_BUILD_EXTRA_ARGS \
--install-deps-from=flathub \
--install-deps-from=flathub-beta \
--repo=${GITHUB_WORKSPACE}/.local \
--repo=${GITHUB_WORKSPACE}/retrodeck-repo \
--disable-download \
"${GITHUB_WORKSPACE}/$FOLDER" \
net.retrodeck.retrodeck.yml
\"${GITHUB_WORKSPACE}/$FOLDER\" \
net.retrodeck.retrodeck.yml"
# Echo the command for verification
echo -e "Executing command:\n$command"
# Execute the command
eval $command

View file

@ -1,31 +0,0 @@
#!/bin/bash
# This script is installing the required dependencies to correctly run the pipeline and build the flatpak
unset pkg_mgr
# rpm-ostree must be checked before dnf because a dnf (wrapper) command also works on rpm-ostree distros (not what we want)
for potential_pkg_mgr in apt pacman rpm-ostree dnf; do
command -v "$potential_pkg_mgr" &> /dev/null && pkg_mgr="$potential_pkg_mgr" && break
done
case "$pkg_mgr" in
apt)
sudo apt install -y flatpak flatpak-builder p7zip-full xmlstarlet bzip2 curl jq
;;
pacman)
sudo pacman -S --noconfirm flatpak flatpak-builder p7zip xmlstarlet bzip2
;;
rpm-ostree)
echo "When using a distro with rpm-ostree, you shouldn't build directly on the host. Try using a distrobox."
exit 1
;;
dnf)
sudo dnf install -y flatpak flatpak-builder p7zip p7zip-plugins xmlstarlet bzip2 curl
;;
*)
echo "Package manager $pkg_mgr not supported. Please open an issue."
;;
esac
flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
flatpak remote-add --user --if-not-exists flathub-beta https://flathub.org/beta-repo/flathub-beta.flatpakrepo

View file

@ -42,8 +42,8 @@ appdata_version=$(fetch_appdata_version)
echo -e "Appdata:\t\t$appdata_version"
# Additional checks
if [[ "$manifest_version" == "main" || "$manifest_version" == "THISBRANCH" ]]; then
echo "Manifest version cannot be 'main' or 'THISBRANCH'. Please fix it."
if [[ "$manifest_version" == "main" || "$manifest_version" == "THISBRANCH" || "$manifest_version" == *"cooker"* ]]; then
echo "Manifest version cannot be 'main', 'THISBRANCH', or contain 'cooker'. Please fix it."
exit 1
fi

View file

@ -0,0 +1,93 @@
#!/bin/bash
# This script runs entirely inside the Flatpak sandbox for net.retrodeck.retrodeck
# Flatpak App ID
FLATPAK_APP_ID="net.retrodeck.retrodeck"
# Log file inside the Flatpak sandbox
LOG_FILE="$HOME/retrodeck-post-build-check.log"
# Clear previous log
> "$LOG_FILE"
# Ensure global.sh is sourced inside the Flatpak sandbox
GLOBAL_SH_PATH="/app/libexec/global.sh"
# Check if the global.sh script exists
if ! flatpak run --command=ls "$FLATPAK_APP_ID" "$GLOBAL_SH_PATH" &> /dev/null; then
echo "✗ global.sh not found at $GLOBAL_SH_PATH" | tee -a "$LOG_FILE"
exit 1
fi
# Source global.sh to load the `features` variable
echo "Sourcing $GLOBAL_SH_PATH to load features" | tee -a "$LOG_FILE"
features=$(flatpak run --command=bash "$FLATPAK_APP_ID" -c "source $GLOBAL_SH_PATH && echo \$features")
# Ensure `features` variable is set
if [ -z "$features" ]; then
echo "✗ Failed to load features from $GLOBAL_SH_PATH" | tee -a "$LOG_FILE"
exit 1
fi
# Extract launch commands using jq
echo "Extracting launch commands from $features" | tee -a "$LOG_FILE"
commands=($(flatpak run --command=jq "$FLATPAK_APP_ID" -r '.emulator | to_entries[] | .value.launch' "$features"))
echo "Extracted launch commands: ${commands[@]}" | tee -a "$LOG_FILE"
# Timeout duration in seconds
TIMEOUT=3
# Function to run command with timeout
run_and_check() {
local cmd="$1"
echo "Validating command: \"$cmd\"" | tee -a "$LOG_FILE"
# Verify command exists within the Flatpak sandbox
if ! flatpak run --command=which "$FLATPAK_APP_ID" "$cmd" &> /dev/null; then
echo "✗ Command not found: $cmd (Exit Code: 127)" | tee -a "$LOG_FILE"
return 127
fi
# Run command with timeout inside the sandbox
flatpak run --command=timeout "$FLATPAK_APP_ID" -s TERM $TIMEOUT "$cmd" &> /dev/null &
local pid=$!
sleep $TIMEOUT
# Ensure the process is terminated
if kill -0 $pid 2>/dev/null; then
#echo "✗ $cmd did not terminate, killing process" | tee -a "$LOG_FILE"
kill -9 $pid
fi
local exit_code=$?
# Log the results
echo "Command: $cmd, Exit Code: $exit_code" | tee -a "$LOG_FILE"
case $exit_code in
0)
echo "$cmd completed successfully" | tee -a "$LOG_FILE"
;;
124)
echo "$cmd terminated after $TIMEOUT seconds" | tee -a "$LOG_FILE"
;;
137)
echo "$cmd killed after timeout" | tee -a "$LOG_FILE"
;;
*)
echo "$cmd failed" | tee -a "$LOG_FILE"
;;
esac
return $exit_code
}
# Execute commands inside the Flatpak sandbox
for cmd in "${commands[@]}"; do
run_and_check "$cmd"
done
echo "$LOG_FILE"
grep "✗" "$LOG_FILE"

View file

@ -1,44 +1,68 @@
#!/bin/bash
# Set script to exit immediately on any error
set -e
# For the file paths to work correctly, call this script with this command from the cloned repo folder root:
# sh automation_tools/pre_build_automation.sh
# Different actions need different information in the task list file
# branch: This changes the placeholder text to the currently-detected GIT branch if an automated build was started from a PR environment.
# hash: Finds the SHA256 hash of a file online and updates the placeholder in the manifest.
# hash: Finds the SHA256 hash of a file online and updates the placeholder in the manifest.
# Needs the URL of the file, in this line format: hash^PLACEHOLDERTEXT^url
# latestcommit: Finds the most recent commit of a git repo and updated the placeholder in the manifest.
# latestcommit: Finds the most recent commit of a git repo and updates the placeholder in the manifest.
# Needs the URL of the repo and the branch to find the latest commit from, in this line format: latestcommit^PLACEHOLDERTEXT^url^branch
# latestghtag: Finds the most recent tag on a GitHub repo, for repos that don't have normal releases, but also shouldn't use the latest commit
# Needs the URL of the repo, in this line format: latestghtag^PLACEHOLDERTEXT^url
# latestghrelease: Finds the download URL and SHA256 hash of the latest release from a git repo.
# Needs the API URL of the repo, in this line format: latestappimage^PLACEHOLDERTEXT^https://api.github.com/repos/<owner-name>/<repo-name>/releases/latest^<file suffix>
# As this command updates two different placeholders (one for the URL, one for the file hash) in the manifest,
# Needs the API URL of the repo, in this line format: latestghrelease^PLACEHOLDERTEXT^https://api.github.com/repos/<owner-name>/<repo-name>/releases/latest^<file suffix>
# As this command updates two different placeholders (one for the URL, one for the file hash) in the manifest,
# the URL that would be used in the above example is "PLACEHOLDERTEXT" and the hash placeholder text would be "HASHPLACEHOLDERTEXT"
# The "HASH" prefix of the placeholder text is hardcoded in the script
# The "HASH" prefix of the hash placeholder text is hardcoded in the script.
# The <file_suffix> will be the file extension or other identifying suffix at the end of the file name that can be used to select from multiple releases.
# Example: If there are these file options for a given release:
# yuzu-mainline-20240205-149629642.AppImage
# yuzu-linux-20240205-149629642-source.tar.xz
# yuzu-linux-20240205-149629642-debug.tar.xz
# yuzu-linux-20240205-149629642-debug.tar.xz
# Entering "AppImage" (without quotes) for the <file_suffix> will identify yuzu-mainline-20240205-149629642.AppImage
# Entering "source-.tar.xz" (without quotes) for the <file_suffix> will identify yuzu-linux-20240205-149629642-source.tar.xz
# Entering "debug-tar.xz" (without quotes) for the <file_suffix> will identify yuzu-linux-20240205-149629642-debug.tar.xz
# As a file extension like ".tar.zx" can apply to multiple file options, the entire part that is appended to each release name should be included.
# As a file extension like ".tar.xz" can apply to multiple file options, the entire part that is appended to each release name should be included.
# The <file_suffix> will also only consider entries where the given suffix is at the end of the file name. So "AppImage" will identify "file.AppImage" but not "file.AppImage.zsync"
# latestghreleasesha: Finds the SHA256 hash of a specific asset in the latest release from a git repo.
# Needs the API URL of the repo, in this line format: latestghreleasesha^PLACEHOLDERTEXT^https://api.github.com/repos/<owner-name>/<repo-name>/releases/latest^<file suffix>
# This command updates the placeholder in the manifest with the SHA256 hash of the specified asset.
# outside_file: Prints the contents of a file from the build environment (such as the buildid file) and replaces the placeholder text with those contents.
# outside_env_var: Gets the value of an environmental variable from the build environment (the output of "echo $var" from the terminal) and replaces the placeholder text with that value.
# custom_command: Runs a single command explicitly as written in the $URL field of the task list, including variable and command expansion. This should work the same as if you were runnig the command directly from the terminal.
# custom_command: Runs a single command explicitly as written in the $URL field of the task list, including variable and command expansion. This should work the same as if you were running the command directly from the terminal.
# This command does not need a PLACEHOLDERTEXT field in the task list, so needs to be in this syntax: custom_command^^$COMMAND
# url: This is used to calculate a dynamic URL and the value to the $caluculated_url environmental variable, for use in other subsequent commands.
# url: This is used to calculate a dynamic URL and the value to the $calculated_url environmental variable, for use in other subsequent commands.
rd_manifest=${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml
automation_task_list=${GITHUB_WORKSPACE}/automation_tools/automation_task_list.cfg
current_branch=$(git rev-parse --abbrev-ref HEAD)
# Define paths
rd_manifest="${GITHUB_WORKSPACE}/net.retrodeck.retrodeck.yml"
automation_task_list="${GITHUB_WORKSPACE}/automation_tools/automation_task_list.cfg"
# During the PR automated tests instead of the branch name is returned "HEAD", fixing it
if [ $current_branch == "HEAD" ]; then
echo "Looks like we are on a PR environment, retrieving the branch name from which the PR is raised."
current_branch=$(echo $GITHUB_REF | sed 's@refs/heads/@@')
echo "The branch name from which the PR is raised is \"$current_branch\"."
fi
# Retrieve current git branch
get_current_branch() {
local branch=$(git rev-parse --abbrev-ref HEAD)
if [ "$branch" == "HEAD" ]; then
echo "$GITHUB_REF" | sed 's@refs/heads/@@'
else
echo "$branch"
fi
}
# Retrieve the repository URL
get_repo_url() {
local repo_url=$(git config --get remote.origin.url)
# Convert SSH URL to HTTPS if needed
if [[ "$repo_url" == git@* ]]; then
repo_url=$(echo "$repo_url" | sed -e 's|git@|https://|' -e 's|:|/|')
fi
echo "$repo_url"
}
current_branch=$(get_current_branch)
current_repo_url=$(get_repo_url)
echo "Manifest location: $rd_manifest"
echo "Automation task list location: $automation_task_list"
@ -47,93 +71,140 @@ echo "Task list contents:"
cat "$automation_task_list"
echo
# Update all collected information
while IFS="^" read -r action placeholder url branch
do
if [[ ! $action == "#"* ]] && [[ ! -z "$action" ]]; then
case "$action" in
# Functions to handle different actions
handle_branch() {
local placeholder="$1"
echo "Replacing placeholder $placeholder with branch $current_branch"
/bin/sed -i 's^'"$placeholder"'^'"$current_branch"'^g' "$rd_manifest"
}
"branch" )
echo
echo "Placeholder text: $placeholder"
echo "Current branch:" "$current_branch"
echo
/bin/sed -i 's^'"$placeholder"'^'"$current_branch"'^g' $rd_manifest
;;
handle_hash() {
local placeholder="$1"
local url="$2"
local calculated_url=$(eval echo "$url")
local hash=$(curl -sL "$calculated_url" | sha256sum | cut -d ' ' -f1)
echo "Replacing placeholder $placeholder with hash $hash"
/bin/sed -i 's^'"$placeholder"'^'"$hash"'^g' "$rd_manifest"
}
"hash" )
echo
echo "Placeholder text: $placeholder"
calculated_url=$(eval echo "$url") # in case the url has to be calculated from an expression
echo "URL to hash: $calculated_url"
echo
hash=$(curl -sL "$calculated_url" | sha256sum | cut -d ' ' -f1)
echo "Hash found: $hash"
/bin/sed -i 's^'"$placeholder"'^'"$hash"'^' $rd_manifest
;;
handle_latestcommit() {
local placeholder="$1"
local url="$2"
local branch="$3"
local commit=$(git ls-remote "$url" "$branch" | cut -f1)
echo "Replacing placeholder $placeholder with latest commit $commit"
/bin/sed -i 's^'"$placeholder"'^'"$commit"'^g' "$rd_manifest"
}
"latestcommit" )
echo
echo "Placeholder text: $placeholder"
echo "Repo to get latest commit from: $url branch: $branch"
echo
commit=$(git ls-remote "$url" "$branch" | cut -f1)
echo "Commit found: $commit"
/bin/sed -i 's^'"$placeholder"'^'"$commit"'^' $rd_manifest
;;
handle_latestghtag() {
local placeholder="$1"
local url="$2"
local tag=$(git ls-remote --tags "$url" | tail -n 1 | cut -f2 | sed 's|refs/tags/||')
echo "Replacing placeholder $placeholder with latest tag $tag"
/bin/sed -i 's^'"$placeholder"'^'"$tag"'^g' "$rd_manifest"
}
"latestghrelease" )
echo
echo "Placeholder text: $placeholder"
echo "Repo to look for AppImage releases: $url"
echo
ghreleaseurl=$(curl -s "$url" | grep browser_download_url | grep "$branch\""$ | cut -d : -f 2,3 | tr -d \" | sed -n 1p | tr -d ' ')
echo "GitHub release URL found: $ghreleaseurl"
/bin/sed -i 's^'"$placeholder"'^'"$ghreleaseurl"'^' $rd_manifest
ghreleasehash=$(curl -sL "$ghreleaseurl" | sha256sum | cut -d ' ' -f1)
echo "GitHub release hash found: $ghreleasehash"
/bin/sed -i 's^'"HASHFOR$placeholder"'^'"$ghreleasehash"'^' $rd_manifest
;;
"outside_file" )
if [[ "$url" = \$* ]]; then # If value is a reference to a variable name
eval url="$url"
fi
echo
echo "Placeholder text: $placeholder"
echo "Information being injected: $(cat $url)"
echo
/bin/sed -i 's^'"$placeholder"'^'"$(cat $url)"'^' $rd_manifest
;;
"outside_env_var" )
if [[ "$url" = \$* ]]; then # If value is a reference to a variable name
eval url="$url"
fi
echo
echo "Placeholder text: $placeholder"
echo "Information being injected: $(echo $url)"
echo
/bin/sed -i 's^'"$placeholder"'^'"$(echo $url)"'^' $rd_manifest
;;
"custom_command" )
echo
echo "Command to run: $url"
echo
eval "$url"
;;
"url" )
# this is used to calculate a dynamic url
echo
echo "Placeholder text: $placeholder"
calculated_url=$(eval echo "$url")
echo "Information being injected: $calculated_url"
echo
/bin/sed -i 's^'"$placeholder"'^'"$calculated_url"'^' $rd_manifest
;;
esac
handle_latestghrelease() {
local placeholder="$1"
local url="$2"
local suffix="$3"
echo "Fetching release data from: $url"
local release_data=$(curl -s "$url")
echo "Release data fetched."
local ghreleaseurl=$(echo "$release_data" | jq -r ".assets[] | select(.name | endswith(\"$suffix\")).browser_download_url")
if [[ -z "$ghreleaseurl" ]]; then
echo "Error: No asset found with suffix $suffix"
exit 1
fi
done < "$automation_task_list"
local ghreleasehash=$(curl -sL "$ghreleaseurl" | sha256sum | cut -d ' ' -f1)
echo "Replacing placeholder $placeholder with URL $ghreleaseurl and hash $ghreleasehash"
/bin/sed -i 's^'"$placeholder"'^'"$ghreleaseurl"'^g' "$rd_manifest"
/bin/sed -i 's^'"HASHFOR$placeholder"'^'"$ghreleasehash"'^g' "$rd_manifest"
}
handle_latestghreleasesha() {
local placeholder="$1"
local url="$2"
local suffix="$3"
echo "Fetching release data from: $url"
local release_data=$(curl -s "$url")
echo "Release data fetched."
local ghreleaseurl=$(echo "$release_data" | jq -r ".assets[] | select(.name | endswith(\"$suffix\")).browser_download_url")
if [[ -z "$ghreleaseurl" ]]; then
echo "Error: No asset found with suffix $suffix"
exit 1
fi
local ghreleasehash=$(curl -sL "$ghreleaseurl" | sha256sum | cut -d ' ' -f1)
echo "Replacing placeholder $placeholder with hash $ghreleasehash"
/bin/sed -i 's^'"$placeholder"'^'"$ghreleasehash"'^g' "$rd_manifest"
}
handle_outside_file() {
local placeholder="$1"
local file_path="$2"
if [[ "$file_path" == \$* ]]; then
eval file_path="$file_path"
fi
local content=$(cat "$file_path")
echo "Replacing placeholder $placeholder with content of file $file_path"
/bin/sed -i 's^'"$placeholder"'^'"$content"'^g' "$rd_manifest"
}
handle_outside_env_var() {
local placeholder="$1"
local var_name="$2"
if [[ "$var_name" == \$* ]]; then
eval var_name="$var_name"
fi
local value=$(echo "$var_name")
echo "Replacing placeholder $placeholder with environment variable $value"
/bin/sed -i 's^'"$placeholder"'^'"$value"'^g' "$rd_manifest"
}
handle_custom_command() {
local command="$1"
echo "Executing custom command: $command"
eval "$command"
}
handle_url() {
local placeholder="$1"
local url="$2"
local calculated_url=$(eval echo "$url")
echo "Replacing placeholder $placeholder with calculated URL $calculated_url"
/bin/sed -i 's^'"$placeholder"'^'"$calculated_url"'^g' "$rd_manifest"
}
# Handle the THISREPO placeholder
handle_thisrepo() {
local placeholder="$1"
echo "Replacing placeholder $placeholder with repository URL $current_repo_url"
/bin/sed -i 's^'"$placeholder"'^'"$current_repo_url"'^g' "$rd_manifest"
}
# Process the task list
if [ "$use_cached" != "y" ]; then
while IFS="^" read -r action placeholder url branch || [[ -n "$action" ]]; do
if [[ ! "$action" == "#"* ]] && [[ -n "$action" ]]; then
case "$action" in
"branch" ) handle_branch "$placeholder" ;;
"hash" ) handle_hash "$placeholder" "$url" ;;
"latestcommit" ) handle_latestcommit "$placeholder" "$url" "$branch" ;;
"latestghtag" ) handle_latestghtag "$placeholder" "$url" ;;
"latestghrelease" ) handle_latestghrelease "$placeholder" "$url" "$branch" ;;
"latestghreleasesha" ) handle_latestghreleasesha "$placeholder" "$url" "$branch" ;;
"outside_file" ) handle_outside_file "$placeholder" "$url" ;;
"outside_env_var" ) handle_outside_env_var "$placeholder" "$url" ;;
"custom_command" ) handle_custom_command "$url" ;;
"url" ) handle_url "$placeholder" "$url" ;;
"THISREPO" ) handle_thisrepo "$placeholder" ;;
esac
fi
done < "$automation_task_list"
fi

View file

@ -0,0 +1,14 @@
#!/bin/bash
# Search for missing libraries
missing_libs=$(flatpak run --command=sh net.retrodeck.retrodeck -c \
"find /app/bin -type f -exec ldd {} + 2>/dev/null | grep 'not found' | awk '{print \$2}' | tr -d ':' | xargs -n 1 basename | sort | uniq | tr '\n' ' '")
# If there is any missing library, it will be printed, and the step will fail
if [ -n "$missing_libs" ]; then
echo "The following libraries are missing:"
echo "$missing_libs"
exit 1
else
echo "TEST OK: No missing libraries are found"
fi

View file

@ -0,0 +1,86 @@
#!/bin/bash
# Path to the configuration file
CONFIG_FILE="config/retrodeck/reference_lists/features.json"
# Check if file exists
if [ ! -f "$CONFIG_FILE" ]; then
echo "Error: $CONFIG_FILE not found"
exit 1
fi
# Get today's date in the format YYYY-MM-DD
TODAYS_DATE=$(date +%Y-%m-%d)
# Update dates using jq
jq '
def is_leap_year($year): ($year % 4 == 0 and $year % 100 != 0) or ($year % 400 == 0);
def increment_date($date):
if $date | length == 4 then
($date[0:2] | tonumber) as $month |
($date[2:4] | tonumber) as $day |
if $month == 12 and $day == 31 then
"0101"
elif $month == 2 and $day == 28 and is_leap_year(2024) then
"0229"
elif $month == 2 and ($day == 28 or $day == 29) then
"0301"
elif $day == 30 and ($month == 4 or $month == 6 or $month == 9 or $month == 11) then
(if ($month + 1) < 10 then "0" else "" end + (($month + 1) | tostring)) + "01"
elif $day == 31 then
(if ($month + 1) < 10 then "0" else "" end + (($month + 1) | tostring)) + "01"
else
(if $month < 10 then "0" else "" end + ($month | tostring)) +
(if ($day + 1) < 10 then "0" else "" end + (($day + 1) | tostring))
end
elif $date | length == 10 then
($date[0:4] | tonumber) as $year |
($date[5:7] | tonumber) as $month |
($date[8:10] | tonumber) as $day |
if $month == 12 and $day == 31 then
(($year + 1) | tostring) + "-01-01"
elif $month == 2 and $day == 28 and is_leap_year($year + 1) then
(($year + 1) | tostring) + "-02-29"
elif $month == 2 and ($day == 28 or $day == 29) then
(($year + 1) | tostring) + "-03-01"
elif $day == 30 and ($month == 4 or $month == 6 or $month == 9 or $month == 11) then
(($year + 1) | tostring) + "-" +
(if ($month + 1) < 10 then "0" else "" end + (($month + 1) | tostring)) + "-01"
elif $day == 31 then
(($year + 1) | tostring) + "-" +
(if ($month + 1) < 10 then "0" else "" end + (($month + 1) | tostring)) + "-01"
else
(($year + 1) | tostring) + "-" +
(if $month < 10 then "0" else "" end + ($month | tostring)) + "-" +
(if ($day + 1) < 10 then "0" else "" end + (($day + 1) | tostring))
end
else .
end;
.splash_screens |= with_entries(
.value |= (
if has("start_date") then
if .start_date < "'$TODAYS_DATE'" then
.start_date = increment_date(.start_date)
else . end
else . end |
if has("end_date") then
if .end_date < "'$TODAYS_DATE'" then
.end_date = increment_date(.end_date)
else . end
else . end |
if has("full_start_date") then
if .full_start_date < "'$TODAYS_DATE'" then
.full_start_date = increment_date(.full_start_date)
else . end
else . end |
if has("full_end_date") then
if .full_end_date < "'$TODAYS_DATE'" then
.full_end_date = increment_date(.full_end_date)
else . end
else . end
)
)' "$CONFIG_FILE" > "${CONFIG_FILE}.tmp" && mv "${CONFIG_FILE}.tmp" "$CONFIG_FILE"
echo "All applicable dates rolled forward by one day."

View file

@ -12,7 +12,7 @@ manifest_content=$(cat "$manifest")
fetch_repo_version(){
# Getting latest RetroDECK release info
LATEST_RELEASE=$(curl -s "https://api.github.com/repos/XargonWan/RetroDECK/releases/latest")
LATEST_RELEASE=$(curl -s "https://api.github.com/repos/RetroDECK/RetroDECK/releases/latest")
# Extracting tag name from the latest release
repo_version=$(echo "$LATEST_RELEASE" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')
# Printing results
@ -32,3 +32,5 @@ fetch_manifest_version(){
manifest_version=$(echo "$manifest_version" | awk '{$1=$1;print}')
echo "$manifest_version"
}
echo "Version extractor functions loaded"

View file

@ -25,7 +25,7 @@
</controller>
<controller>
<api>SDLController</api>
<uuid>0_03000000de280000ff11000001000000</uuid>
<uuid>0_030079f6de280000ff11000001000000</uuid>
<display_name>Steam Virtual Gamepad</display_name>
<rumble>0</rumble>
<axis>
@ -41,6 +41,54 @@
<range>1</range>
</trigger>
<mappings>
<entry>
<mapping>25</mapping>
<button>8</button>
</entry>
<entry>
<mapping>1</mapping>
<button>1</button>
</entry>
<entry>
<mapping>2</mapping>
<button>0</button>
</entry>
<entry>
<mapping>3</mapping>
<button>3</button>
</entry>
<entry>
<mapping>4</mapping>
<button>2</button>
</entry>
<entry>
<mapping>5</mapping>
<button>9</button>
</entry>
<entry>
<mapping>6</mapping>
<button>10</button>
</entry>
<entry>
<mapping>7</mapping>
<button>42</button>
</entry>
<entry>
<mapping>8</mapping>
<button>43</button>
</entry>
<entry>
<mapping>9</mapping>
<button>6</button>
</entry>
<entry>
<mapping>10</mapping>
<button>4</button>
</entry>
<entry>
<mapping>11</mapping>
<button>11</button>
</entry>
<entry>
<mapping>24</mapping>
<button>40</button>
@ -93,50 +141,6 @@
<mapping>12</mapping>
<button>12</button>
</entry>
<entry>
<mapping>11</mapping>
<button>11</button>
</entry>
<entry>
<mapping>10</mapping>
<button>4</button>
</entry>
<entry>
<mapping>9</mapping>
<button>6</button>
</entry>
<entry>
<mapping>8</mapping>
<button>43</button>
</entry>
<entry>
<mapping>7</mapping>
<button>42</button>
</entry>
<entry>
<mapping>6</mapping>
<button>10</button>
</entry>
<entry>
<mapping>5</mapping>
<button>9</button>
</entry>
<entry>
<mapping>4</mapping>
<button>3</button>
</entry>
<entry>
<mapping>3</mapping>
<button>2</button>
</entry>
<entry>
<mapping>2</mapping>
<button>1</button>
</entry>
<entry>
<mapping>1</mapping>
<button>0</button>
</entry>
</mappings>
</controller>
</emulated_controller>

View file

@ -4,7 +4,7 @@
<profile>SteamInput-P1</profile>
<controller>
<api>SDLController</api>
<uuid>0_03000000de280000ff11000001000000</uuid>
<uuid>0_030079f6de280000ff11000001000000</uuid>
<display_name>Steam Virtual Gamepad</display_name>
<rumble>0</rumble>
<axis>
@ -20,6 +20,10 @@
<range>1</range>
</trigger>
<mappings>
<entry>
<mapping>25</mapping>
<button>8</button>
</entry>
<entry>
<mapping>24</mapping>
<button>40</button>
@ -65,56 +69,56 @@
<button>14</button>
</entry>
<entry>
<mapping>1</mapping>
<button>0</button>
</entry>
<entry>
<mapping>2</mapping>
<button>1</button>
</entry>
<entry>
<mapping>3</mapping>
<button>2</button>
</entry>
<entry>
<mapping>4</mapping>
<button>3</button>
</entry>
<entry>
<mapping>5</mapping>
<button>9</button>
</entry>
<entry>
<mapping>6</mapping>
<button>10</button>
</entry>
<entry>
<mapping>7</mapping>
<button>42</button>
</entry>
<entry>
<mapping>8</mapping>
<button>43</button>
</entry>
<entry>
<mapping>9</mapping>
<button>6</button>
</entry>
<entry>
<mapping>10</mapping>
<button>4</button>
</entry>
<entry>
<mapping>11</mapping>
<button>11</button>
<mapping>13</mapping>
<button>13</button>
</entry>
<entry>
<mapping>12</mapping>
<button>12</button>
</entry>
<entry>
<mapping>13</mapping>
<button>13</button>
<mapping>11</mapping>
<button>11</button>
</entry>
<entry>
<mapping>10</mapping>
<button>4</button>
</entry>
<entry>
<mapping>9</mapping>
<button>6</button>
</entry>
<entry>
<mapping>8</mapping>
<button>43</button>
</entry>
<entry>
<mapping>7</mapping>
<button>42</button>
</entry>
<entry>
<mapping>6</mapping>
<button>10</button>
</entry>
<entry>
<mapping>5</mapping>
<button>9</button>
</entry>
<entry>
<mapping>4</mapping>
<button>2</button>
</entry>
<entry>
<mapping>3</mapping>
<button>3</button>
</entry>
<entry>
<mapping>2</mapping>
<button>0</button>
</entry>
<entry>
<mapping>1</mapping>
<button>1</button>
</entry>
</mappings>
</controller>

View file

@ -4,7 +4,7 @@
<profile>SteamInput-P1</profile>
<controller>
<api>SDLController</api>
<uuid>0_03000000de280000ff11000001000000</uuid>
<uuid>0_030079f6de280000ff11000001000000</uuid>
<display_name>Steam Virtual Gamepad</display_name>
<rumble>0</rumble>
<axis>
@ -20,6 +20,58 @@
<range>1</range>
</trigger>
<mappings>
<entry>
<mapping>1</mapping>
<button>1</button>
</entry>
<entry>
<mapping>2</mapping>
<button>0</button>
</entry>
<entry>
<mapping>3</mapping>
<button>3</button>
</entry>
<entry>
<mapping>4</mapping>
<button>2</button>
</entry>
<entry>
<mapping>5</mapping>
<button>9</button>
</entry>
<entry>
<mapping>6</mapping>
<button>10</button>
</entry>
<entry>
<mapping>7</mapping>
<button>42</button>
</entry>
<entry>
<mapping>8</mapping>
<button>43</button>
</entry>
<entry>
<mapping>9</mapping>
<button>6</button>
</entry>
<entry>
<mapping>10</mapping>
<button>4</button>
</entry>
<entry>
<mapping>11</mapping>
<button>11</button>
</entry>
<entry>
<mapping>12</mapping>
<button>12</button>
</entry>
<entry>
<mapping>25</mapping>
<button>8</button>
</entry>
<entry>
<mapping>24</mapping>
<button>40</button>
@ -64,54 +116,6 @@
<mapping>14</mapping>
<button>14</button>
</entry>
<entry>
<mapping>1</mapping>
<button>0</button>
</entry>
<entry>
<mapping>2</mapping>
<button>1</button>
</entry>
<entry>
<mapping>3</mapping>
<button>2</button>
</entry>
<entry>
<mapping>4</mapping>
<button>3</button>
</entry>
<entry>
<mapping>5</mapping>
<button>9</button>
</entry>
<entry>
<mapping>6</mapping>
<button>10</button>
</entry>
<entry>
<mapping>7</mapping>
<button>42</button>
</entry>
<entry>
<mapping>8</mapping>
<button>43</button>
</entry>
<entry>
<mapping>9</mapping>
<button>6</button>
</entry>
<entry>
<mapping>10</mapping>
<button>4</button>
</entry>
<entry>
<mapping>11</mapping>
<button>11</button>
</entry>
<entry>
<mapping>12</mapping>
<button>12</button>
</entry>
<entry>
<mapping>13</mapping>
<button>13</button>

View file

@ -1,7 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<emulated_controller>
<type>Wii U Pro Controller</type>
<profile>SteamInput-P2</profile>
<controller>
<api>SDLController</api>
<uuid>1_03000000de280000ff11000001000000</uuid>
@ -19,65 +18,65 @@
<range>1</range>
</trigger>
<mappings>
<entry>
<mapping>12</mapping>
<button>11</button>
</entry>
<entry>
<mapping>13</mapping>
<button>12</button>
</entry>
<entry>
<mapping>14</mapping>
<button>13</button>
</entry>
<entry>
<mapping>15</mapping>
<button>14</button>
</entry>
<entry>
<mapping>16</mapping>
<button>7</button>
</entry>
<entry>
<mapping>17</mapping>
<button>8</button>
</entry>
<entry>
<mapping>18</mapping>
<button>45</button>
</entry>
<entry>
<mapping>19</mapping>
<button>39</button>
</entry>
<entry>
<mapping>20</mapping>
<button>44</button>
</entry>
<entry>
<mapping>21</mapping>
<button>38</button>
</entry>
<entry>
<mapping>22</mapping>
<button>47</button>
</entry>
<entry>
<mapping>23</mapping>
<button>41</button>
</entry>
<entry>
<mapping>1</mapping>
<button>0</button>
<mapping>22</mapping>
<button>47</button>
</entry>
<entry>
<mapping>21</mapping>
<button>38</button>
</entry>
<entry>
<mapping>20</mapping>
<button>44</button>
</entry>
<entry>
<mapping>19</mapping>
<button>39</button>
</entry>
<entry>
<mapping>18</mapping>
<button>45</button>
</entry>
<entry>
<mapping>17</mapping>
<button>8</button>
</entry>
<entry>
<mapping>16</mapping>
<button>7</button>
</entry>
<entry>
<mapping>15</mapping>
<button>14</button>
</entry>
<entry>
<mapping>24</mapping>
<button>46</button>
</entry>
<entry>
<mapping>2</mapping>
<button>1</button>
<button>0</button>
</entry>
<entry>
<mapping>3</mapping>
<button>2</button>
<button>3</button>
</entry>
<entry>
<mapping>4</mapping>
<button>3</button>
<button>2</button>
</entry>
<entry>
<mapping>5</mapping>
@ -103,17 +102,17 @@
<mapping>10</mapping>
<button>4</button>
</entry>
<entry>
<mapping>12</mapping>
<button>11</button>
</entry>
<entry>
<mapping>25</mapping>
<button>40</button>
</entry>
<entry>
<mapping>24</mapping>
<button>46</button>
<mapping>14</mapping>
<button>13</button>
</entry>
<entry>
<mapping>1</mapping>
<button>1</button>
</entry>
</mappings>
</controller>

View file

@ -20,25 +20,29 @@
</trigger>
<mappings>
<entry>
<mapping>24</mapping>
<button>46</button>
<mapping>13</mapping>
<button>12</button>
</entry>
<entry>
<mapping>25</mapping>
<button>40</button>
</entry>
<entry>
<mapping>12</mapping>
<button>11</button>
<mapping>23</mapping>
<button>41</button>
</entry>
<entry>
<mapping>10</mapping>
<button>4</button>
</entry>
<entry>
<mapping>22</mapping>
<button>47</button>
</entry>
<entry>
<mapping>9</mapping>
<button>6</button>
</entry>
<entry>
<mapping>21</mapping>
<button>38</button>
</entry>
<entry>
<mapping>8</mapping>
<button>43</button>
@ -60,21 +64,21 @@
<button>3</button>
</entry>
<entry>
<mapping>3</mapping>
<button>2</button>
<mapping>25</mapping>
<button>40</button>
</entry>
<entry>
<mapping>13</mapping>
<button>12</button>
</entry>
<entry>
<mapping>14</mapping>
<button>13</button>
<mapping>12</mapping>
<button>11</button>
</entry>
<entry>
<mapping>1</mapping>
<button>0</button>
</entry>
<entry>
<mapping>14</mapping>
<button>13</button>
</entry>
<entry>
<mapping>15</mapping>
<button>14</button>
@ -87,6 +91,10 @@
<mapping>16</mapping>
<button>7</button>
</entry>
<entry>
<mapping>3</mapping>
<button>2</button>
</entry>
<entry>
<mapping>17</mapping>
<button>8</button>
@ -104,16 +112,8 @@
<button>44</button>
</entry>
<entry>
<mapping>21</mapping>
<button>38</button>
</entry>
<entry>
<mapping>22</mapping>
<button>47</button>
</entry>
<entry>
<mapping>23</mapping>
<button>41</button>
<mapping>24</mapping>
<button>46</button>
</entry>
</mappings>
</controller>

View file

@ -20,25 +20,29 @@
</trigger>
<mappings>
<entry>
<mapping>24</mapping>
<button>46</button>
<mapping>13</mapping>
<button>12</button>
</entry>
<entry>
<mapping>25</mapping>
<button>40</button>
</entry>
<entry>
<mapping>12</mapping>
<button>11</button>
<mapping>23</mapping>
<button>41</button>
</entry>
<entry>
<mapping>10</mapping>
<button>4</button>
</entry>
<entry>
<mapping>22</mapping>
<button>47</button>
</entry>
<entry>
<mapping>9</mapping>
<button>6</button>
</entry>
<entry>
<mapping>21</mapping>
<button>38</button>
</entry>
<entry>
<mapping>8</mapping>
<button>43</button>
@ -60,21 +64,21 @@
<button>3</button>
</entry>
<entry>
<mapping>3</mapping>
<button>2</button>
<mapping>25</mapping>
<button>40</button>
</entry>
<entry>
<mapping>13</mapping>
<button>12</button>
</entry>
<entry>
<mapping>14</mapping>
<button>13</button>
<mapping>12</mapping>
<button>11</button>
</entry>
<entry>
<mapping>1</mapping>
<button>0</button>
</entry>
<entry>
<mapping>14</mapping>
<button>13</button>
</entry>
<entry>
<mapping>15</mapping>
<button>14</button>
@ -87,6 +91,10 @@
<mapping>16</mapping>
<button>7</button>
</entry>
<entry>
<mapping>3</mapping>
<button>2</button>
</entry>
<entry>
<mapping>17</mapping>
<button>8</button>
@ -104,16 +112,8 @@
<button>44</button>
</entry>
<entry>
<mapping>21</mapping>
<button>38</button>
</entry>
<entry>
<mapping>22</mapping>
<button>47</button>
</entry>
<entry>
<mapping>23</mapping>
<button>41</button>
<mapping>24</mapping>
<button>46</button>
</entry>
</mappings>
</controller>

View file

@ -94,9 +94,9 @@
<TVVolume>100</TVVolume>
<PadVolume>100</PadVolume>
<InputVolume>100</InputVolume>
<TVDevice>alsa_output.pci-0000_04_00.5-platform-acp5x_mach.0.HiFi__hw_acp5x_1__sink</TVDevice>
<PadDevice>alsa_output.pci-0000_04_00.5-platform-acp5x_mach.0.HiFi__hw_acp5x_1__sink</PadDevice>
<InputDevice>filter-chain-source</InputDevice>
<TVDevice>default</TVDevice>
<PadDevice>default</PadDevice>
<InputDevice>default</InputDevice>
</Audio>
<Account>
<PersistentId>2147483649</PersistentId>

View file

@ -42,12 +42,17 @@ Threads = True
[General]
ISOPath0 = RETRODECKHOMEDIR/roms/wii
ISOPath1 = RETRODECKHOMEDIR/roms/gc
ISOPaths = 3
ISOPaths = 2
WiiSDCardPath = RETRODECKHOMEDIR/saves/wii/dolphin/sd.raw
WirelessMac = 00:17:ab:83:9b:d4
HotkeysRequireFocus = True
RecursiveISOPaths = True
ISOPath2 = RETRODECKHOMEDIR/roms/wii
DumpPath = /var/data/dolphin-emu/Dump/
LoadPath = /var/data/dolphin-emu/Load/
NANDRootPath = /var/data/dolphin-emu/Wii/
ResourcePackPath = /var/data/dolphin-emu/ResourcePacks/
WFSPath =
WiiSDCardSyncFolder = /var/data/dolphin-emu/Load/WiiSDSync/
[NetPlay]
TraversalChoice = direct
[BluetoothPassthrough]

View file

@ -7,7 +7,7 @@ SyncToHostRefreshRate = false
IncreaseTimerResolution = true
InhibitScreensaver = true
StartPaused = false
StartFullscreen = false
StartFullscreen = true
PauseOnFocusLoss = true
PauseOnMenu = true
SaveStateOnExit = false
@ -42,7 +42,7 @@ FastmemMode = true
[GPU]
Renderer = Vulkan
Renderer = OpenGL
Adapter = AMD RADV VANGOGH
ResolutionScale = 3
Multisamples = 1

View file

@ -118,7 +118,7 @@
<string name="ApplicationUpdaterFrequency" value="never" />
<string name="ApplicationUpdaterLastCheck" value="20230331T153206" />
<string name="CollectionCustomGrouping" value="unthemed" />
<string name="CollectionSystemsAuto" value="recent" />
<string name="CollectionSystemsAuto" value="favorites,recent" />
<string name="CollectionSystemsCustom" value="" />
<string name="DefaultSortOrder" value="name, ascending" />
<string name="GamelistViewStyle" value="automatic" />
@ -153,13 +153,12 @@
<string name="ScreensaverType" value="video" />
<string name="StartupSystem" value="" />
<string name="SystemsSorting" value="manufacturer_hwtype_year" />
<string name="Theme" value="art-book-next-es-de" />
<string name="Theme" value="retrodeck" />
<string name="ThemeAspectRatio" value="automatic" />
<string name="ThemeColorScheme" value="art-book-next" />
<string name="ThemeFontSize" value="" />
<string name="ThemeSet" value="art-book-next-es-de" />
<string name="ThemeColorScheme" value="retrodeck" />
<string name="ThemeFontSize" value="medium" />
<string name="ThemeTransitions" value="automatic" />
<string name="ThemeVariant" value="system-multi-gamelist-list-immersive" />
<string name="ThemeVariant" value="carousel" />
<string name="UIMode" value="full" />
<string name="UIMode_passkey" value="uuddlrlrba" />
<string name="UserThemeDirectory" value="" />

View file

@ -68,7 +68,7 @@ else
# Check if the .doom file exists
if [[ ! -e "$doom_file" ]]; then
log e "doom file not found in \"$doom_file\""
zenity --error --no-wrap \
rd_zenity --error --no-wrap \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK" \
--text="File \"$doom_file\" not found. Quitting."
@ -85,7 +85,7 @@ else
# If the file is not found, exit with an error
if [[ -z "$found_file" ]]; then
log "[ERROR] File not found in \"$line\""
zenity --error --no-wrap \
rd_zenity --error --no-wrap \
--window-icon="/app/share/icons/hicolor/scalable/apps/net.retrodeck.retrodeck.svg" \
--title "RetroDECK" \
--text="File \"$doom_file\" not found. Quitting."

View file

@ -0,0 +1,9 @@
{
"change_channel": false,
"first-run": true,
"release_channel": "stable",
"show_experimental": false,
"theme": "default_theme",
"theme-scheme": "Dracula",
"version": 2
}

Some files were not shown because too many files have changed in this diff Show more