diff --git a/.github/workflows/appimage.yml b/.github/workflows/appimage.yml new file mode 100644 index 0000000000..62ce4925fe --- /dev/null +++ b/.github/workflows/appimage.yml @@ -0,0 +1,100 @@ +name: AppImage release workflow + +on: + workflow_dispatch: + inputs: + tag: + description: 'Release tag (e.g. 10.5.1)' + required: true + type: string + push: + tags: + - '[0-9]*' + +jobs: + build: + name: "Build AppImage (${{ matrix.arch }})" + runs-on: ${{ matrix.runs-on }} + strategy: + fail-fast: false + matrix: + include: + - arch: x86_64 + runs-on: ubuntu-latest + image: ghcr.io/pkgforge-dev/archlinux:x86_64 + platform: linux/amd64 + qemu: false + - arch: aarch64 + runs-on: ubuntu-24.04-arm + image: ghcr.io/pkgforge-dev/archlinux:aarch64 + platform: linux/arm64 + qemu: false + # The remaining arches are built inside their Arch Linux container + # images, emulated with QEMU on an x86_64 runner (the build tools - + # appimagetool, sharun, mkdwarfs - must run on the target arch). + # + # DISABLED for now: AM's database does not ship installation + # scripts for these architectures yet (see the `programs/` + # directory). Uncomment the entries below to enable them again + # once app repos for those architectures are introduced. + # - arch: riscv64 + # runs-on: ubuntu-latest + # image: ghcr.io/pkgforge-dev/archlinux:riscv64 + # platform: linux/riscv64 + # qemu: true + # - arch: loongarch64 + # runs-on: ubuntu-latest + # image: ghcr.io/pkgforge-dev/archlinux:loongarch64 + # platform: linux/loong64 + # qemu: true + # - arch: ppc64le + # runs-on: ubuntu-latest + # image: ghcr.io/pkgforge-dev/archlinux:ppc64le + # platform: linux/ppc64le + # qemu: true + # NOTE: big-endian `powerpc64` is not supported - tonistiigi/binfmt + # does not register a qemu-ppc64 handler, so it cannot be emulated. + # QEMU builds are skipped on pull requests to keep PR CI fast. + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - name: Register QEMU binfmt + if: ${{ matrix.qemu && github.event_name != 'pull_request' }} + uses: docker/setup-qemu-action@1f40c72289eff860ee54a304f1438e3cff362e0a # v4.3.0 + - name: Build AppImage + if: ${{ !matrix.qemu || github.event_name != 'pull_request' }} + run: | + docker run --rm \ + --platform ${{ matrix.platform }} \ + -v "$PWD:/build" -w /build \ + -e GITHUB_REPOSITORY="${{ github.repository }}" \ + ${{ matrix.image }} \ + /bin/sh -c "sh appimage/get-dependencies.sh && sh appimage/make-appimage.sh ${{ matrix.arch }} ${{ github.event.inputs.tag }}" + - name: Upload artifact + if: ${{ !matrix.qemu || github.event_name != 'pull_request' }} + uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0 + with: + name: AppImage-${{ matrix.arch }} + path: dist + + release: + # Triggered by a manually published GitHub release (ivan-hc pushes a new + # version, writing the release notes himself): build from that tag and + # attach the AppImages to that very release. + needs: [build] + permissions: write-all + runs-on: ubuntu-latest + steps: + - uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0 + with: + pattern: AppImage-* + merge-multiple: true + - name: Attach AppImages to the release + uses: softprops/action-gh-release@5be0e66d93ac7ed76da52eca8bb058f665c3a5fe # v2.4.2 + with: + tag_name: ${{ github.event.inputs.tag }} + name: "\"AM\" ${{ github.event.inputs.tag }}" + body: Latest development build with continuous improvements. See [recent commits](https://github.com/${{ github.repository }}/commits/main) for details. + files: | + *.AppImage + *.AppImage.zsync + diff --git a/AM-INSTALLER b/AM-INSTALLER index 5a81a6eab5..12f56b87cb 100755 --- a/AM-INSTALLER +++ b/AM-INSTALLER @@ -72,7 +72,6 @@ _install_am() { SCRIPT="$CACHEDIR/INSTALL-AM.sh" mkdir -p "$CACHEDIR" || true rm -f "$CACHEDIR"/INSTALL-AM.sh || true - _script_downloader && chmod a+x "$CACHEDIR"/INSTALL-AM.sh #cp ./INSTALL "$CACHEDIR"/INSTALL-AM.sh && chmod a+x "$CACHEDIR"/INSTALL-AM.sh # for developers if command -v sudo >/dev/null 2>&1; then SUDOCMD="sudo" @@ -82,7 +81,13 @@ _install_am() { echo "ERROR: No sudo or doas found" exit 1 fi - $SUDOCMD "$CACHEDIR"/INSTALL-AM.sh && rm -f "$CACHEDIR"/INSTALL-AM.sh + if [ -n "$APPIMAGE" ]; then + \cp -f "$APPDIR"/bin/INSTALL-AM-APPIMAGE.sh "$CACHEDIR"/ + $SUDOCMD "$CACHEDIR"/INSTALL-AM-APPIMAGE.sh "$APPIMAGE" && rm -f "$CACHEDIR"/INSTALL-AM-APPIMAGE.sh + else + _script_downloader && chmod a+x "$CACHEDIR"/INSTALL-AM.sh + $SUDOCMD "$CACHEDIR"/INSTALL-AM.sh && rm -f "$CACHEDIR"/INSTALL-AM.sh + fi } # INSTALL "AM" LOCALLY, AS "APPMAN" @@ -109,13 +114,17 @@ _install_appman() { SCRIPT="$BINDIR/appman" echo '--------------------------------------------------------------------------' printf " %bInstalling \"AppMan\" in %b\033[0m\n" "${Green}" "$BINDIR" - _script_downloader && chmod a+x "$BINDIR"/appman - echo '--------------------------------------------------------------------------' - printf " %bThe following modules will be installed gradually, as you use AppMan\033[0m\n" "${Green}" - MODULES=$(sort "$SCRIPT" | tr '"' '\n' | grep "[a-z]\.am$") - for module_name in $MODULES; do - echo " ◆ https://raw.githubusercontent.com/ivan-hc/AM/$AM_BRANCH/modules/$module_name" - done + if [ -n "$APPIMAGE" ]; then + \mv -f "$APPIMAGE" "$SCRIPT" + else + _script_downloader && chmod a+x "$SCRIPT" + echo '--------------------------------------------------------------------------' + printf " %bThe following modules will be installed gradually, as you use AppMan\033[0m\n" "${Green}" + MODULES=$(sort "$SCRIPT" | tr '"' '\n' | grep "[a-z]\.am$") + for module_name in $MODULES; do + echo " ◆ https://raw.githubusercontent.com/ivan-hc/AM/$AM_BRANCH/modules/$module_name" + done + fi echo '--------------------------------------------------------------------------' printf " %b\"AppMan\" has been successfully installed! \033[0m\n\n" "${Green}" printf " To use 'appman' in your current terminal, please run\n" "${LightBlue}" diff --git a/APP-MANAGER b/APP-MANAGER index 5e5c9127be..2ad12f39ac 100755 --- a/APP-MANAGER +++ b/APP-MANAGER @@ -5,11 +5,20 @@ AMVERSION="10.5" # Determine main repository and branch AMREPO="https://raw.githubusercontent.com/ivan-hc/AM/main" +# Determine if AM is an AppImage +IS_APPIMAGE=$([[ -n "$APPIMAGE" && -f "$APPIMAGE" ]] && [[ -n "$APPDIR" && -d "$APPDIR" && -f "$APPDIR/AppRun" ]] && echo 1) || unset IS_APPIMAGE + # Determine the name of this script and its working directory export REALDIR="$PWD" -DIR="$(cd "${0%/*}" && echo "$PWD")" -CLI="${0##*/}" -CLI_PATH="$(readlink -f "$0")" +if [ -n "$IS_APPIMAGE" ]; then + DIR="$(cd "${APPIMAGE%/*}" && echo "$PWD")" + CLI=$([ "${APPIMAGE##*/}" == "APP-MANAGER" ] && echo "am" || echo "appman") + CLI_PATH="$(readlink -f "$APPIMAGE")" +else + DIR="$(cd "${0%/*}" && echo "$PWD")" + CLI="${0##*/}" + CLI_PATH="$(readlink -f "$0")" +fi # Determine system architecture and current user ARCH="$(uname -m)" @@ -435,7 +444,9 @@ _appman() { printf $"%b ⚠️ WARNING\033[0m: \"%b%b\033[0m\" is not in PATH, local apps may not run.\n" "${RED}" "${LightBlue}" "$BINDIR" fi MODULES_PATH="$AMPATH/modules" - if [ "$CLI" = am ] && [ -f "$APPMANCONFIG"/appman-mode ] && [ -d /usr/lib/am/modules ]; then + if [ -n "$IS_APPIMAGE" ]; then + MODULES_PATH="$APPDIR"/share/modules + elif [ "$CLI" = am ] && [ -f "$APPMANCONFIG"/appman-mode ] && [ -d /usr/lib/am/modules ]; then MODULES_PATH="/usr/lib/am/modules" elif [ "$CLI" = am ] && [ -f "$APPMANCONFIG"/appman-mode ] && [ -d "$(readlink -f /opt)/am/modules" ]; then MODULES_PATH="$(readlink -f /opt)/am/modules" @@ -459,7 +470,13 @@ _am() { APPSPATH="$(readlink -f /opt)" AMPATH="$APPSPATH/$AMCLI" _create_cache_dir - MODULES_PATH="$AMPATH/modules" + if [ -n "$IS_APPIMAGE" ]; then + # If AppImage, use built in modules and export PATH for bundled binaries in $APPDIR/bin + MODULES_PATH="$APPDIR"/share/modules + SUDOCMD="$SUDOCMD PATH=$APPDIR/bin/:$PATH" + else + MODULES_PATH="$AMPATH/modules" + fi } # DETERMINE WHEN TO USE "AM" OR "APPMAN" @@ -571,7 +588,9 @@ AMDATADIR="$DATADIR/AM" mkdir -p "$AMDATADIR" _betatester_message_on() { - if [ -f "$AMDATADIR"/betatester ]; then + if [ -n "$IS_APPIMAGE" ]; then + rm -f "$AMDATADIR"/betatester + elif [ -f "$AMDATADIR"/betatester ]; then echo "$DIVIDING_LINE"; echo $"\"$AMCLIUPPER\" $AMVERSION: DEVELOPER MODE"; echo "$DIVIDING_LINE" fi } @@ -892,7 +911,11 @@ _am_newrepo_check() { AMBRANCH=$(basename "$AMREPO") export APPSDB="$AMREPO/programs/$ARCH" export APPSLISTDB="$AMREPO/programs/$ARCH-apps" - export MODULES_PATH="$AMPATH/modules" + if [ -n "$IS_APPIMAGE" ]; then + export MODULES_PATH="$APPDIR/share/modules" + else + export MODULES_PATH="$AMPATH/modules" + fi if [ "$1" != "newrepo" ] && [ "$1" != "neodb" ]; then echo "$DIVIDING_LINE"; echo $" Source: $AMREPO"; echo "$DIVIDING_LINE" fi @@ -1834,6 +1857,7 @@ _sync_locale() { } _sync_modules() { + [ -n "$IS_APPIMAGE" ] && return 0; # Skip module update for AppImages printf $"%b\n Check for updates in modules...\n" "$DIVIDING_LINE" MODULES=$(echo "$AMCLI_ONLINE_CONTENT" | tr '"' '\n' | grep "[a-z]\.am$") for module_name in $MODULES; do @@ -1862,9 +1886,27 @@ _sync_amcli() { echo -ne $"\n ◆ SYNCHRONIZING \"$AMCLIUPPER\" VERSION \"$CURRENT_AM_VERSION\"...\r" && sleep 0.25 _clean_amcachedir 1>/dev/null cd "$AMCACHEDIR" || return 1 - echo "$AMCLI_ONLINE_CONTENT" > ./APP-MANAGER && chmod a+x ./APP-MANAGER - echo y | mv ./APP-MANAGER "$CLI_PATH" NEW_AM_VERSION=$(echo "$AMCLI_ONLINE_CONTENT" | grep "^AMVERSION=" | tr '"' '\n' | grep "^[0-9]") + if [ -z "$IS_APPIMAGE" ]; then + echo "$AMCLI_ONLINE_CONTENT" > ./APP-MANAGER && chmod a+x ./APP-MANAGER + echo y | mv ./APP-MANAGER "$CLI_PATH" + else + checksum_sha1=$(sha1sum "$CLI_PATH" | awk '{print $1}') + download_url="https://github.com/ivan-hc/AM/releases/download/$NEW_AM_VERSION/APP-MANAGER-$ARCH.AppImage" + digest=$(curl -Lsf "$download_url.zsync" | grep -a "SHA\|MD5" | tr -d '\0') + results=$(echo "$digest" | grep -a "$checksum_sha1") + if [ -z "$results" ]; then + _use_online_downloader "$download_url" APP-MANAGER && chmod a+x ./APP-MANAGER + checksum_sha1=$(sha1sum APP-MANAGER | awk '{print $1}') + results_new=$(echo "$digest" | grep -a "$checksum_sha1") + if [ -z "$results_new" ]; then + printf $" ◆ Update failed, please try again later.\n\n" && return 0 + else + \mv -f "$CLI_PATH" APP-MANAGER.old + \mv -f APP-MANAGER "$CLI_PATH" + fi + fi + fi if [ ! "$CURRENT_AM_VERSION" = "$NEW_AM_VERSION" ]; then echo -ne $" A new release of \"$AMCLIUPPER\" is available, please wait...\r" echo $" ◆ \"$AMCLIUPPER\" IS NOW UPDATED TO THE BRAND NEW \"$NEW_AM_VERSION\" VERSION!" @@ -1887,7 +1929,7 @@ _use_sync() { AMCLI_ONLINE_CONTENT=$(_use_online_reading_tool "$AMREPO"/APP-MANAGER) if echo "$AMCLI_ONLINE_CONTENT" | grep -q AMCLI; then if [ "$CLI" = am ]; then - if [ -f "$APPMANCONFIG"/appman-mode ]; then + if [ -f "$APPMANCONFIG"/appman-mode ] && [ -z "$IS_APPIMAGE" ]; then if [ -d "$(readlink -f /opt)/am/modules" ]; then MODULES_PATH="$(readlink -f /opt)/am/modules" if [ -w "$(readlink -f /opt)/am" ]; then @@ -2389,6 +2431,8 @@ case "$1" in 'devmode-disable'|'devmode-enable'|'--devmode-disable'|'--devmode-enable') if [ "$CLI_PATH" = "/usr/bin/am" ]; then echo $"This feature is disabled by your organization" | _fit + elif [ -n "$IS_APPIMAGE" ]; then + echo $"This feature is not available for AM in AppImage mode" | _fit else if [ "$1" = "--devmode-disable" ]; then rm -f "$AMDATADIR"/betatester diff --git a/INSTALL b/INSTALL index 67c6032d52..ab0aa18acf 100755 --- a/INSTALL +++ b/INSTALL @@ -11,6 +11,9 @@ RED='\033[0;31m'; LightBlue='\033[1;34m'; Green='\033[0;32m' # For developers [ -z "$AM_BRANCH" ] && AM_BRANCH="main" +# Determine if it is AppImage installation flow, get $APPIMAGE from parent script via $1 +[ "${0##*/}" = "INSTALL-AM-APPIMAGE.sh" ] && APPIMAGE=$1 || unset APPIMAGE + # Function to check online connections (uses github.com by default, as the database and CLI itself are stored/hosted there) _online_check_tool() { if command -v wget >/dev/null 2>&1; then @@ -61,7 +64,7 @@ fi # INSTALL "AM" _prepare_am_directory() { # CREATE AND ENTER THE MAIN DIRECTORY FOR "AM" - mkdir -p /opt/am/modules /usr/local/bin && cd /opt/am || exit 1 + mkdir -p /opt/am /usr/local/bin && cd /opt/am || exit 1 # CREATE THE SCRIPT NEEDED TO UNINSTALL "AM" printf '#!/bin/sh\n\nset -e\n' > /opt/am/remove @@ -70,10 +73,12 @@ _prepare_am_directory() { printf '%s\n' 'rm -R -f /opt/am' >> /opt/am/remove chmod a+x /opt/am/remove || exit 1 - # DOWNLOAD THE MAIN SCRIPT + # DOWNLOAD THE MAIN SCRIPT OR MOVE APPIMAGE INTO /OPT/AM URL="https://raw.githubusercontent.com/ivan-hc/AM/$AM_BRANCH/APP-MANAGER" SCRIPT="APP-MANAGER" - if ! _script_downloader; then + if [ -n "$APPIMAGE" ]; then + \mv -f "$APPIMAGE" "$SCRIPT" + elif ! _script_downloader; then echo "💀 ERROR: Cannot download am" exit 1 fi @@ -90,7 +95,7 @@ _prepare_am_directory() { _download_am_modules() { # DOWNLOAD MODULES - cd /opt/am/modules || exit + mkdir -p /opt/am/modules && cd /opt/am/modules || exit if [ -z "$MODULES" ]; then echo "💀 ERROR: Cannot download am modules" exit 1 @@ -104,17 +109,19 @@ _download_am_modules() { fi done cd .. - - # ENABLE NON-ROOT PERMISSIONS TO THE MAIN DIRECTORY FOR THE CURRENT USER - chown -R "${SUDO_USER:-$DOAS_USER}" /opt/am } echo '--------------------------------------------------------------------------' printf " %bInstalling \"AM\" in /opt/am\033[0m\n" "${Green}" _prepare_am_directory -echo '--------------------------------------------------------------------------' -printf " %bInstalling modules\033[0m\n" "${Green}" -_download_am_modules +# ONLY DOWNLOAD MODULES FOR NON-APPIMAGE INSTALL +if [ -z "$APPIMAGE" ]; then + echo '--------------------------------------------------------------------------' + printf " %bInstalling modules\033[0m\n" "${Green}" + _download_am_modules +fi +# ENABLE NON-ROOT PERMISSIONS TO THE MAIN DIRECTORY FOR THE CURRENT USER +chown -R "${SUDO_USER:-$DOAS_USER}" /opt/am echo '--------------------------------------------------------------------------' printf " %b\"AM\" has been successfully installed! \033[0m\n\n" "${Green}" printf " Please, run \"%bam -h\033[0m\" to see the list of the options.\n" "${LightBlue}" diff --git a/appimage/APP-MANAGER.desktop b/appimage/APP-MANAGER.desktop new file mode 100644 index 0000000000..d2f85e53a1 --- /dev/null +++ b/appimage/APP-MANAGER.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Name=APP-MANAGER +Comment=AppImage Package Manager: Manage AppImages like never before! +Exec=APP-MANAGER +Icon=APP-MANAGER +Type=Application +Categories=System;Settings; +Terminal=false +StartupNotify=false +Keywords=package;manager;appman;am;terminal; +#StartupWMClass=APP-MANAGER + diff --git a/appimage/AppRun b/appimage/AppRun new file mode 100755 index 0000000000..b85fcc6afd --- /dev/null +++ b/appimage/AppRun @@ -0,0 +1,23 @@ +#!/bin/sh + +if [ -z "$1" ] && [ ! -t 1 ]; then + if command -v am >/dev/null 2>&1 && [ -e /opt/am/APP-MANAGER ]; then + AM_EXEC_CMD="am -h" + elif command -v appman >/dev/null 2>&1; then + AM_EXEC_CMD="appman -h" + else + AM_EXEC_CMD="$APPDIR/bin/AM-INSTALLER" + fi + for TERM_CMD in x-terminal-emulator\ -e gnome-terminal\ -- konsole\ -e xfce4-terminal\ -e mate-terminal\ -e lxterminal\ -e terminator\ -e urxvt\ -e xterm\ -e; do + if command -v "$(echo "$TERM_CMD" | cut -d' ' -f1)" >/dev/null 2>&1; then + exec $TERM_CMD sh -c "$AM_EXEC_CMD; printf '\nPress CTRL+C to close this window...\n'; sleep 1h" + fi + done +else + if [ "$1" = "setup" ] && ! command -v am >/dev/null 2>&1 && ! command -v appman >/dev/null 2>&1 && [ ! -e /opt/am/APP-MANAGER ]; then + exec "$APPDIR/bin/AM-INSTALLER" + else + exec "$APPDIR/bin/APP-MANAGER" "$@" + fi +fi + diff --git a/appimage/get-dependencies.sh b/appimage/get-dependencies.sh new file mode 100644 index 0000000000..d4c46636d9 --- /dev/null +++ b/appimage/get-dependencies.sh @@ -0,0 +1,50 @@ +#!/bin/sh + +set -eu + +ARCH=$(uname -m) + +echo "Initializing the build container..." +echo "---------------------------------------------------------------" +pacman-key --init +pacman -Syy --noconfirm archlinux-keyring +pacman -Syu --noconfirm + +echo "Installing package dependencies..." +echo "---------------------------------------------------------------" +# "AM" is a shell script, so no GUI/mesa/etc libraries need to be bundled +# into the AppImage. We install the tools that AM may call (and that are +# missing on some distros) so that quick-sharun can bundle them - together +# with their libraries and glibc - into the AppImage. +# +# The required set is present on every architecture (Arch Linux ports). +pacman -S --noconfirm --needed \ + base-devel \ + ca-certificates \ + curl \ + git \ + jq \ + patchelf \ + tar \ + unzip \ + wget \ + xz + +# Optional packages may not exist on every architecture port. If they are +# missing here, quick-sharun (see make-appimage.sh) warns and skips them, +# and AM falls back to its built-in mechanism for those commands. +# xorg-server-xvfb is only used by quick-sharun's strace mode to provide a +# virtual display (our CLI tools do not need one, so it is just a warning +# if unavailable). +pacman -S --noconfirm --needed 7zip file xorg-server-xvfb \ + || echo " WARNING: some optional packages are not available on $ARCH" + +echo "Installing quick-sharun..." +echo "---------------------------------------------------------------" +wget -q -O /usr/local/bin/quick-sharun \ + https://raw.githubusercontent.com/pkgforge-dev/Anylinux-AppImages/refs/heads/main/useful-tools/quick-sharun.sh + #https://raw.githubusercontent.com/pkgforge-dev/Anylinux-AppImages/f6627df7a7aa48c9c614999fa46fb5707ca9b611/useful-tools/quick-sharun.sh +chmod a+x /usr/local/bin/quick-sharun + +echo "CONTAINER IS READY!" + diff --git a/appimage/make-appimage.sh b/appimage/make-appimage.sh new file mode 100755 index 0000000000..b5a4ce0bf2 --- /dev/null +++ b/appimage/make-appimage.sh @@ -0,0 +1,66 @@ +#!/bin/sh +set -eu + +# Parameters +ARCH=$1 +VERSION=$2 +export ARCH VERSION +export OUTPATH=dist +#export ADD_HOOKS="self-updater.hook" +export GITHUB_REPOSITORY="https://github.com/ivan-hc/AM" +export UPINFO="gh-releases-zsync|${GITHUB_REPOSITORY%/*}|${GITHUB_REPOSITORY#*/}|latest|*$ARCH.AppImage.zsync" +export ICON=APP-MANAGER.svg +export DESKTOP=appimage/APP-MANAGER.desktop +export MAIN_BIN=AppRun +export APPDIR="AppDir" + +# Prepare files +rm -rf "$APPDIR" +mkdir -p "$APPDIR"/bin "$APPDIR"/share +# Copy AM files +cp logo.svg APP-MANAGER.svg +cp appimage/AppRun "$APPDIR"/. +cp APP-MANAGER "$APPDIR"/bin/. +cp AM-INSTALLER "$APPDIR"/bin/. +cp INSTALL "$APPDIR"/bin/INSTALL-AM-APPIMAGE.sh +cp -rf modules "$APPDIR"/share/. +# Copy coreutils +cp -Lf /bin/7z "$APPDIR"/bin/. +cp -Lf /bin/ar "$APPDIR"/bin/. +cp -Lf /bin/cat "$APPDIR"/bin/. +cp -Lf /bin/chmod "$APPDIR"/bin/. +cp -Lf /bin/chown "$APPDIR"/bin/. +cp -Lf /bin/column "$APPDIR"/bin/. +cp -Lf /bin/curl "$APPDIR"/bin/. +cp -Lf /bin/du "$APPDIR"/bin/. +cp -Lf /bin/file "$APPDIR"/bin/. +cp -Lf /bin/grep "$APPDIR"/bin/. +cp -Lf /bin/md5sum "$APPDIR"/bin/. +cp -Lf /bin/sed "$APPDIR"/bin/. +cp -Lf /bin/sha1sum "$APPDIR"/bin/. +cp -Lf /bin/sha256sum "$APPDIR"/bin/. +cp -Lf /bin/sha512sum "$APPDIR"/bin/. +cp -Lf /bin/tar "$APPDIR"/bin/. +cp -Lf /bin/unxz "$APPDIR"/bin/. +cp -Lf /bin/unzip "$APPDIR"/bin/. +cp -Lf /bin/wget "$APPDIR"/bin/. +cp -Lf /bin/xz "$APPDIR"/bin/. +cp -Lf /bin/xzcat "$APPDIR"/bin/. +chmod a+x "$APPDIR"/bin/* + +# Deploy dependencies +quick-sharun "$APPDIR" + +# Insert env variables, 3rd line onwards +sed -i '3i\USE_HOST_XDG_CACHE_HOME=1' "$APPDIR"/AppRun.lib + +# Turn AppDir into AppImage +quick-sharun --make-appimage + +# Rename files +mv -f dist/*-"$ARCH".AppImage dist/APP-MANAGER-"$ARCH".AppImage +mv -f dist/*-"$ARCH".AppImage.zsync dist/APP-MANAGER-"$ARCH".AppImage.zsync + +# Test the app for 12 seconds +quick-sharun --simple-test dist/*.AppImage + diff --git a/modules/install.am b/modules/install.am index b6ceece9f9..c41cb7630d 100644 --- a/modules/install.am +++ b/modules/install.am @@ -269,7 +269,7 @@ _install_arg() { sed -i "s#/usr/local/share#$DATADIR#g" ./"$arg" sed -i "s#/opt/#$APPSPATH/#g" ./"$arg" else - "$SUDOCMD" mkdir -p /usr/local/share/"$LAUNCHERS_DIR" /usr/local/bin + $SUDOCMD mkdir -p /usr/local/share/"$LAUNCHERS_DIR" /usr/local/bin fi # Patch to apply to installation scripts sed -i "s# https://api.github.com#$HeaderAuthWithGITPAT https://api.github.com#g" ./"$arg" diff --git a/programs/obsolete-apps b/programs/obsolete-apps index e23cb95ab5..ea8c36556d 100644 --- a/programs/obsolete-apps +++ b/programs/obsolete-apps @@ -469,7 +469,6 @@ mcpelauncher 2024 mcpodcast 2021 mdcat 2024 mdl 2021 -mdsilo-app 2024 mechtype 2024 media-downloader 2024 media-dupes 2020 @@ -482,7 +481,6 @@ mercury 2024 meta-grabber 2023 mightymike 2023 milkytracker 2024 -mindmapp 2020 minetime 2021 mini-diary 2020 mini-qml 2020 @@ -491,443 +489,5 @@ minimal-podcasts-player 2021 minions 2018 mira-backup 2018 mirage 2021 -mjml-app 2022 mk 2024 mki3dgame 2021 -mmseqs2-search 2024 -moarperf 2020 -mob 2019 -mockman 2018 -moderndeck 2023 -modv 2024 -monit 2023 -moniteur-admin 2020 -monokle 2024 -mood-fi 2024 -moonlight 2024 -moonplayer 2023 -moose 2020 -movie-monad 2018 -mp3-tagger 2022 -mp4grep 2023 -mqtt-explorer 2024 -mqttcute 2019 -mr.dclutterer 2020 -mrwriter 2021 -ms-365-electron 2024 -munt 2023 -mupdf 2020 -music-blocks 2022 -music-kitten 2022 -music-player 2023 -musicalypse 2018 -mutool 2020 -muwire 2024 -my-budget 2020 -my-jira 2019 -mybelka 2018 -mycroft-ai 2017 -mycrypto 2022 -mypaint 2020 -mystiq 2020 -n3h 2019 -nami 2024 -nanosaur 2023 -nanosaur2 2022 -nanovault 2019 -nap 2022 -nault-bin 2023 -nazuna 2022 -ncsa-mosaic 2017 -nepaliunicode 2020 -newlogic 2019 -nextplayer 2020 -ngpost 2024 -ngrev 2021 -niffler 2021 -nightpdf 2024 -nightwave-plaza-electron 2024 -nimbus-weather 2018 -nitch 2022 -nitrokey 2021 -nix-bucks 2023 -nix-portable 2024 -nmeasimulator 2023 -no-fwl 2023 -nodeflow 2024 -nodes 2021 -notable 2020 -notedown 2023 -notekit 2023 -notemaster 2020 -noter 2019 -notes 2024 -notes-nc 2023 -noteshrink-qt 2020 -nuclia 2024 -nx-software-center 2024 -nxengine-evo 2023 -nxshell 2023 -nyaa 2024 -nychess 2023 -ocvvid2fulldome 2024 -odicto 2023 -oh 2023 -oh-mymd 2023 -olive 2024 -olive-legacy 2024 -ommpfritt 2021 -omnispeak 2024 -one-gpt 2023 -onlyrefs 2024 -onnx2bnn 2019 -onnx2daq 2020 -onshape 2018 -onyx 2018 -open-markup-editor 2022 -open-typer 2023 -openblok 2024 -openlens 2023 -openop2 2021 -openosrs-launcher 2022 -openpilot-workbench 2019 -openscad 2024 -openstream-music 2023 -orange 2022 -osrs-tools 2019 -ostara 2023 -ottomatic 2023 -outline-client 2024 -overlayed 2024 -p2p-chat 2018 -p2pderivatives 2022 -paclear 2023 -padloc 2023 -paper 2018 -parallelcoin 2021 -parchment 2023 -parity-fether 2020 -parsec-linux 2018 -patchbay 2019 -patchelf 2022 -patchwork 2021 -pathephone 2018 -pb-for-desktop 2020 -pboy 2022 -pdf-diff 2022 -pdf-sync 2019 -pdf2htmlex 2020 -pdfcompress 2022 -peep 2022 -pelusica 2024 -pennywise 2019 -perl-executing-browser 2024 -pet 2024 -pext 2023 -pget 2023 -phinch 2023 -pho 2024 -photoflow 2020 -photoname 2024 -photopealoader 2022 -phreshplayer 2019 -pia 2020 -picterm 2023 -picturama 2020 -pigs-n-cows 2021 -pile 2018 -pingendo 2019 -pingnoo 2021 -pingu 2023 -pixfetch 2022 -pixsrt 2018 -plagpatrol 2021 -platinum-md 2022 -playbox 2019 -playme 2018 -plex 2021 -plotly-orca 2020 -plume 2024 -pocket-browser 2023 -pocketcasts-electron 2021 -podium 2020 -poe-ladder 2021 -pointless 2024 -pokete 2024 -polkakey 2020 -popsicle 2024 -positron 2023 -postcat 2023 -potatopresenter 2022 -powder-toy 2022 -ppet3 2022 -pretty-handy-privacy 2018 -primate 2023 -prime-world-editor 2020 -printerclient 2018 -privaxy 2023 -procspin 2021 -procyon 2022 -programmer-browser 2022 -promethium 2023 -proofkeeper 2022 -protoman 2021 -pullp 2021 -pulse 2024 -punes 2024 -puppetry 2021 -puush-qt 2019 -pyappimage 2021 -qaddapp 2020 -qaterialgallery 2020 -qaterialhotreload 2024 -qawl 2019 -qdriverstation 2021 -qemu-ppc 2017 -qflipper 2023 -qfsm 2020 -qikqr 2020 -qmasterpassword 2023 -qnapi 2018 -qppcad 2021 -qr-code-generator 2019 -qrscan 2023 -qsdrswr 2018 -qtads 2023 -qtalarm 2019 -qtchan 2018 -qtox 2021 -quamodbusclient 2021 -quark 2020 -quark-player 2024 -quick-clone 2021 -quickgui 2024 -quicknote 2024 -quickredis 2022 -quicktwitch 2018 -qv2ray 2021 -rabix-composer 2020 -radioit 2020 -radix-wallet 2020 -rainbow-board 2021 -rasterview 2018 -rbdl-toolkit 2022 -rbdoom-3 2024 -rclone-browser 2020 -realm-studio 2024 -rebaslight 2023 -record-compare 2019 -recordscript 2024 -redeclipse 2019 -remind-me-again 2023 -retroshare 2024 -revealgo 2022 -revolt 2024 -rhb 2018 -ridereceipts 2019 -roborock-control-center 2020 -rocketfetch 2024 -roloviewer 2018 -rpan-studio 2021 -rtneuron 2019 -rubikscube 2019 -runanode 2019 -running-dinner-tool 2020 -rustdict 2022 -rx-bin 2021 -ryowallet 2022 -safe-multisig 2023 -saphyr 2022 -saucedacity 2022 -sblauncher 2020 -sc-controller 2022 -scatter 2020 -scavengers 2019 -school-sections 2018 -scilab 2024 -scraper 2019 -scratux 2020 -scrum-retroboard 2019 -scytale 2019 -secops 2024 -seismic 2023 -selenium-ide 2024 -senpa-io-client 2022 -sentinel 2021 -ser-player 2019 -setcolors 2021 -sfbrename-cli 2022 -sfbrename-gtk 2022 -sfrt-attendance 2018 -shadowsocks 2018 -sharemyhost 2020 -sharp-tune 2018 -shradiko 2022 -shuttle 2019 -sideka 2018 -sidenote 2023 -sigmaspectra 2020 -silex-desktop 2022 -siliconsneaker 2021 -silverkey 2018 -simdock 2024 -simdsp 2018 -simple-s3-uploader 2020 -simple-timer 2020 -simplechroot 2019 -simplest-file-renamer 2020 -singlebox 2020 -sinon 2021 -sioyek 2024 -slackbackup 2018 -slacktronic 2018 -slang-ed 2019 -slic3r 2019 -slogidex 2023 -smartservogui 2018 -smath-studio 2021 -smf-dsp 2021 -snake-js 2020 -snapclear 2024 -snapshot-slider 2022 -snes9x 2024 -snippetstore 2019 -snomcontrol 2019 -snowball 2022 -soapy-sdr 2020 -software-challenge-gui 2020 -solars 2023 -solarwallet 2022 -sonixd 2023 -sonos-controller 2024 -sourcetrail 2021 -sozi 2024 -spacewars 2020 -spark-wallet 2021 -speaky-miniplayer 2020 -speek 2023 -sphia 2024 -spicy-launcher 2023 -spm 2018 -spotify-tui 2021 -spyglass 2024 -squirrel-disk 2023 -srb2k 2023 -stash-electron 2023 -statuspilatus 2019 -steam-tui 2024 -steamcad 2020 -steem-messenger 2018 -stockstalk 2018 -stoplight 2019 -storadit 2022 -storaji 2018 -storyboarder 2022 -strans 2019 -streamlink-twitch-gui 2024 -streamon 2023 -studymd 2018 -stunt-car-remake 2020 -subillmanager 2022 -substrate-ide 2020 -subsurface 2023 -subtitle-composer 2022 -subtitler 2021 -sultanpos 2024 -sumoco 2019 -sup 2020 -superpaper 2022 -supertag 2021 -svelte-electron 2022 -swaglyrics 2020 -swc-minecraft-launcher 2021 -swiftnessx 2019 -swifty 2023 -swradio 2024 -symphonium 2023 -syncmyl2p 2020 -synthein 2022 -sysz 2021 -szyszka 2023 -t.viewer 2021 -tablo-tools 2023 -tagtime-desktop 2018 -taskell 2021 -taskizer 2020 -tastee-ui 2018 -tb 2024 -tc 2020 -teledrive 2020 -tere 2024 -terminalos-sim 2024 -teslacam-browser 2020 -textnote 2023 -textosaurus 2019 -the-way 2024 -thedesk 2024 -theframe 2021 -thermusqt 2018 -theweb 2021 -thief 2020 -thinreports-section-editor 2024 -thlink 2024 -thoptv 2021 -thorium-client 2019 -tilde-podcast 2022 -tilinggenerator 2019 -timenaut 2020 -tlock 2024 -tmon 2020 -tnt 2019 -todo-bash 2020 -todorant 2021 -todorust 2022 -toerings 2023 -toipe 2024 -tomatox 2021 -tonuino-toolbox 2020 -torrenttools 2021 -toru 2024 -translatium 2022 -transmissionic 2023 -triagem-touch 2024 -trinity-desktop 2021 -tt 2020 -tts-now 2022 -ttth 2021 -ttyper 2024 -tumblr-downloader-gui 2020 -tumblr-scraper 2018 -tunepack 2019 -tusk 2019 -tuxplorer 2024 -twake 2022 -tweaksophia 2019 -tweet-tray 2019 -twetter 2019 -twitch-wrapper 2019 -tx 2024 -typioca 2024 -ubiquity 2023 -uivonim 2021 -ultrascreen 2022 -uncov 2022 -unetbootin 2021 -unishellect 2022 -unreel 2018 -unveil 2020 -unyo 2024 -updatedeployqt 2019 -upnotes 2022 -uwufetch 2023 -vcloudcam 2023 -vechain 2022 -verto 2019 -via 2023 -vidcutter 2021 -vigad 2023 -vimeo-dl 2023 -viper-browser 2021 -vipster 2020 -virtscreen 2018 -visual-define-xml-editor 2021