mirror of
https://github.com/moparisthebest/pacman
synced 2024-11-10 19:45:01 -05:00
85fde7038f
'-q' means "Exit as soon as each specified pattern or filename has been matched." There is no reason to keep reading the whole package from the cache when the install script has already been printed to stdout. Signed-off-by: Karol Błażewicz <karol.blazewicz at gmail.com> Signed-off-by: Allan McRae <allan@archlinux.org>
140 lines
3.3 KiB
Bash
140 lines
3.3 KiB
Bash
#!/bin/bash
|
|
#
|
|
# pacscripts : tries to print out the {pre,post}_{install,remove,upgrade}
|
|
# scripts of a given package
|
|
#
|
|
# Copyright (c) 2009 Giulio "giulivo" Fidente <giulivo.navigante@gmail.com>
|
|
# Copyright (c) 2009 Xavier Chantry <shiningxc@gmail.com>
|
|
# Copyright (c) 2009-2013 Pacman Development Team <pacman-dev@archlinux.org>
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 2 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
|
|
# bash options
|
|
set -o nounset
|
|
set -o errexit
|
|
|
|
declare -r myname='pacscripts'
|
|
declare -r myver='@PACKAGE_VERSION@'
|
|
|
|
conf="@sysconfdir@/pacman.conf"
|
|
|
|
if [ ! -r "$conf" ]; then
|
|
echo "ERROR: unable to read $conf"
|
|
exit 1
|
|
fi
|
|
|
|
eval $(awk '/DBPath/ {print $1$2$3}' "$conf")
|
|
eval $(awk '/CacheDir/ {print $1$2$3}' "$conf")
|
|
pac_db="${DBPath:-@localstatedir@/lib/pacman}/local"
|
|
pac_cache="${CacheDir:-@localstatedir@/cache/pacman/pkg}"
|
|
|
|
error() {
|
|
local mesg=$1; shift
|
|
printf "==> $(gettext "ERROR:") ${mesg}\n" "$@" >&2
|
|
}
|
|
|
|
usage() {
|
|
echo "This program prints out the {pre,post}_{install,remove,upgrade} scripts"
|
|
echo "of a given package."
|
|
echo "Usage: $myname pkgname|pkgfile"
|
|
echo
|
|
echo " OPTIONS:"
|
|
echo " -h, --help Print this help message"
|
|
echo " -v, --version Print program name and version"
|
|
echo
|
|
echo "Example: $myname gconf-editor"
|
|
echo "Example: $myname gconf-editor-2.24.1-1-x86_64.pkg.tar.gz"
|
|
}
|
|
|
|
version() {
|
|
printf "%s %s\n" "$myname" "$myver"
|
|
echo 'Copyright (c) 2009 Giulio "giulivo" Fidente <giulivo.navigante@gmail.com>'
|
|
echo 'Copyright (c) 2009 Xavier Chantry <shiningxc@gmail.com>'
|
|
}
|
|
|
|
spacman() {
|
|
if [ $EUID -eq 0 ]; then
|
|
pacman "$@"
|
|
else
|
|
if ! type -p sudo; then
|
|
error "Cannot find the sudo binary! Is sudo installed?"
|
|
error "Otherwise try to run the program as root"
|
|
exit 1
|
|
else
|
|
sudo pacman "$@"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
print_db() {
|
|
pkg=$(pacman -Q "$1")
|
|
pkg=${pkg/ /-}
|
|
if [ -f $pac_db/$pkg*/install ]; then
|
|
cat $pac_db/$pkg*/install
|
|
echo
|
|
return 0
|
|
else
|
|
error "Package $1 does not include any .INSTALL script"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
print_pkg() {
|
|
if ! bsdtar -xqOf "$1" .INSTALL 2>/dev/null; then
|
|
error "Package $1 does not include any .INSTALL script"
|
|
return 1
|
|
fi
|
|
echo
|
|
}
|
|
|
|
print_scriptlet() {
|
|
if [ -f "$1" ]; then
|
|
if bsdtar tf "$1" .PKGINFO &>/dev/null; then
|
|
print_pkg "$1"
|
|
return
|
|
fi
|
|
fi
|
|
if pacman -Q "$1" &>/dev/null; then
|
|
print_db "$1"
|
|
return
|
|
fi
|
|
if ! pacman -Si $1 &>/dev/null; then
|
|
error "Package $1 not found"
|
|
return 1
|
|
fi
|
|
url=$(spacman -Sdp $1 | tail -n1)
|
|
filename=$(basename $url)
|
|
if [ ! -f "$pac_cache/$filename" ]; then
|
|
if ! spacman -Sdw --noconfirm $1 >&2; then
|
|
error "Failed to download $1"
|
|
return 1
|
|
fi
|
|
echo >&2
|
|
fi
|
|
print_pkg "$pac_cache/$filename"
|
|
return
|
|
}
|
|
|
|
if [ $# -ne 1 ] ; then
|
|
usage
|
|
exit 1
|
|
fi
|
|
|
|
case "$1" in
|
|
--help|-h) usage; exit 0 ;;
|
|
--version|-V) version; exit 0 ;;
|
|
*) print_scriptlet $1 ;;
|
|
esac
|