RetroPie-Setup/scriptmodules/supplementary/usbromservice/01_retropie_copyroms
2024-09-10 20:23:00 +01:00

94 lines
2.6 KiB
Bash

#!/bin/bash
# This file is part of The RetroPie Project
#
# The RetroPie Project is the legal property of its developers, whose names are
# too numerous to list here. Please refer to the COPYRIGHT.md file distributed with this source.
#
# See the LICENSE.md file at the top-level directory of this distribution and
# at https://raw.githubusercontent.com/RetroPie/RetroPie-Setup/master/LICENSE.md
#
## config / defaults
user="USER"
group="GROUP"
home="$(eval echo ~$user)"
rootdir="/opt/retropie"
retropie_path="$home/RetroPie"
usb_path="$UM_MOUNTPOINT/retropie"
usb_path_from_rp="$usb_path/configs/from_retropie"
usb_path_to_rp="$usb_path/configs/to_retropie"
declare -A path_mapping
# mapping from usb_path_to_rp/* to retropie location
path_mapping["configs"]="$rootdir/configs"
## internals
hook_name=${0##*/}
## functions
function log() {
logger -p user.$1 -t usbmount-"$hook_name"-[$$] -- "$2"
}
function log_cmd() {
local ret
local error
error="$("$@" 2>&1 >/dev/null)"
ret=$?
[[ "$ret" -ne 0 ]] && log err "$* - returned $ret - $error"
}
## some sanity checking
if [[ -z "$UM_MOUNTPOINT" ]]; then
log err "UM_MOUNTPOINT not set!"
exit 0
fi
if [[ ! -d "$UM_MOUNTPOINT" ]]; then
log err "UM_MOUNTPOINT is not a directory"
exit 0
fi
# make sure we have something to sync from
if [[ ! -d "$usb_path" ]]; then
exit 0
fi
# make folders for syncing
mkdir -p "$usb_path/"{roms,BIOS} "$usb_path_from_rp" "$usb_path_to_rp"
# mirror romdir structure to external drive
log info "Attempting to create directory structure for ROMS in '$usb_path/roms' ..."
# fetch list of romdirs from current installation and mirror onto external drive
find "$retropie_path/roms" -mindepth 1 -maxdepth 1 -type d -printf "$usb_path/roms/%f\n" | xargs mkdir -p 2>/dev/null || true
# copy ROMs/BIOS from USB stick to local SD card
for dir in roms BIOS; do
log info "Syncing $dir ..."
log_cmd rsync -rtu --exclude '._*' --max-delete=-1 "$usb_path/$dir" "$retropie_path/"
chown -R "$user":"$group" "$retropie_path/$dir"
done
log info "Syncing configs ..."
# copy configs to usb
for to in "${!path_mapping[@]}"; do
from=${path_mapping[$to]}
log_cmd rsync -rtu --exclude '._*' --max-delete=-1 "$from/" "$usb_path_from_rp/$to/"
done
# copy configs from usb
for from in $(find "$usb_path_to_rp/" -mindepth 1 -maxdepth 1); do
# basename
from_bn=${from##*/}
to=${path_mapping[$from_bn]}
if [[ -n "$to" ]]; then
log_cmd rsync -rtu --exclude '._*' --max-delete=-1 "$from/" "$to/"
chown -R "$user":"$group" "$to"
fi
done
# unmount USB stick
umount "$UM_MOUNTPOINT"