Skip to content

Instantly share code, notes, and snippets.

@ruario
Last active June 21, 2023 22:03
Show Gist options
  • Star 11 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save ruario/dcbba70da900dac68fcc883542ff7ace to your computer and use it in GitHub Desktop.
Save ruario/dcbba70da900dac68fcc883542ff7ace 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.6
# 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
@ruario
Copy link
Author

ruario commented Nov 27, 2017

If you want a snapshot instead of stable, set the VIVALDI_STREAM variable. For example you could run the script as follows:

$ VIVALDI_STREAM=snapshot ./latest-vivaldi.sh

Stable and snapshot builds can be run and installed alongside one another.

Note: I use a different package naming scheme than the SlackBuild on SBo (that falls more in line with the official rpm and deb Vivaldi packages) but this means that if you want to upgrade from such a build you will need to first uninstall the SBo version first or use the “oldpackagename%newpackagename” trick with upgradepkg (see the man page, if you are not familiar).

@CLJP85
Copy link

CLJP85 commented Jul 23, 2022

color me tangentially improbably prescient [aka surprised wakka wakka wakka]

@fire-h0und
Copy link

@j12i
Copy link

j12i commented May 11, 2023

Hi Ruari,
I've run the revision before the latest for a long time, and it always works as far as I can see. Should I rather use the latest revision?

@ruario
Copy link
Author

ruario commented Jun 21, 2023

@fire-h0und Thanks, updated.

@ruario
Copy link
Author

ruario commented Jun 21, 2023

@j12i Up to you. ;)

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