diff options
author | Allan McRae <allan@archlinux.org> | 2009-03-02 19:13:08 +0100 |
---|---|---|
committer | Dan McGee <dan@archlinux.org> | 2009-03-15 17:38:53 +0100 |
commit | a864a50bc6a65a5c39a4727a07a3b269049a808e (patch) | |
tree | 8f3332f39001a58062a1278a2dbbca4db7ceb959 | |
parent | d8d9ab8c870eb9f2df5e6e607b1da34e6e40e29e (diff) | |
download | pacman-a864a50bc6a65a5c39a4727a07a3b269049a808e.tar.gz pacman-a864a50bc6a65a5c39a4727a07a3b269049a808e.tar.xz |
contrib/pacscripts - print install scripts from a package
Prints the install script from a given package file or from a package
in the pacman repo.
Original-work-by: Giulio "giulivo" Fidente <giulivo.navigante@gmail.com>
Improvements-by: Xavier Chantry <shiningxc@gmail.com>
Signed-off-by: Allan McRae <allan@archlinux.org>
Signed-off-by: Dan McGee <dan@archlinux.org>
-rw-r--r-- | contrib/Makefile.am | 1 | ||||
-rw-r--r-- | contrib/README | 3 | ||||
-rwxr-xr-x | contrib/pacscripts | 132 |
3 files changed, 136 insertions, 0 deletions
diff --git a/contrib/Makefile.am b/contrib/Makefile.am index 2f131ef2..3843a3f0 100644 --- a/contrib/Makefile.am +++ b/contrib/Makefile.am @@ -5,6 +5,7 @@ EXTRA_DIST = \ gensync \ pacdiff \ paclist \ + pacscripts \ pacsearch \ pactree \ updatesync \ diff --git a/contrib/README b/contrib/README index 29962b47..0d2153b0 100644 --- a/contrib/README +++ b/contrib/README @@ -16,6 +16,9 @@ paclist - list all packages installed from a given repository. Useful for seeing which packages you may have installed from the testing repository, for instance. +pacscripts - tries to print out the {pre,post}_{install,remove,upgrade} +scripts of a given package. + pacsearch - a colorized search combining both -Ss and -Qs output. Installed packages are easily identified with a *** and local-only packages are also listed. diff --git a/contrib/pacscripts b/contrib/pacscripts new file mode 100755 index 00000000..101fb15f --- /dev/null +++ b/contrib/pacscripts @@ -0,0 +1,132 @@ +#!/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> +# +# 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 + +progname=$(basename $0) +progver="0.4" + +conf="/etc/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:-/var/lib/pacman}/local" +pac_cache="${CacheDir:-/var/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: $progname pkgname|pkgfile" + echo + echo " OPTIONS:" + echo " -h, --help Print this help message" + echo " -v, --version Print program name and version" + echo + echo "Example: $progname gconf-editor" + echo "Example: $progname gconf-editor-2.24.1-1-x86_64.pkg.tar.gz" +} + +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 -xOf "$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) echo "$progname version $progver"; exit 0 ;; + *) print_scriptlet $1 ;; +esac |