RetroDECK Development: Terminal Shortcuts for bashrc
Quick terminal shortcuts, tools and functions for RetroDECK development.
Add the following lines to the end of ~/.bashrc on any Linux system, save the file, then reload your shell: source ~/.bashrc
# ========================================================
# RetroDECK
# ========================================================
# ========================================================
# RetroDECK - Installer: rdinstall
#
# Supports main GitHub latest, Flathub stable and choosing
# from the latest 40 Cooker or Main GitHub releases.
# ========================================================
_rdi_get_assets() {
local repo="$1"
local tag="$2"
local api_url
if [ "$tag" = "latest" ]; then
api_url="https://api.github.com/repos/RetroDECK/${repo}/releases/latest"
else
api_url="https://api.github.com/repos/RetroDECK/${repo}/releases/tags/${tag}"
fi
curl -sL "$api_url" | python3 -c 'import sys,json; [print(a["browser_download_url"]) for a in json.load(sys.stdin).get("assets",[])]' 2>/dev/null
}
_rdi_fetch_tags() {
local repo="$1"
if ! command -v python3 >/dev/null 2>&1; then
return 1
fi
local api_url="https://api.github.com/repos/RetroDECK/${repo}/releases?per_page=40"
curl -sL "$api_url" | python3 -c '
import sys, json
releases = json.load(sys.stdin)[:40]
# Sort by published_at (date) descending, then tag_name ascending
releases.sort(key=lambda r: (r["published_at"], r["tag_name"]), reverse=True)
[print(r["tag_name"] + "|" + r["published_at"][:10]) for r in releases]
' 2>/dev/null
}
_rdi_github_install() {
local repo="$1"
local tag="$2"
local tmpdir
tmpdir=$(mktemp -d)
cd "$tmpdir" || return 1
echo "Fetching release assets from GitHub..."
local assets
assets=$(_rdi_get_assets "$repo" "$tag")
if [ -z "$assets" ]; then
echo "Error: could not fetch assets. Tag may not exist or API rate limit hit."
cd - >/dev/null
rm -rf "$tmpdir"
return 1
fi
local flatpak_url
flatpak_url=$(echo "$assets" | grep '\.flatpak$' | grep -v '\.7z' | head -n1)
if [ -n "$flatpak_url" ]; then
echo "Downloading flatpak..."
if ! wget -q --show-progress "$flatpak_url" -O "retrodeck.flatpak"; then
echo "Error: download failed."
cd - >/dev/null
rm -rf "$tmpdir"
return 1
fi
echo "Installing flatpak..."
flatpak install "retrodeck.flatpak" --user --bundle --noninteractive -y
echo "Cleaning up..."
cd - >/dev/null
rm -rf "$tmpdir"
echo "Installation complete."
return 0
fi
local part1_url part2_url
part1_url=$(echo "$assets" | grep '\.7z\.001$' | head -n1)
part2_url=$(echo "$assets" | grep '\.7z\.002$' | head -n1)
if [ -n "$part1_url" ] && [ -n "$part2_url" ]; then
echo "Downloading 7z bundle..."
if ! wget -q --show-progress "$part1_url" -O "bundle.7z.001"; then
echo "Error: failed to download part 1."
cd - >/dev/null
rm -rf "$tmpdir"
return 1
fi
if ! wget -q --show-progress "$part2_url" -O "bundle.7z.002"; then
echo "Error: failed to download part 2."
cd - >/dev/null
rm -rf "$tmpdir"
return 1
fi
echo "Extracting 7z bundle..."
if ! 7z x "bundle.7z.001"; then
echo "Error: extraction failed."
cd - >/dev/null
rm -rf "$tmpdir"
return 1
fi
local extracted
extracted=$(ls -1 *.flatpak 2>/dev/null | head -n1)
if [ -z "$extracted" ]; then
echo "Error: no flatpak found inside archive."
cd - >/dev/null
rm -rf "$tmpdir"
return 1
fi
echo "Installing extracted flatpak..."
flatpak install "$extracted" --user --bundle --noninteractive -y
echo "Cleaning up..."
cd - >/dev/null
rm -rf "$tmpdir"
echo "Installation complete."
return 0
fi
echo "Error: no flatpak or 7z bundle assets found for this release."
cd - >/dev/null
rm -rf "$tmpdir"
return 1
}
rdinstall() {
if flatpak info net.retrodeck.retrodeck >/dev/null 2>&1; then
echo ""
echo "RetroDECK is already installed."
read -rp "Run rdremove now? [y/n]: " remove_choice
echo ""
case "$remove_choice" in
y|Y|yes|YES)
rdremove
return
;;
esac
fi
echo ""
echo "RetroDECK Installer"
echo "-------------------"
echo "1) Flathub stable"
echo "2) Main latest release"
echo "3) Main release (latest 40)"
echo "4) Cooker release (latest 40)"
echo "q) Quit"
echo ""
read -rp "Choice [1-4/q]: " choice
echo ""
local -a tags_array=()
local tag date
local i
case "$choice" in
1)
echo "Installing from Flathub..."
flatpak install flathub net.retrodeck.retrodeck --user -y
echo "Done."
;;
2)
_rdi_github_install "RetroDECK" "latest"
;;
3)
echo "Fetching latest 40 Main releases..."
echo ""
i=1
while IFS='|' read -r tag date; do
[ -z "$tag" ] && continue
printf "%2d) %-50s | %s\n" "$i" "$tag" "$date"
tags_array[i]="$tag"
((i++))
done < <(_rdi_fetch_tags "RetroDECK")
if [ ${#tags_array[@]} -eq 0 ]; then
echo "Error: could not fetch tags. Check network or API rate limit."
return
fi
echo ""
read -rp "Pick a release [1-${#tags_array[@]}]: " tag_choice
tag_choice="${tag_choice%%$'\r'}"
tag_choice="${tag_choice// /}"
echo ""
if [[ "$tag_choice" =~ ^[0-9]+$ ]] && [[ "$tag_choice" -ge 1 ]] && [[ "$tag_choice" -le ${#tags_array[@]} ]]; then
_rdi_github_install "RetroDECK" "${tags_array[$tag_choice]}"
else
echo "Invalid choice."
fi
;;
4)
echo "Fetching latest 40 Cooker releases..."
echo ""
i=1
while IFS='|' read -r tag date; do
[ -z "$tag" ] && continue
printf "%2d) %-50s | %s\n" "$i" "$tag" "$date"
tags_array[i]="$tag"
((i++))
done < <(_rdi_fetch_tags "Cooker")
if [ ${#tags_array[@]} -eq 0 ]; then
echo "Error: could not fetch tags. Check network or API rate limit."
return
fi
echo ""
read -rp "Pick a release [1-${#tags_array[@]}]: " tag_choice
tag_choice="${tag_choice%%$'\r'}"
tag_choice="${tag_choice// /}"
echo ""
if [[ "$tag_choice" =~ ^[0-9]+$ ]] && [[ "$tag_choice" -ge 1 ]] && [[ "$tag_choice" -le ${#tags_array[@]} ]]; then
_rdi_github_install "Cooker" "${tags_array[$tag_choice]}"
else
echo "Invalid choice."
fi
;;
q|Q)
echo "Cancelled."
;;
*)
echo "Invalid choice."
;;
esac
echo ""
}
# ========================================================
# RetroDECK - Flatpak Management Tool: rdflatpak
#
# Provides a menu to view RetroDECK package info.
# Update/repair RetroDECK or all Flatpaks or
# reset user-level overrides for RetroDECK.
# ========================================================
rdflatpak() {
echo ""
echo "RetroDECK Flatpak Tools"
echo "-----------------------"
echo "1) Show RetroDECK package info"
echo "2) Update RetroDECK only"
echo "3) Repair RetroDECK only"
echo "4) Reset RetroDECK user overrides (fixes bwrap/execvp errors)"
echo "5) Update ALL Flatpaks (system + user)"
echo "6) Repair ALL Flatpaks (system + user)"
echo "q) Quit"
echo ""
read -rp "Choice [1-6/q]: " choice
echo ""
case "$choice" in
1)
echo "Fetching package info..."
flatpak info -e net.retrodeck.retrodeck
echo "Done."
;;
2)
echo "Updating RetroDECK..."
flatpak update net.retrodeck.retrodeck -y
echo "Done."
;;
3)
echo "Repairing RetroDECK..."
flatpak repair net.retrodeck.retrodeck
flatpak repair --user net.retrodeck.retrodeck
echo "Done."
;;
4)
echo "Resetting RetroDECK user overrides..."
flatpak override --user net.retrodeck.retrodeck --reset
echo "Done."
;;
5)
echo "Updating system Flatpaks..."
flatpak update
echo "Updating user Flatpaks..."
flatpak update --user
echo "Done."
;;
6)
echo "Repairing system Flatpaks..."
flatpak repair
echo "Repairing user Flatpaks..."
flatpak repair --user
echo "Done."
;;
q|Q)
echo "Cancelled."
;;
*)
echo "Invalid choice."
;;
esac
echo ""
}
# ========================================================
# RetroDECK Remove Tool: rdremove
#
# Provides a menu to remove user data, the Flatpak package, reset permissions,
# or remove everything (package + data + permissions).
# ========================================================
rdremove() {
echo ""
echo " RetroDECK Cleanup"
echo " ================="
echo " 1) Remove User Data Directory (~/.var/app/net.retrodeck.retrodeck/)"
echo " 2) Remove Flatpak Installation"
echo " 3) Reset Flatpak Permissions Default"
echo " 4) Remove and reset EVERYTHING"
echo " q) Quit"
echo ""
read -rp " Choice [1-4/q]: " choice
echo ""
case "$choice" in
1) echo " Removing user data..."; rm -rf ~/.var/app/net.retrodeck.retrodeck/; echo "Done" ;;
2) echo " Removing Flatpak..."; flatpak remove net.retrodeck.retrodeck -y; echo "Done" ;;
3) echo " Resetting permissions..."; flatpak permission-reset net.retrodeck.retrodeck; echo "Done" ;;
4) echo " Removing Flatpak..."; flatpak remove net.retrodeck.retrodeck -y; echo " Removing user data..."; rm -rf ~/.var/app/net.retrodeck.retrodeck/; echo " Resetting permissions..."; flatpak permission-reset net.retrodeck.retrodeck; echo "Done" ;;
q|Q) echo "Cancelled." ;;
*) echo "Invalid choice." ;;
esac
echo ""
}
# ========================================================
# RetroDECK - Git Clone Shortcuts Tool: rdgit
#
# Interactive RetroDECK git clone tool.
# Clones RetroDECK, components, ES-DE fork, wiki, or website repos.
# ========================================================
_rdgit_fetch_branches() {
local repo="$1"
if ! command -v python3 >/dev/null 2>&1; then
return 1
fi
curl -sL "https://api.github.com/repos/RetroDECK/${repo}/branches?per_page=30" | python3 -c 'import sys,json; [print(b["name"]) for b in json.load(sys.stdin)]' 2>/dev/null
}
rdgit() {
echo ""
echo "RetroDECK Git Clone Tool"
echo "------------------------"
echo "1) RetroDECK main"
echo "2) RetroDECK (choose branch)"
echo "3) Components main"
echo "4) Components (choose branch)"
echo "5) ES-DE fork"
echo "6) Wiki"
echo "7) Website main"
echo "8) Website dev"
echo "q) Quit"
echo ""
read -rp "Choice [1-8/q]: " choice
echo ""
local -a branches=()
local branch
local i
case "$choice" in
1)
echo "Cloning RetroDECK main..."
git clone -b main https://github.com/RetroDECK/RetroDECK
echo "Done."
;;
2)
echo "Fetching branches..."
i=1
while IFS= read -r branch; do
[ -z "$branch" ] && continue
echo "$i) $branch"
branches[i]="$branch"
((i++))
done < <(_rdgit_fetch_branches "RetroDECK")
if [ ${#branches[@]} -eq 0 ]; then
echo "Error: could not fetch branches."
return
fi
echo ""
read -rp "Pick a branch [1-${#branches[@]}]: " branch_choice
echo ""
if [[ "$branch_choice" =~ ^[0-9]+$ ]] && [ "$branch_choice" -ge 1 ] && [ "$branch_choice" -le ${#branches[@]} ]; then
echo "Cloning RetroDECK ${branches[$branch_choice]}..."
git clone -b "${branches[$branch_choice]}" https://github.com/RetroDECK/RetroDECK
echo "Done."
else
echo "Invalid choice."
fi
;;
3)
echo "Cloning Components main..."
git clone -b main https://github.com/RetroDECK/components
echo "Done."
;;
4)
echo "Fetching branches..."
i=1
while IFS= read -r branch; do
[ -z "$branch" ] && continue
echo "$i) $branch"
branches[i]="$branch"
((i++))
done < <(_rdgit_fetch_branches "components")
if [ ${#branches[@]} -eq 0 ]; then
echo "Error: could not fetch branches."
return
fi
echo ""
read -rp "Pick a branch [1-${#branches[@]}]: " branch_choice
echo ""
if [[ "$branch_choice" =~ ^[0-9]+$ ]] && [ "$branch_choice" -ge 1 ] && [ "$branch_choice" -le ${#branches[@]} ]; then
echo "Cloning Components ${branches[$branch_choice]}..."
git clone -b "${branches[$branch_choice]}" https://github.com/RetroDECK/components
echo "Done."
else
echo "Invalid choice."
fi
;;
5)
echo "Cloning ES-DE fork..."
git clone -b retrodeck-main https://github.com/RetroDECK/ES-DE
echo "Done."
;;
6)
echo "Cloning Wiki..."
git clone https://github.com/RetroDECK/Wiki
echo "Done."
;;
7)
echo "Cloning Website main..."
git clone -b main https://github.com/RetroDECK/RetroDECK-Website
echo "Done."
;;
8)
echo "Cloning Website dev..."
git clone -b dev https://github.com/RetroDECK/RetroDECK-Website
echo "Done."
;;
q|Q)
echo "Cancelled."
;;
*)
echo "Invalid choice."
;;
esac
echo ""
}
# --------------------------------------------------------
# RetroDECK - Launch Shortcuts
# --------------------------------------------------------
# Usage: rdlaunch-retrodeck
# Launches RetroDECK.
alias rdlaunch-retrodeck='flatpak run net.retrodeck.retrodeck'
# Usage: rdlaunch-configurator
# Launches RetroDECK Configurator.
alias rdlaunch-configurator='flatpak run net.retrodeck.retrodeck --configurator'
# --------------------------------------------------------
# RetroDECK - Upgrade Simulated
# --------------------------------------------------------
# Usage: rdtest-upgrade
# Simulates an upgrade Between RetroDECK Versions argument with <version>: rdtest-upgrade 0.9.4b.
alias rdtest-upgrade='flatpak run net.retrodeck.retrodeck --test-upgrade'
# --------------------------------------------------------
# RetroDECK - Debug Shortcuts
# --------------------------------------------------------
# rddebug-retrodeck
# Launch RetroDECK in debug mode.
alias rddebug-retrodeck='flatpak run net.retrodeck.retrodeck --debug'
# rddebug-configurator
# Launch RetroDECK Configurator in debug mode.
alias rddebug-configurator='flatpak run net.retrodeck.retrodeck --debug --configurator'
# rddebug-cli
# Launch RetroDECK in debug mode and open an interactive Bash shell inside the Flatpak sandbox.
alias rddebug-cli='flatpak run --command=bash net.retrodeck.retrodeck -debug'
# rddebug-devel
# Launch RetroDECK in debug mode with --devel and open an interactive shell inside the sandbox.
alias rddebug-devel='flatpak run --devel --command=sh net.retrodeck.retrodeck -debug'
# rddebug-strace
# Launch RetroDECK in debug mode with --devel, opening an interactive shell inside the sandbox, while tracing system calls using strace.
alias rddebug-strace='strace -o flatpak run --devel --command=sh net.retrodeck.retrodeck -debug'
# ========================================================
# END RETRODECK
# ========================================================