Skip to content

Instantly share code, notes, and snippets.

@evdcush
Last active March 8, 2024 00:46
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save evdcush/e3f8c4273fbaa5a2dd83664596ae292b to your computer and use it in GitHub Desktop.
Save evdcush/e3f8c4273fbaa5a2dd83664596ae292b to your computer and use it in GitHub Desktop.
Handy shell script to install and update Logseq on Linux
#!/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}"
@vonHartz
Copy link

vonHartz commented Dec 6, 2022

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.

@evdcush
Copy link
Author

evdcush commented Dec 7, 2022

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