Last active
March 8, 2024 00:46
-
-
Save evdcush/e3f8c4273fbaa5a2dd83664596ae292b 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 | |
DESKTOP_ENTRY='[Desktop Entry]\n' | |
DESKTOP_ENTRY+='Encoding=UTF-8\n' | |
DESKTOP_ENTRY+='Name=Logseq\n' | |
DESKTOP_ENTRY+='Comment=Logseq for Desktop\n' | |
DESKTOP_ENTRY+="Exec=$HOME/.logseq/Logseq.AppImage $SANDBOXPARAM %u\n" | |
DESKTOP_ENTRY+='Icon=logseq\n' | |
DESKTOP_ENTRY+='StartupWMClass=undefined\n' | |
DESKTOP_ENTRY+='Type=Application\n' | |
DESKTOP_ENTRY+='Categories=Office;\n' | |
DESKTOP_ENTRY+='MimeType=x-scheme-handler/logseq;text/html;' | |
echo -e $DESKTOP_ENTRY >> ~/.local/share/applications/appimagekit-logseq.desktop | |
# 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}" |
Thanks @vonHartz for sharing your fix!
I didn't realize there were tabs, nor that these tabs were converted to spaces when I added the license bit in an editor at the top.
Since I wanted to avoid mixing tabs and spaces, I fixed the issue here simply using echo
over Heredoc syntax.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Nice script, thanks for posting!
For me, the desktop-file generation was broken as apparently one has to use tabs instead of spaces for the EOF to be parsed correctly.
I fixed it in my fork.