-
-
Save ruario/3ed0d3a6c0764c4ae9f9 to your computer and use it in GitHub Desktop.
| #!/usr/bin/env bash | |
| available () { | |
| command -v "$1" >/dev/null 2>&1 | |
| } | |
| rpmcheck () { | |
| if [ -e "$1" ]; then | |
| echo "$1 is already present, delete it if you want to recreate it" | |
| exit 0 | |
| fi | |
| } | |
| # Checked the required tools are installed | |
| if ! available rpmbuild; then | |
| echo "You must install rpm-build to use this script" >&2 | |
| exit 1 | |
| fi | |
| if ! available ar; then | |
| echo "You must install GNU binutils to use this script" >&2 | |
| exit 1 | |
| fi | |
| # Check if automatic download has been selected | |
| if [ "$1" = "-d" -o "$1" = "--developer" ]; then | |
| name=opera-developer | |
| appname=$name | |
| shift 1 | |
| elif [ "$1" = "-b" -o "$1" = "--beta" ]; then | |
| name=opera-beta | |
| appname=$name | |
| shift 1 | |
| elif [ "$1" = "-s" -o "$1" = "--stable" ]; then | |
| name=opera-stable | |
| appname=opera | |
| shift 1 | |
| fi | |
| if [ -n "$name" ]; then | |
| # Make sure we have wget or curl | |
| if available wget; then | |
| silentdl="wget -qO-" | |
| louddl="wget" | |
| dloutput="-O" | |
| elif available curl; then | |
| silentdl="curl -s" | |
| louddl="curl" | |
| dloutput="-o" | |
| else | |
| echo "Install wget or curl" >&2 | |
| exit 1 | |
| fi | |
| # Work out the latest Opera version for selected stream | |
| version=$($silentdl http://deb.opera.com/opera/dists/stable/non-free/binary-amd64/Packages.gz | gzip -d | grep -A1 -x "Package: $name" | sed -n "/Version/s/.* //p") | |
| # Error out if $version is unset, e.g. because previous command failed | |
| if [ -z "$version" ]; then | |
| echo "Could not work out the latest version of $name; exiting" >&2 | |
| exit 1 | |
| fi | |
| # Define some variables | |
| deb=${name}_${version}_amd64.deb | |
| srcdir=/tmp # Stick the build in /tmp so it will be auto-deleted on reboot | |
| outdir=/var/tmp # Stick the rpm in /var/tmp so that it is not auto-deleted | |
| # Check if an rpm is already built | |
| rpm=${name}-${version}-0.x86_64.rpm | |
| rpmcheck "$outdir/$rpm" | |
| # Fetch the build if it is not already present | |
| if [ -e "$srcdir/$deb" ]; then | |
| echo "Using $srcdir/$deb as a source" | |
| else | |
| $louddl http://deb.opera.com/opera/pool/non-free/o/$name/$deb $dloutput "$srcdir/$deb" | |
| if ! [ "$?" = 0 ]; then | |
| echo "Download failed!" >&2 | |
| exit 1 | |
| fi | |
| fi | |
| else | |
| # Perform some sanity checks on specified deb package | |
| if [ -z "$1" ]; then | |
| echo "You must specify the path to a locally stored Opera .deb package." >&2 | |
| echo "Example usage: $(basename $0) opera.deb" >&2 | |
| exit 1 | |
| fi | |
| if ! echo "$1" | grep -Eq "opera.*[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+.*\.deb$"; then | |
| echo "$1 is not named like a recent Opera .deb package" >&2 | |
| exit 1 | |
| fi | |
| if [ ! -r "$1" ]; then | |
| echo "$1 is either not present or cannot be read" >&2 | |
| exit 1 | |
| fi | |
| # Work out stream from the package name | |
| case "$1" in | |
| *developer*) name=opera-developer; appname=$name ;; | |
| *beta*) name=opera-beta; appname=$name ;; | |
| *stable*) name=opera-stable; appname=opera ;; | |
| *) echo "Cannot work out which stream this version of Opera is from" >&2; exit 1 ;; | |
| esac | |
| # Work out version from the package name | |
| version=$(echo "$1" | sed -r 's/.*[_-](([0-9]+\.)+[0-9]+)[_-].*/\1/') | |
| # Error out if $version is unset | |
| if [ -z "$version" ]; then | |
| echo "Could not work out the latest version of $name; exiting" >&2 | |
| exit 1 | |
| fi | |
| # Define some variables | |
| deb=$(basename $1) | |
| srcdir=$(cd "$(dirname $1)"; pwd) | |
| outdir=$(pwd) | |
| # Check if an rpm is already built | |
| rpm=${name}-${version}-0.x86_64.rpm | |
| rpmcheck "$outdir/$rpm" | |
| fi | |
| if [ ! -w "$outdir" ]; then | |
| echo "You do not have write permission to your output directory ($outdir)." >&2 | |
| exit 1 | |
| fi | |
| set -e | |
| # Now the repack actually begins | |
| repackdir=$(mktemp -t -d opera_repack.XXXXXX) | |
| mkdir -p "${repackdir}"/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS} | |
| ln -s "$outdir" "$repackdir/RPMS/x86_64" | |
| ln -s "$srcdir/$deb" "$repackdir/SOURCES/." | |
| cat <<EOF > "${repackdir}/SPECS/opera.spec" | |
| %define appname $appname | |
| %define debug_package %{nil} | |
| Summary: Fast and secure web browser | |
| Name: $name | |
| Version: $version | |
| Release: 0 | |
| Group: Applications/Internet | |
| License: Proprietary | |
| URL: http://www.opera.com/browser | |
| Source0: $deb | |
| Vendor: Opera Software ASA | |
| Packager: ruario | |
| %description | |
| Opera is a fast, secure and user-friendly web browser. It | |
| includes web developer tools, news aggregation, and the ability | |
| to compress data via Opera Turbo on congested networks. | |
| %prep | |
| %setup -T -c | |
| %build | |
| %install | |
| # Not needed on Fedora but it is on some other distros | |
| mkdir -p "%{buildroot}" | |
| # Unpack the deb, correcting the lib directory and removing debian directories | |
| ar p %{SOURCE0} data.tar.xz | tar -xJf- -C %{buildroot} \\ | |
| --transform="s,/usr/lib/.*-linux-gnu,%{_libdir}," \\ | |
| --exclude="./usr/share/lintian" \\ | |
| --exclude="./usr/share/menu" | |
| # Fix the location of the doc directory on OpenSUSE | |
| %if 0%{?suse_version} | |
| mkdir -p "%{buildroot}/%{_defaultdocdir}" | |
| mv "%{buildroot}/usr/share/doc/%{name}" "%{buildroot}/%{_defaultdocdir}/%{name}" 2>/dev/null ||: | |
| %endif | |
| # Set the correct permissions on the sandbox | |
| chmod 4755 %{buildroot}%{_libdir}/%{appname}/opera_sandbox | |
| # Correct the symlink due to changed lib directory | |
| ln -fs %{_libdir}/%{appname}/%{appname} %{buildroot}%{_bindir}/%{appname} | |
| %post | |
| # 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 2>/dev/null ||: | |
| fi | |
| # Setup desktop file | |
| if command -v update-desktop-database >/dev/null 2>&1; then | |
| update-desktop-database -q /usr/share/applications 2>/dev/null ||: | |
| fi | |
| %postun | |
| # Remove compatibility symlinks | |
| if [ -e "%{_libdir}/%{appname}/lib/libudev.so.0" ]; then | |
| rm -f %{_libdir}/%{appname}/lib/libudev.so.0 | |
| fi | |
| if [ -e "%{_libdir}/%{appname}/lib/libcrypto.so.1.0.0" ]; then | |
| rm -f %{_libdir}/%{appname}/lib/libcrypto.so.1.0.0 | |
| fi | |
| # Remove directories left behind due to compatibility symlinks | |
| if [ -d "%{_libdir}/%{appname}/lib" ]; then | |
| rmdir --ignore-fail-on-non-empty %{_libdir}/%{appname}/lib | |
| fi | |
| if [ -d "%{_libdir}/%{appname}" ]; then | |
| rmdir --ignore-fail-on-non-empty %{_libdir}/%{appname} | |
| fi | |
| %clean | |
| rm -rf %{buildroot} | |
| %files | |
| %{_defaultdocdir}/%{name} | |
| %{_bindir}/%{appname} | |
| %{_libdir}/%{appname} | |
| %{_datadir}/applications/*.desktop | |
| %{_datadir}/icons/* | |
| %{_datadir}/pixmaps/* | |
| EOF | |
| echo "Repacking started. This may take a few minutes..." | |
| if ! rpmbuild -bb --define "_topdir ${repackdir}" "${repackdir}/SPECS/opera.spec" >"${repackdir}/rpm-build.log" 2>&1; then | |
| echo "Something went wrong with packaging." >&2 | |
| echo "Incomplete repack left in ${repackdir}" >&2 | |
| exit 1 | |
| fi | |
| rm -fr "${repackdir}" | |
| echo "Created: $outdir/$rpm" |
Hi.
I try now your script but looks like somethink is broken.
[x@localhost rpm-opera]$ ./rpm4opera --developer
--2015-10-25 18:40:09-- http://deb.opera.com/opera/pool/non-free/o/opera-developer/opera-developer_34.0.2026.0_amd64.deb
Translacja deb.opera.com (deb.opera.com)... 185.26.183.130
Łączenie się z deb.opera.com (deb.opera.com)|185.26.183.130|:80... połączono.
Żądanie HTTP wysłano, oczekiwanie na odpowiedź... 200 OK
Długość: 44951736 (43M) [application/x-debian-package]
Zapis do: `/tmp/opera-developer_34.0.2026.0_amd64.deb'
100%[=====================================>] 44.951.736 245KB/s w 2m 59s
2015-10-25 18:43:08 (245 KB/s) - zapisano `/tmp/opera-developer_34.0.2026.0_amd64.deb' [44951736/44951736]
Repacking started. This may take a few minutes...
Something went wrong with packaging.
Incomplete repack left in /tmp/opera_repack.UL6tkA
[x@localhost rpm-opera]$
Any solution or fix? :)
To correct this problem please add :
/usr/share/mime/packages/%{appname}.xml in %file section of the script , before EOF
or more correctly %{_datadir}/mime/packages/%{name}.xml
https://gist.github.com/digrix
As you have no doubt realised, this script is not maintained. I left Opera last year when the Opera desktop team in Oslo was shut down (development continues primarily with a team in Poland). Since I left all my Opera scripts are unmaintained and deprecated. If they work they work, if they don't they don't.
your
%postunscript is most likely buggy. i see typical mistake assuming%postunis invoked only when package is removed. but it's really executed each time old package is removed, thus, invoked on upgrades as well.you need to check for
$1to be0in case it is uninstall ($1contains number of remaining packages to system)although it's probably ok what you execute there now, but i suggest still to fix it:
or maybe just: