-
-
Save vonHartz/65d10fec709e2eba2a755a1878dec3ab to your computer and use it in GitHub Desktop.
Handy shell script to install and update Logseq on Linux
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env bash | |
# This script comes from Joplin, MIT License Copyright Laurent Cozic: | |
# https://github.com/laurent22/joplin/blob/dev/Joplin_install_and_update.sh | |
# Modified here by github.com/evdcush to instead install and update Logseq. | |
set -e | |
trap 'handleError' ERR | |
handleError() { | |
echo "" | |
echo "If you encountered an error, please consider fixing" | |
echo "the script for your environment and creating a pull" | |
echo "request instead of asking for support on GitHub or" | |
echo "the forum. The error message above should tell you" | |
echo "where and why the error happened." | |
} | |
#----------------------------------------------------- | |
# Variables | |
#----------------------------------------------------- | |
COLOR_RED=`tput setaf 1` | |
COLOR_GREEN=`tput setaf 2` | |
COLOR_YELLOW=`tput setaf 3` | |
COLOR_BLUE=`tput setaf 4` | |
COLOR_RESET=`tput sgr0` | |
SILENT=false | |
ALLOW_ROOT=false | |
SHOW_CHANGELOG=true | |
INCLUDE_PRE_RELEASE=false | |
print() { | |
if [[ "${SILENT}" == false ]] ; then | |
echo -e "$@" | |
fi | |
} | |
showLogo() { | |
print "${COLOR_BLUE}" | |
print ' _ ' | |
print '| | ' | |
print '| | ___ __ _ ___ ___ __ _ ' | |
print '| | / _ \ / _` |/ __| / _ \ / _` |' | |
print '| |____ | (_) || (_| |\__ \| __/| (_| |' | |
print '|______| \___/ \__, ||___/ \___| \__, |' | |
print ' __/ | | |' | |
print ' |___/ |_|' | |
print '' | |
print "${COLOR_RESET}" | |
} | |
showHelp() { | |
showLogo | |
print "Available Arguments:" | |
print "\t" "--help" "\t" "Show this help information" "\n" | |
print "\t" "--allow-root" "\t" "Allow the install to be run as root" | |
print "\t" "--changelog" "\t" "Show the changelog after installation" | |
print "\t" "--force" "\t" "Always download the latest version" | |
print "\t" "--silent" "\t" "Don't print any output" | |
print "\t" "--prerelease" "\t" "Check for new Versions including Pre-Releases" | |
if [[ ! -z $1 ]]; then | |
print "\n" "${COLOR_RED}ERROR: " "$*" "${COLOR_RESET}" "\n" | |
else | |
exit 0 | |
fi | |
} | |
#----------------------------------------------------- | |
# PARSE ARGUMENTS | |
#----------------------------------------------------- | |
optspec=":h-:" | |
while getopts "${optspec}" OPT; do | |
[ "${OPT}" = " " ] && continue | |
if [ "${OPT}" = "-" ]; then # long option: reformulate OPT and OPTARG | |
OPT="${OPTARG%%=*}" # extract long option name | |
OPTARG="${OPTARG#$OPT}" # extract long option argument (may be empty) | |
OPTARG="${OPTARG#=}" # if long option argument, remove assigning `=` | |
fi | |
case "${OPT}" in | |
h | help ) showHelp ;; | |
allow-root ) ALLOW_ROOT=true ;; | |
silent ) SILENT=true ;; | |
force ) FORCE=true ;; | |
changelog ) SHOW_CHANGELOG=true ;; | |
prerelease ) INCLUDE_PRE_RELEASE=true ;; | |
[^\?]* ) showHelp "Illegal option --${OPT}"; exit 2 ;; | |
\? ) showHelp "Illegal option -${OPTARG}"; exit 2 ;; | |
esac | |
done | |
shift $((OPTIND-1)) # remove parsed options and args from $@ list | |
## Check and warn if running as root. | |
if [[ $EUID = 0 ]] && [[ "${ALLOW_ROOT}" != true ]]; then | |
showHelp "It is not recommended (nor necessary) to run this script as root. To do so anyway, please use '--allow-root'" | |
exit 1 | |
fi | |
#----------------------------------------------------- | |
# START | |
#----------------------------------------------------- | |
showLogo | |
#----------------------------------------------------- | |
# Download Logseq | |
#----------------------------------------------------- | |
# ASSUMES x64 arch! | |
URL='https://api.github.com/repos/logseq/logseq/releases/latest' | |
# Get the latest version to download | |
## grepped line looks like: ` "tag_name": "0.8.5",` | |
RELEASE_VERSION=$(wget -qO - $URL | grep tag_name | cut -d'"' -f4) | |
# Check if it's in the latest version | |
if [[ -e ~/.logseq/VERSION ]] && [[ $(< ~/.logseq/VERSION) == "${RELEASE_VERSION}" ]]; then | |
print "${COLOR_GREEN}You already have the latest version${COLOR_RESET} ${RELEASE_VERSION} ${COLOR_GREEN}installed.${COLOR_RESET}" | |
([[ "$FORCE" == true ]] && print "Forcing installation...") || exit 0 | |
else | |
[[ -e ~/.logseq/VERSION ]] && CURRENT_VERSION=$(< ~/.logseq/VERSION) | |
print "The latest version is ${RELEASE_VERSION}, but you have ${CURRENT_VERSION:-no version} installed." | |
fi | |
#----------------------------------------------------- | |
print 'Downloading Logseq...' | |
TEMP_DIR=$(mktemp -d) | |
RELEASE_URL="https://github.com/logseq/logseq/releases/download/${RELEASE_VERSION}/Logseq-linux-x64-${RELEASE_VERSION}.AppImage" | |
wget -O "${TEMP_DIR}/Logseq.AppImage" "https://github.com/logseq/logseq/releases/download/${RELEASE_VERSION}/Logseq-linux-x64-${RELEASE_VERSION}.AppImage" | |
# https://github.com/logseq/logseq/raw/master/resources/icons/logseq_big_sur.png | |
# perma: https://github.com/logseq/logseq/raw/1893dde335f366adf84479d50d403a55aeac00ea/resources/icons/logseq_big_sur.png | |
ICON_URL='https://github.com/logseq/logseq/raw/1893dde335f366adf84479d50d403a55aeac00ea/resources/icons/logseq_big_sur.png' | |
wget -O "${TEMP_DIR}/logseq.png" $ICON_URL | |
#----------------------------------------------------- | |
print 'Installing Logseq...' | |
# Delete previous version. | |
rm -f ~/.logseq/*.AppImage ~/.local/share/applications/logseq.desktop ~/.logseq/VERSION | |
# Creates the folder where the binary will be stored | |
mkdir -p ~/.logseq/ | |
# Download the latest version | |
mv "${TEMP_DIR}/Logseq.AppImage" ~/.logseq/Logseq.AppImage | |
# Gives execution privileges | |
chmod +x ~/.logseq/Logseq.AppImage | |
print "${COLOR_GREEN}OK${COLOR_RESET}" | |
#----------------------------------------------------- | |
print 'Installing icon...' | |
# RESIZE first from default 1024 --> 512 | |
convert -resize 512x512 "${TEMP_DIR}/logseq.png" "${TEMP_DIR}/logseq.png" | |
mkdir -p ~/.local/share/icons/hicolor/512x512/apps | |
mv "${TEMP_DIR}/logseq.png" ~/.local/share/icons/hicolor/512x512/apps/logseq.png | |
print "${COLOR_GREEN}OK${COLOR_RESET}" | |
# Detect desktop environment | |
if [ "$XDG_CURRENT_DESKTOP" = "" ] | |
then | |
DESKTOP=$(echo "${XDG_DATA_DIRS}" | sed 's/.*\(xfce\|kde\|gnome\).*/\1/') | |
else | |
DESKTOP=$XDG_CURRENT_DESKTOP | |
fi | |
DESKTOP=${DESKTOP,,} # convert to lower case | |
echo 'Create Desktop icon...' | |
# Detect distribution environment, and apply --no-sandbox fix | |
SANDBOXPARAM="" | |
# lsb_release isn't available on some platforms (e.g. opensuse) | |
# The equivalent of lsb_release in OpenSuse is the file /usr/lib/os-release | |
if command -v lsb_release &> /dev/null; then | |
DISTVER=$(lsb_release -is) && DISTVER=$DISTVER$(lsb_release -rs) | |
DISTCODENAME=$(lsb_release -cs) | |
DISTMAJOR=$(lsb_release -rs|cut -d. -f1) | |
#----------------------------------------------------- | |
# Check for "The SUID sandbox helper binary was found, but is not configured correctly" problem. | |
# It is present in Debian 1X. A (temporary) patch will be applied at .desktop file | |
# Linux Mint 4 Debbie is based on Debian 10 and requires the same param handling. | |
if [[ $DISTVER =~ Debian1. ]] || [ "$DISTVER" = "Linuxmint4" ] && [ "$DISTCODENAME" = "debbie" ] || [ "$DISTVER" = "CentOS" ] && [[ "$DISTMAJOR" =~ 6|7 ]] | |
then | |
SANDBOXPARAM="--no-sandbox" | |
fi | |
fi | |
# Initially only desktop environments that were confirmed to use desktop files stored in | |
# `.local/share/desktop` had a desktop file created. | |
# However some environments don't return a desktop BUT still support these desktop files | |
# the command check was added to support all Desktops that have support for the | |
# freedesktop standard | |
# The old checks are left in place for historical reasons, but | |
# NO MORE DESKTOP ENVIRONMENTS SHOULD BE ADDED | |
# If a new environment needs to be supported, then the command check section should be re-thought | |
if [[ $DESKTOP =~ .*gnome.*|.*kde.*|.*xfce.*|.*mate.*|.*lxqt.*|.*unity.*|.*x-cinnamon.*|.*deepin.*|.*pantheon.*|.*lxde.*|.*i3.*|.*sway.* ]] || [[ `command -v update-desktop-database` ]] | |
then | |
# Only delete the desktop file if it will be replaced | |
rm -f ~/.local/share/applications/appimagekit-logseq.desktop | |
# On some systems this directory doesn't exist by default | |
mkdir -p ~/.local/share/applications | |
# Tabs specifically, and not spaces, are needed for indentation with Bash heredocs | |
cat >> ~/.local/share/applications/appimagekit-logseq.desktop <<-EOF | |
[Desktop Entry] | |
Encoding=UTF-8 | |
Name=Logseq | |
Comment=Logseq for Desktop | |
Exec=${HOME}/.logseq/Logseq.AppImage ${SANDBOXPARAM} %u | |
Icon=logseq | |
StartupWMClass=undefined | |
Type=Application | |
Categories=Office; | |
MimeType=x-scheme-handler/logseq;text/html; | |
EOF | |
# Update application icons | |
[[ `command -v update-desktop-database` ]] && update-desktop-database ~/.local/share/applications && update-desktop-database ~/.local/share/icons | |
print "${COLOR_GREEN}OK${COLOR_RESET}" | |
else | |
print "${COLOR_RED}NOT DONE, unknown desktop '${DESKTOP}'${COLOR_RESET}" | |
fi | |
#----------------------------------------------------- | |
# FINISH INSTALLATION | |
#----------------------------------------------------- | |
# Informs the user that it has been installed | |
print "${COLOR_GREEN}Logseq version${COLOR_RESET} ${RELEASE_VERSION} ${COLOR_GREEN}installed.${COLOR_RESET}" | |
# Record version | |
echo "$RELEASE_VERSION" > ~/.logseq/VERSION | |
#----------------------------------------------------- | |
# Print changelog. | |
if [[ "$SHOW_CHANGELOG" == true ]]; then | |
NOTES=$(wget -qO - https://api.github.com/repos/logseq/logseq/releases/latest | grep -Po '"body": "\K.*(?=")') | |
print "${COLOR_BLUE}Changelog:${COLOR_RESET}\n${NOTES}" | |
fi | |
#----------------------------------------------------- | |
print "Cleaning up..." | |
rm -rf "$TEMP_DIR" | |
print "${COLOR_GREEN}OK${COLOR_RESET}" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment