Skip to content

Instantly share code, notes, and snippets.

@fire-h0und
Forked from ruario/latest-vivaldi.sh
Last active April 15, 2023 09:19
Show Gist options
  • Save fire-h0und/efc0af35bcc09ab4aff820339869f4a4 to your computer and use it in GitHub Desktop.
Save fire-h0und/efc0af35bcc09ab4aff820339869f4a4 to your computer and use it in GitHub Desktop.
This script will find the latest Vivaldi binary package, download it and repackage it into Slackware format.
#!/bin/bash
# latest-Vivaldi Version 1.6.5
# This script will find the latest Vivaldi binary package, download it
# and repackage it into Slackware format.
# Copyright 2019 Ruari Oedegaard, Oslo, Norway All rights reserved.
#
# Redistribution and use of this script, with or without modification,
# is permitted provided that the following conditions are met:
#
# 1. Redistributions of this script must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# HOLDER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# Check if the user asked for auto-install
if [ "$1" = "-i" -o "$1" = "--install" ]; then
if [ "$UID" = "0" ]; then
AUTO_INSTALL=Y
else
echo "You must be root to auto-install, $1 ignored!" >&2
AUTO_INSTALL=N
fi
else
AUTO_INSTALL=N
fi
# Use the architecture of the current machine or whatever the user has
# set externally
ARCH=${ARCH:-$(uname -m)}
if [ "$ARCH" = "x86_64" ]; then
DEBARCH="amd64"
elif [[ "$ARCH" = i?86 ]]; then
DEBARCH="i386"
elif [[ "$ARCH" = arm* ]]; then
ARCH=arm
DEBARCH="armhf"
elif [[ "$ARCH" = aarch64* ]]; then
ARCH=aarch64
DEBARCH="arm64"
else
echo "The architecture $ARCH is not supported." >&2
exit 1
fi
# Set to snapshot to track that channel instead of stable Vivaldi
VIVALDI_STREAM=${VIVALDI_STREAM:-stable}
if [ "$VIVALDI_STREAM" = "stable" ]; then
VIVALDIBIN=vivaldi
elif [ "$VIVALDI_STREAM" = "snapshot" ]; then
VIVALDIBIN="vivaldi-$VIVALDI_STREAM"
else
echo "The stream $VIVALDI_STREAM is not supported." >&2
exit 1
fi
# Work out the latest stable Vivaldi if VERSION is unset
VERSION=${VERSION:-$(wget -qO- http://repo.vivaldi.com/archive/deb/dists/stable/main/binary-$DEBARCH/Packages.gz | gzip -d | grep -A6 -x "Package: vivaldi-$VIVALDI_STREAM" | sed -n "/Version/s/.* //p" | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n | tail -n 1)}
# Error out if $VERISON is unset, e.g. because previous command failed
if [ -z $VERSION ]; then
echo "Could not work out the latest version; exiting" >&2
exit 1
fi
if echo $VERSION | grep -Fq '-'; then
VIVALDIREVISION=${VERSION#*-}
VERSION=${VERSION%-*}
else
VIVALDIREVISION=""
fi
# Don't start repackaging if the same version is already installed
if /bin/ls /var/log/packages/vivaldi-$VIVALDI_STREAM-$VERSION-* >/dev/null 2>&1 || /bin/ls /var/log/packages/$VIVALDIBIN-$VERSION-* >/dev/null 2>&1 ; then
echo "Vivaldi $VIVALDI_STREAM ($VERSION) is already installed; exiting"
exit 0
fi
SRCPACKAGE="vivaldi-${VIVALDI_STREAM}_$VERSION-${VIVALDIREVISION}_$DEBARCH.deb"
CWD="$PWD"
TMP="${TMP:-/tmp}"
OUTPUT="${OUTPUT:-/tmp}"
BUILD="${BUILD:-1}"
TAG="${TAG:-ro}"
PKGTYPE="${PKGTYPE:-tgz}"
PACKAGE="$OUTPUT/vivaldi-$VIVALDI_STREAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
# If the package was made previously, no need to make it again. ;)
if [ -e "$PACKAGE" ]; then
echo "$PACKAGE already exists; exiting"
exit 0
fi
REPACKDIR="$TMP/repackage-vivaldi-$VIVALDI_STREAM"
# Define this script's name as we will copy into doc directory later on
SCRIPT="${0##*/}"
# This function can be used in place of Slackware's makepkg, with the
# added bonus that it is able to make packages with root owned files
# even when run as a regular user.
mkpkg() {
if [ "$1" = "-n" ]; then
TAROWNER=""
shift 1
else
TAROWNER="--group 0 --owner 0"
fi
if find * -type l | grep -qm1 .; then
mkdir -p install
find * -type l -printf '( cd %h ; rm -rf %f )\n( cd %h ; ln -sf %l %f )\n' -delete > install/symlinks
if [ -f "install/doinst.sh" ]; then
printf '\n' | cat - install/doinst.sh >> install/symlinks
fi
mv install/symlinks install/doinst.sh
fi
case "$1" in
*tbr) cmp="brotli --quality ${BROTLI_QUALITY:-5}" ;; # Experimental support for Brotli compression
*tbz)
if command -v lbzip2 >/dev/null 2>&1; then
cmp=lbzip2
else
cmp=bzip2
fi
;;
*tgz)
if command -v pigz >/dev/null 2>&1; then
cmp=pigz
else
cmp=gzip
fi
;;
*tlz) cmp=lzma ;;
*txz) cmp="xz -T0" ;;
*tz4) cmp=lz4 ;; # Experimental support for lz4 compression
*tzo) cmp=lzop ;; # Experimental support for lzop compression
*) echo "Unknown compression type" >&2 ; exit 1 ;;
esac
if [ -x /bin/tar-1.13 ]; then
tar-1.13 $TAROWNER -cvvf- . | $cmp > "$1"
else
tar cvvf - . --format gnu --xform 'sx^\./\(.\)x\1x' --show-stored-names $TAROWNER | $cmp > "$1"
fi
echo "Slackware package \"$1\" created."
}
# Since packaging is about to begin errors become more important now,
# so exit if things fail.
set -eu
# If the repackage is already present from the past, clear it down
# and re-create it.
if [ -d "$REPACKDIR" ]; then
rm -r "$REPACKDIR"
fi
mkdir -p "$REPACKDIR"/{pkg/install,src}
# Save a copy if this script but remove execute persmissions as it will
# later be moved into the doc directory.
install -m 644 "${0}" "$REPACKDIR/src/$SCRIPT"
# Check if the current directory contains the correct Vivaldi
# binary package, otherwise download it. Then check that it matches the
# version number defined.
if [ -e "$SRCPACKAGE" ]; then
(
cd "$REPACKDIR/src/"
ln -s "$CWD/$SRCPACKAGE" "$SRCPACKAGE"
)
else
echo "Downloading Vivaldi ${VERSION} for ${ARCH}"
wget "https://downloads.vivaldi.com/$VIVALDI_STREAM/$SRCPACKAGE" -P "$REPACKDIR/src/"
fi
# Now we have all the sources in place, switch to the package directory
# and start setting things up.
cd "$REPACKDIR/pkg"
# Extract the contents of the Vivaldi binary package
ar p ../src/"$SRCPACKAGE" data.tar.xz | tar xJ ./opt ./usr
# Remove debian menu system
if [ -d usr/share/menu ]; then
rm -r usr/share/menu
fi
# Move any man directories to the correct Slackware location
if [ -d usr/share/man ]; then
mv usr/share/man usr/
fi
# Move the doc directory to the correct Slackware location
mv usr/share/doc usr/
mv "usr/doc/vivaldi-$VIVALDI_STREAM" "usr/doc/vivaldi-$VIVALDI_STREAM-$VERSION"
# Copy this script into the doc directory
cp ../src/$SCRIPT usr/doc/vivaldi-$VIVALDI_STREAM-$VERSION/$SCRIPT
# Replace vivaldi executable symlink, with a relative one
if [ -h "usr/bin/vivaldi-$VIVALDI_STREAM" ]; then
rm usr/bin/vivaldi-$VIVALDI_STREAM
(
cd usr/bin
ln -s ../../opt/$VIVALDIBIN/$VIVALDIBIN vivaldi-$VIVALDI_STREAM
)
fi
# Symlink desktop environment icons
for png in opt/$VIVALDIBIN/product_logo_*.png; do
pngsize="${png##*/product_logo_}"
mkdir -p usr/share/icons/hicolor/${pngsize%.png}x${pngsize%.png}/apps
(
cd usr/share/icons/hicolor/${pngsize%.png}x${pngsize%.png}/apps/
ln -s ../../../../../../opt/$VIVALDIBIN/product_logo_${pngsize} vivaldi-$VIVALDI_STREAM.png
)
done
# Fix desktop file icon reference for stable builds
sed -i "s/^Icon=vivaldi.*/Icon=vivaldi-$VIVALDI_STREAM/" usr/share/applications/vivaldi-$VIVALDI_STREAM.desktop
# Fetch and install Widevine
if [ -e opt/$VIVALDIBIN/update-widevine ]; then
sed "s|WIDEVINE_INSTALL_DIR=\"|&$PWD|;s|\(VIVALDI_INSTALL_DIR=\).*|\1\"$PWD/opt/$VIVALDIBIN\"|" opt/$VIVALDIBIN/update-widevine | sh -eus -- --system >/dev/null 2>&1 ||:
# Fix Widevine symlinks (first is for <2.9 and the second ≥2.9)
if [ -h "opt/$VIVALDIBIN/libwidevinecdm.so" ]; then
rm "opt/$VIVALDIBIN/libwidevinecdm.so"
ln -fs "../../var/opt/$VIVALDIBIN/libwidevinecdm.so" "opt/$VIVALDIBIN/libwidevinecdm.so"
elif [ -h "opt/$VIVALDIBIN/WidevineCdm" ]; then
rm "opt/$VIVALDIBIN/WidevineCdm"
ln -fs "../../var/opt/$VIVALDIBIN/WidevineCdm" "opt/$VIVALDIBIN/WidevineCdm"
fi
fi
# Fetch and install 'Proprietary Media' (H.264/AAC) support (≥2.9)
if [ -e opt/$VIVALDIBIN/update-ffmpeg ]; then
sed "s|FFMPEG_INSTALL_DIR=\"|&$PWD|" opt/$VIVALDIBIN/update-ffmpeg | sh -eu >/dev/null 2>&1 ||:
fi
# Now create the post-install to register the desktop file and icons.
cat <<EOS> install/doinst.sh
# Setup menu entries
if command -v update-desktop-database >/dev/null 2>&1; then
update-desktop-database -q usr/share/applications
fi
# Setup icons
touch -c usr/share/icons/hicolor
if command -v gtk-update-icon-cache >/dev/null 2>&1; then
gtk-update-icon-cache -tq usr/share/icons/hicolor
fi
EOS
# Create a description file inside the package.
cat <<EOD> install/slack-desc
vivaldi-$VIVALDI_STREAM: vivaldi-$VIVALDI_STREAM (Vivaldi web browser)
vivaldi-$VIVALDI_STREAM:
vivaldi-$VIVALDI_STREAM: Vivaldi browser is made with power users in mind by people who love
vivaldi-$VIVALDI_STREAM: the Web.
vivaldi-$VIVALDI_STREAM:
vivaldi-$VIVALDI_STREAM:
vivaldi-$VIVALDI_STREAM:
vivaldi-$VIVALDI_STREAM:
vivaldi-$VIVALDI_STREAM:
vivaldi-$VIVALDI_STREAM: Homepage: https://vivaldi.com
vivaldi-$VIVALDI_STREAM:
EOD
# Make sure the file permissions are ok
chmod -R u+w,go+r-w,a-s .
# Create the Slackware package
mkpkg "$PACKAGE"
# Install if the user requested it
if [ $AUTO_INSTALL = "Y" ]; then
/sbin/upgradepkg --install-new "$PACKAGE"
fi
@fire-h0und
Copy link
Author

added aarc64 for the upcoming Slackware64 arm port and eventually re;ease

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment