Skip to content

Instantly share code, notes, and snippets.

@ruario
Last active April 16, 2024 01:54
Show Gist options
  • Star 14 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save ruario/8f648cc3069d1a55d9c8 to your computer and use it in GitHub Desktop.
Save ruario/8f648cc3069d1a55d9c8 to your computer and use it in GitHub Desktop.
Unpacks a Vivaldi Linux browser package into a version named directory and creates a startup script that will cause it to save its profile within this directory—Useful for testing or standalone (portable) installs.

Disclaimer: I wrote this script for my own personal use. Completely unofficial and unsupported by Vivaldi Technologies. However, others are welcome to use it at their own risk.

This script converts a Vivaldi browser Linux package into standalone, self-contained install. It lets you use the rpm and deb packages in a similar way to how people generally used the old Opera (Presto) tar packages—for quick testing, without committing to a full, system-wide install. This could be used for testing a specific setup or version, without touching the system wide settings (profile). It can also be used to create a portable (USB install) of Vivaldi that you could store on an external disk, for sharing between computers. A script that supports integration with the desktop environment is also provided.

Usage example:

sh standalone-vivaldi.sh vivaldi-snapshot-1.7.702.1-1.x86_64.rpm

When the script is done you will have a suitably version named directory.

To test run Vivaldi with temporary, standalone settings:

vivaldi-snapshot-1.7.702.1-x64/testrun&

To run Vivaldi with the normal shared, user settings:

vivaldi-snapshot-1.7.702.1-x64/vivaldi&

To integrate this copy of Vivaldi with your desktop environment:

vivaldi-snapshot-1.7.702.1-x64/integrate

(Note: Integrating will use the shared user settings, i.e. not portable)

#!/bin/sh
# A script to unpack a Vivaldi .rpm or .deb package for use without
# installation.
# Use the most recent Vivaldi package in the current working
# directory or whatever the user has defined as the first option
# to this script.
if [ -n "$1" ]; then
PKG="$1"
else
PKG=`ls -t vivaldi*.rpm vivaldi*.deb 2>/dev/null | head -n 1`
fi
# Exit as soon as an error is encountered.
set -e
# Check that a suitable package has been specified.
VIVALDI_PKG_INFO=`echo "$PKG" | sed -n 's/.*\(vivaldi-[a-z]\+\)[_-]\(\([0-9]\+\.\)\{3\}[0-9]\+\)-[0-9]\+[_\.]\([a-z0-9_]\+\)\.\(deb\|rpm\)$/\1:\2:\4/p'`
if [ -z "$VIVALDI_PKG_INFO" ]; then
echo 'You must specify the path to a locally stored Vivaldi Linux package.' >&2
echo "Example usage: $0 vivaldi-stable-1.4.589.29-1.x86_64.rpm" >&2
exit 1
fi
if [ ! -r "$PKG" ]; then
echo "$PKG is either not present or cannot be read." >&2
exit 1
fi
# Define the various variables obtained from information in the
# original package name.
VIVALDI_STREAM=`echo "$VIVALDI_PKG_INFO" | cut -d: -f1`
case "$VIVALDI_STREAM" in
vivaldi-stable) VIVALDI_STREAM=vivaldi ;;
vivaldi-beta) VIVALDI_STREAM=vivaldi ;;
esac
VIVALDI_VERSION=`echo "$VIVALDI_PKG_INFO" | cut -d: -f2`
VIVALDI_ARCH=`echo "$VIVALDI_PKG_INFO" | cut -d: -f3`
case "$VIVALDI_ARCH" in
x86_64) VIVALDI_ARCH=x64 ;;
amd64) VIVALDI_ARCH=x64 ;;
i386) VIVALDI_ARCH=x86 ;;
esac
VIVDIR="$VIVALDI_STREAM-$VIVALDI_VERSION-$VIVALDI_ARCH"
if [ -d "$VIVDIR" ]; then
echo "$VIVDIR already exists, aborting." >&2
exit 0
fi
# Extract the package contents.
available () {
command -v "$1" >/dev/null 2>&1
}
extract_rpm () {
if available bsdtar; then
bsdtar xf "$1" -C "$VIVDIR"
elif available cpio; then
tail -c+`grep -abom1 7zXZ "$1" | cut -d: -f1` "$1" | xz -d | (cd "$VIVDIR"; cpio --quiet -id)
else
echo 'You must install BSD tar or GNU cpio to use this script.' >&2
exit 1
fi
}
extract_deb () {
if available bsdtar; then
DEB_EXTRACT_COMMAND='bsdtar xOf'
elif available ar; then
DEB_EXTRACT_COMMAND='ar p'
else
echo 'You must install BSD tar or GNU binutils to use this script.' >&2
exit 1
fi
$DEB_EXTRACT_COMMAND "$1" data.tar.xz | tar xJ -C "$VIVDIR"
}
mkdir "$VIVDIR"
case "$PKG" in
*deb) extract_deb "$PKG" ;;
*rpm) extract_rpm "$PKG" ;;
esac
cd "$VIVDIR"
# Make a symlink to launch Vivaldi
ln -s "opt/$VIVALDI_STREAM/$VIVALDI_STREAM" vivaldi
# Make a (standalone) testrun wrapper
cat << EOF > testrun
#!/bin/sh
exec "\${0%/*}/opt/$VIVALDI_STREAM/$VIVALDI_STREAM" --user-data-dir="\${0%/*}/temp-settings" "\$@"
EOF
# Provide a script to integrate with the desktop environment
cat << EOF > integrate
#!/bin/sh
set -e
XDG_DATA_HOME="\${XDG_DATA_HOME:-\$HOME/.local/share}"
available () {
command -v "\$1" >/dev/null 2>&1
}
update_caches () {
touch -c "\$XDG_DATA_HOME/icons/hicolor"
if available gtk-update-icon-cache; then
gtk-update-icon-cache -tq "\$XDG_DATA_HOME/icons/hicolor"
fi
if available update-desktop-database; then
update-desktop-database -q "\$XDG_DATA_HOME/applications"
fi
}
cd "\${0%/*}"
if [ -n "\$1" ]; then
if [ "\$1" = "-r" -o "--remove" ]; then
rm "\$XDG_DATA_HOME/icons/hicolor"/*x*/"apps/$VIVALDI_STREAM.png" "\$XDG_DATA_HOME/applications/$VIVALDI_STREAM.desktop"
update_caches
echo "Removed desktop environment integration."
exit 0
fi
fi
for png in opt/$VIVALDI_STREAM/product_logo_*.png; do
sizepng="\${png##*/product_logo_}"
install -Dm644 \$png "\$XDG_DATA_HOME/icons/hicolor/\${sizepng%.png}x\${sizepng%.png}/apps/$VIVALDI_STREAM.png"
done
mkdir -p "\$XDG_DATA_HOME/applications"
sed "/^Exec=/s,.*,Exec=\"\$PWD/vivaldi\" %U," usr/share/applications/vivaldi*.desktop > "\$XDG_DATA_HOME/applications/$VIVALDI_STREAM.desktop"
update_caches
echo "Integration with the desktop environment complete."
echo "You may need to re-login before Vivaldi shows up."
echo 'Note: To remove integration, rerun this script with "--remove".'
EOF
# Make scripts executable
chmod 755 testrun integrate
# Some instructions for the user
cat << EOF
To test run Vivaldi with temporary settings:
$VIVDIR/testrun&
To run Vivaldi with your normal settings:
$VIVDIR/vivaldi&
To integrate this copy of Vivaldi with your desktop environment:
$VIVDIR/integrate
EOF
@ruario
Copy link
Author

ruario commented Jul 3, 2021

@markosc If you are not looking for actual "portablity" (i.e. the ability to move installs between machine) but just want the ability to run more than one build from the same stream (e.g. two different snapshots) side-by-side, with different profiles and settings, then you can also look at register-named-vivaldi-build.sh instead.

@ruario
Copy link
Author

ruario commented Jul 3, 2021

I have updated the README further to make it even clearer what is portable (testrun) and what is not (running vivaldi directly or using integrate).

@markosc
Copy link

markosc commented Jul 3, 2021

there is an interesting project (but chrome), maybe thanks for your answer https://github.com/shivamgly/Google-Chrome-Portable-maker-for-linux

@markosc
Copy link

markosc commented Jul 3, 2021

I have updated the README further to make it even clearer what is portable (testrun) and what is not (running vivaldi directly or using integrate).

thanks

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