summaryrefslogtreecommitdiff
path: root/contrib
diff options
context:
space:
mode:
Diffstat (limited to 'contrib')
-rw-r--r--contrib/.gitignore2
-rw-r--r--contrib/Makefile.am98
-rw-r--r--contrib/PKGBUILD.vim52
-rw-r--r--[-rwxr-xr-x]contrib/bacman.sh.in (renamed from contrib/bacman.in)29
-rw-r--r--contrib/bash_completion.in66
-rw-r--r--[-rwxr-xr-x]contrib/paccache.sh.in (renamed from contrib/paccache.in)149
-rw-r--r--[-rwxr-xr-x]contrib/pacdiff.sh.in (renamed from contrib/pacdiff.in)22
-rw-r--r--[-rwxr-xr-x]contrib/paclist.sh.in (renamed from contrib/paclist.in)29
-rw-r--r--[-rwxr-xr-x]contrib/paclog-pkglist.sh.in (renamed from contrib/paclog-pkglist.in)21
-rw-r--r--[-rwxr-xr-x]contrib/pacscripts.sh.in (renamed from contrib/pacscripts.in)18
-rw-r--r--[-rwxr-xr-x]contrib/pacsearch.in26
-rwxr-xr-xcontrib/pacsysclean.in53
-rw-r--r--contrib/pacsysclean.sh.in64
-rw-r--r--contrib/rankmirrors.sh.in212
-rwxr-xr-xcontrib/updpkgsums.sh.in93
-rw-r--r--contrib/zsh_completion.in211
16 files changed, 923 insertions, 222 deletions
diff --git a/contrib/.gitignore b/contrib/.gitignore
index 70d19093..afbca0fb 100644
--- a/contrib/.gitignore
+++ b/contrib/.gitignore
@@ -7,4 +7,6 @@ paclog-pkglist
pacscripts
pacsearch
pacsysclean
+rankmirrors
+updpkgsums
zsh_completion
diff --git a/contrib/Makefile.am b/contrib/Makefile.am
index a7dee54f..3641a085 100644
--- a/contrib/Makefile.am
+++ b/contrib/Makefile.am
@@ -1,12 +1,26 @@
-OURSCRIPTS = \
+# enforce that all scripts have a --help and --version option
+AUTOMAKE_OPTIONS = std-options
+
+bin_SCRIPTS = \
+ $(OURSCRIPTS)
+
+BASHSCRIPTS = \
bacman \
paccache \
pacdiff \
paclist \
paclog-pkglist \
pacscripts \
- pacsearch \
- pacsysclean
+ pacsysclean \
+ rankmirrors \
+ updpkgsums
+
+OTHERSCRIPTS = \
+ pacsearch
+
+OURSCRIPTS = \
+ $(BASHSCRIPTS) \
+ $(OTHERSCRIPTS)
OURFILES = \
bash_completion \
@@ -14,15 +28,17 @@ OURFILES = \
EXTRA_DIST = \
PKGBUILD.vim \
- bacman.in \
+ bacman.sh.in \
bash_completion.in \
- paccache.in \
- paclog-pkglist.in \
- pacdiff.in \
- paclist.in \
- pacscripts.in \
+ paccache.sh.in \
+ paclog-pkglist.sh.in \
+ pacdiff.sh.in \
+ paclist.sh.in \
+ pacscripts.sh.in \
pacsearch.in \
- pacsysclean.in \
+ pacsysclean.sh.in \
+ rankmirrors.sh.in
+ updpkgsums.sh.in \
vimprojects \
zsh_completion.in \
README
@@ -30,38 +46,62 @@ EXTRA_DIST = \
# Files that should be removed, but which Automake does not know.
MOSTLYCLEANFILES = $(OURSCRIPTS) $(OURFILES) *.tmp
+if USE_GIT_VERSION
+GIT_VERSION := $(shell sh -c 'git describe --abbrev=4 --dirty | sed s/^v//')
+REAL_PACKAGE_VERSION = $(GIT_VERSION)
+else
+REAL_PACKAGE_VERSION = $(PACKAGE_VERSION)
+endif
+
edit = sed \
-e 's|@sysconfdir[@]|$(sysconfdir)|g' \
-e 's|@localstatedir[@]|$(localstatedir)|g' \
+ -e 's|@PACKAGE_VERSION[@]|$(REAL_PACKAGE_VERSION)|g' \
-e 's|@SIZECMD[@]|$(SIZECMD)|g' \
+ -e 's|@SCRIPTNAME[@]|$@|g' \
-e '1s|!/bin/bash|!$(BASH_SHELL)|g'
-$(OURSCRIPTS): Makefile
- @echo ' ' GEN $@;
- @$(RM) $@ $@.tmp
- @$(edit) $(srcdir)/$@.in >$@.tmp
- @chmod +x $@.tmp
- @chmod a-w $@.tmp
- @mv $@.tmp $@
+$(OTHERSCRIPTS): Makefile
+ $(AM_V_at)$(RM) $@ $@.tmp
+ $(AM_V_GEN)$(edit) $(srcdir)/$@.in >$@.tmp
+ $(AM_V_at)chmod +x,a-w $@.tmp
+ $(AM_V_at)mv $@.tmp $@
+
+$(BASHSCRIPTS): Makefile
+ $(AM_V_at)$(RM) $@
+ $(AM_V_GEN)test -f $(srcdir)/$@.sh.in && m4 -P -I $(srcdir) $(srcdir)/$@.sh.in | $(edit) >$@
+ $(AM_V_at)chmod +x,a-w $@
+ @$(BASH_SHELL) -O extglob -n $@
$(OURFILES): Makefile
- @echo ' ' GEN $@;
- @$(RM) $@ $@.tmp
- @$(edit) $(srcdir)/$@.in >$@.tmp
- @chmod a-w $@.tmp
- @mv $@.tmp $@
+ $(AM_V_at)$(RM) $@ $@.tmp
+ $(AM_V_GEN)$(edit) $(srcdir)/$@.in >$@.tmp
+ $(AM_V_at)chmod a-w $@.tmp
+ $(AM_V_at)mv $@.tmp $@
all-am: $(OURSCRIPTS) $(OURFILES)
-bacman: $(srcdir)/bacman.in
+install-data-local:
+ $(MKDIR_P) $(DESTDIR)$(sysconfdir)/bash_completion.d/
+ $(INSTALL_DATA) bash_completion $(DESTDIR)$(sysconfdir)/bash_completion.d/pacman
+ $(MKDIR_P) $(DESTDIR)$(datarootdir)/zsh/site-functions/
+ $(INSTALL_DATA) zsh_completion $(DESTDIR)$(datarootdir)/zsh/site-functions/_pacman
+
+uninstall-local:
+ $(RM) $(DESTDIR)$(sysconfdir)/bash_completion.d/pacman
+ $(RM) $(DESTDIR)$(datarootdir)/zsh/site-functions/_pacman
+
+bacman: $(srcdir)/bacman.sh.in
bash_completion: $(srcdir)/bash_completion.in
-paccache: $(srcdir)/paccache.in
-pacdiff: $(srcdir)/pacdiff.in
-paclist: $(srcdir)/paclist.in
-paclog-pkglist: $(srcdir)/paclog-pkglist.in
-pacscripts: $(srcdir)/pacscripts.in
+paccache: $(srcdir)/paccache.sh.in $(top_srcdir)/scripts/library/parseopts.sh $(top_srcdir)/scripts/library/size_to_human.sh
+pacdiff: $(srcdir)/pacdiff.sh.in
+paclist: $(srcdir)/paclist.sh.in
+paclog-pkglist: $(srcdir)/paclog-pkglist.sh.in
+pacscripts: $(srcdir)/pacscripts.sh.in
pacsearch: $(srcdir)/pacsearch.in
-pacsysclean: $(srcdir)/pacsysclean.in
+pacsysclean: $(srcdir)/pacsysclean.sh.in
+rankmirrors: $(srcdir)/rankmirrors.sh.in
+updpkgsums: $(srcdir)/updpkgsums.sh.in
zsh_completion: $(srcdir)/zsh_completion.in
# vim:set ts=2 sw=2 noet:
diff --git a/contrib/PKGBUILD.vim b/contrib/PKGBUILD.vim
index 4d69e4d9..91570637 100644
--- a/contrib/PKGBUILD.vim
+++ b/contrib/PKGBUILD.vim
@@ -69,8 +69,8 @@ syn match pbUrlGroup /^url=.*/ contains=pbValidUrl,pb_k_url,pbIllegalUrl,shDoubl
" license
syn keyword pb_k_license license contained
" echo $(pacman -Ql licenses | grep '/usr/share/licenses/common/' | cut -d'/' -f6 | sort -u)
-syn keyword pbLicense APACHE CCPL CDDL CPL EPL FDL FDL1.2 FDL1.3 GPL GPL2 GPL3 LGPL LGPL2.1 LGPL3 LPPL MPL PerlArtistic PHP PSF RALINK RUBY ZPL contained
-" special cases from http://wiki.archlinux.org/index.php/Arch_Packaging_Standards
+syn keyword pbLicense AGPL AGPL3 Apache APACHE Artistic2.0 CCPL CDDL CPL EPL FDL FDL1.2 FDL1.3 GPL GPL2 GPL3 LGPL LGPL2.1 LGPL3 LPPL MPL PerlArtistic PHP PSF RUBY W3C ZPL contained
+" special cases from https://wiki.archlinux.org/index.php/Arch_Packaging_Standards
syn keyword pbLicenseSpecial BSD MIT ZLIB Python contained
syn match pbLicenseCustom /custom\(:[[:alnum:]]*\)*/ contained
syn match pbIllegalLicense /[^='"() ]/ contained contains=pbLicenseCustom,pbLicenseSpecial,pbLicense
@@ -108,7 +108,7 @@ syn match pbValidOptdepends /\([[:alnum:]]\|+\|-\|_\)*/ contained
syn region pbOptdependsGroup start=/^optdepends=(/ end=/)/ contains=pb_k_optdepends,pbValidOptdepends,shDoubleQuote,shSingleQuote
" checkdepends
-syn keyword pb_k_ckdepends ckdepends contained
+syn keyword pb_k_ckdepends checkdepends contained
syn match pbValidCkdepends /\([[:alnum:]]\|+\|-\|_\)*/ contained
syn region pbCkdependsGroup start=/^checkdepends=(/ end=/)/ contains=pb_k_ckdepends,pbValidCkdepends,shDoubleQuote,shSingleQuote
@@ -176,12 +176,45 @@ hi def link pbSha1Quotes Keyword
hi def link pbSha1Hash Error
hi def link pbValidSha1sums Number
+" sha256sums
+syn keyword pb_k_sha256sums sha256sums contained
+syn match pbIllegalSha256sums /[^='"()\/ ]/ contained contains=pbValidSha256sums
+syn match pbValidSha256sums /\x\{64\}/ contained
+syn region pbSha256sumsGroup start=/^sha256sums/ end=/)/ contains=pb_k_sha256sums,pbSha256Quotes,pbSha256Hash,pbIllegalSha256sums keepend
+syn match pbSha256Quotes /'.*'\|".*"/ contained contains=pbSha256Hash,pbIllegalSha256sums
+syn match pbSha256Hash /\x\+/ contained contains=pbValidSha256sums
+hi def link pbSha256Quotes Keyword
+hi def link pbSha256Hash Error
+hi def link pbValidSha256sums Number
+
+" sha384sums
+syn keyword pb_k_sha384sums sha384sums contained
+syn match pbIllegalSha384sums /[^='"()\/ ]/ contained contains=pbValidSha384sums
+syn match pbValidSha384sums /\x\{96\}/ contained
+syn region pbSha384sumsGroup start=/^sha384sums/ end=/)/ contains=pb_k_sha384sums,pbSha384Quotes,pbSha384Hash,pbIllegalSha384sums keepend
+syn match pbSha384Quotes /'.*'\|".*"/ contained contains=pbSha384Hash,pbIllegalSha384sums
+syn match pbSha384Hash /\x\+/ contained contains=pbValidSha384sums
+hi def link pbSha384Quotes Keyword
+hi def link pbSha384Hash Error
+hi def link pbValidSha384sums Number
+
+" sha512sums
+syn keyword pb_k_sha512sums sha512sums contained
+syn match pbIllegalSha512sums /[^='"()\/ ]/ contained contains=pbValidSha512sums
+syn match pbValidSha512sums /\x\{128\}/ contained
+syn region pbSha512sumsGroup start=/^sha512sums/ end=/)/ contains=pb_k_sha512sums,pbSha512Quotes,pbSha512Hash,pbIllegalSha512sums keepend
+syn match pbSha512Quotes /'.*'\|".*"/ contained contains=pbSha512Hash,pbIllegalSha512sums
+syn match pbSha512Hash /\x\+/ contained contains=pbValidSha512sums
+hi def link pbSha512Quotes Keyword
+hi def link pbSha512Hash Error
+hi def link pbValidSha512sums Number
+
" options
syn keyword pb_k_options options contained
-syn match pbOptions /\(no\)\?\(strip\|docs\|libtool\|emptydirs\|zipman\|ccache\|distcc\|makeflags\|buildflags\)/ contained
+syn match pbOptions /\(no\)\?\(strip\|docs\|libtool\|emptydirs\|zipman\|purge\|upx\|fakeroot\|distcc\|color\|ccache\|check\|sign\|makeflags\|buildflags\)/ contained
syn match pbOptionsNeg /\!/ contained
syn match pbOptionsDeprec /no/ contained
-syn region pbOptionsGroup start=/^options=(/ end=/)/ contains=pb_k_options,pbOptions,pbOptionsNeg,pbOptionsDeprec,pbIllegalOption,shDoubleQuote,shSingleQuote
+syn region pbOptionsGroup start=/^options=(/ end=/)/ contains=pb_k_options,pbOptions,pbOptionsNeg,pbOptionsDeprec,pbIllegalOption
syn match pbIllegalOption /[^!"'()= ]/ contained contains=pbOptionsDeprec,pbOptions
" noextract
@@ -258,6 +291,15 @@ hi def link pbIllegalMd5sums Error
hi def link pb_k_sha1sums pbKeywords
hi def link pbIllegalSha1sums Error
+hi def link pb_k_sha256sums pbKeywords
+hi def link pbIllegalSha256sums Error
+
+hi def link pb_k_sha384sums pbKeywords
+hi def link pbIllegalSha384sums Error
+
+hi def link pb_k_sha512sums pbKeywords
+hi def link pbIllegalSha512sums Error
+
hi def link pb_k_options pbKeywords
hi def link pbOptionsDeprec Todo
hi def link pbIllegalOption Error
diff --git a/contrib/bacman.in b/contrib/bacman.sh.in
index f7e3202f..7895a40c 100755..100644
--- a/contrib/bacman.in
+++ b/contrib/bacman.sh.in
@@ -24,16 +24,21 @@
shopt -s extglob
shopt -s nullglob
-readonly progname="bacman"
-readonly progver="0.2.1"
+declare -r myname='bacman'
+declare -r myver='@PACKAGE_VERSION@'
#
# User Friendliness
#
usage() {
echo "This program recreates a package using pacman's db and system files"
- echo "Usage: $progname <installed package name>"
- echo "Example: $progname kernel26"
+ echo "Usage: $myname <installed package name>"
+ echo "Example: $myname kernel26"
+}
+
+version() {
+ printf "%s %s\n" "$myname" "$myver"
+ echo 'Copyright (C) 2008 locci <carlocci_at_gmail_dot_com>'
}
if (( $# != 1 )); then
@@ -41,14 +46,11 @@ if (( $# != 1 )); then
exit 1
fi
-if [[ $1 == "--help" || $1 == "-h" ]]; then
+if [[ $1 = -@(h|-help) ]]; then
usage
exit 0
-fi
-
-if [[ $1 == "--version" || $1 == "-v" ]]; then
- echo "$progname version $progver"
- echo "Copyright (C) 2008 locci"
+elif [[ $1 = -@(V|-version) ]]; then
+ version
exit 0
fi
@@ -62,7 +64,7 @@ if (( EUID )); then
/usr/bin/fakeroot -u -- "$0" "$@"
exit $?
else
- echo "WARNING: installing fakeroot or running ${progname} as root is required to"
+ echo "WARNING: installing fakeroot or running $myname as root is required to"
echo " preserve the ownership permissions of files in some packages"
echo ""
fi
@@ -151,7 +153,7 @@ while read i; do
echo ""
echo "ERROR: unable to add /$i to the package"
echo " If your user does not have permssion to read this file then"
- echo " you will need to run $progname as root"
+ echo " you will need to run $myname as root"
rm -rf "$work_dir"
exit 1
fi
@@ -177,7 +179,7 @@ pkg_size=$(du -sk | awk '{print $1 * 1024}')
# TODO adopt makepkg's write_pkginfo() into this or scripts/library
#
echo Generating .PKGINFO metadata...
-echo "# Generated by $progname $progver" > .PKGINFO
+echo "# Generated by $myname $myver" > .PKGINFO
if [[ $INFAKEROOT == "1" ]]; then
echo "# Using $(fakeroot -v)" >> .PKGINFO
fi
@@ -303,4 +305,3 @@ echo Done
exit 0
# vim: set ts=2 sw=2 noet:
-
diff --git a/contrib/bash_completion.in b/contrib/bash_completion.in
index 8983c92b..b0901af2 100644
--- a/contrib/bash_completion.in
+++ b/contrib/bash_completion.in
@@ -27,17 +27,44 @@ _arch_incomp() {
local r="\s-(-${1#* }\s|\w*${1% *})"; [[ $COMP_LINE =~ $r ]]
}
+_pacman_keyids() {
+ \pacman-key --list-keys 2>/dev/null | awk '
+ $1 == "pub" {
+ # key id
+ split($2, a, "/"); print a[2]
+ }
+ $1 == "uid" {
+ # email
+ if (match($NF, /<[^>]+>/))
+ print substr($NF, RSTART + 1, RLENGTH - 2)
+ }'
+}
+
_pacman_key() {
- local cur opts prev
+ local o cur opts prev wantfiles
COMPREPLY=()
_get_comp_words_by_ref cur prev
- if [[ $cur = -* &&
- $prev != -@(a|-add|c|-config|g|-gpgdir|h|-help|import?(-trustdb)) ]]; then
- opts=('add delete export finger help list-keys recv-keys updatedb verify version
- config edit-key gpgdir import import-trustdb init keyserver list-sigs
- lsign-key populate refresh-keys'
- 'a d e f h l r u v V')
+ opts=('add delete export finger help list-keys recv-keys updatedb verify
+ version config edit-key gpgdir import import-trustdb init keyserver
+ list-sigs lsign-key populate refresh-keys'
+ 'a d e f h l r u v V')
+
+ # operations for which we want to complete keyids
+ for o in 'd delete' 'e export' 'f finger' 'l list-keys' 'r recv-keys' \
+ 'edit-key' 'list-sigs' 'refresh-keys'; do
+ _arch_incomp "$o" && break
+ unset o
+ done
+
+ # options for which we want file completion
+ wantfiles='-@(c|-config|g|-gpgdir)'
+
+ if [[ $prev = 'pacman-key' || ( $cur = -* && $prev != $wantfiles ) ]]; then
_arch_ptr2comp opts
+ elif [[ $prev = @(-k|--keyserver) ]]; then
+ return
+ elif [[ $prev != $wantfiles && $o ]]; then
+ COMPREPLY=($(compgen -W '$(_pacman_keyids)' -- "$cur"))
fi
true
}
@@ -47,9 +74,9 @@ _makepkg() {
COMPREPLY=()
_get_comp_words_by_ref cur prev
if [[ $cur = -* && ! $prev =~ ^-(-(config|help)$|\w*[Chp]) ]]; then
- opts=('allsource asroot check clean config force geninteg help holdver ignorearch
- install log nobuild nocheck nocolor noconfirm nodeps noextract noprogressbar
- nosign pkg repackage rmdeps sign skipinteg source syncdeps'
+ opts=('allsource asdeps asroot check clean config force geninteg help holdver ignorearch
+ install log nobuild nocheck nocolor noconfirm nodeps noextract
+ noprogressbar nosign pkg repackage rmdeps sign skipinteg source syncdeps'
'A L R S c d e f g h i m o p r s')
_arch_ptr2comp opts
fi
@@ -76,8 +103,8 @@ _pacman() {
remove=('cascade dbonly nodeps nosave print recursive unneeded' 'c n p s u')
sync=('asdeps asexplicit clean dbonly downloadonly force groups ignore ignoregroup
info list needed nodeps print refresh recursive search sysupgrade'
- 'c f g i l p s u w y')
- upgrade=('asdeps asexplicit force needed nodeps print recursive' 'f p')
+ 'c g i l p s u w y')
+ upgrade=('asdeps asexplicit force needed nodeps print recursive' 'p')
common=('arch cachedir config dbpath debug help logfile noconfirm
noprogressbar noscriptlet quiet root verbose' 'b d h q r v')
core=('database help query remove sync upgrade version' 'D Q R S U V h')
@@ -111,18 +138,11 @@ _pacman() {
true
}
-if [[ $(type -t compopt) = "builtin" ]]; then
- _pacman_file() {
- compopt -o filenames; _filedir 'pkg.tar*'
- }
- complete -F _pacman -o default pacman
-else
- _pacman_file() {
- _filedir 'pkg.tar*'
- }
- complete -F _pacman -o filenames -o default pacman
-fi
+_pacman_file() {
+ compopt -o filenames; _filedir 'pkg.tar*'
+}
+complete -F _pacman -o default pacman
complete -F _makepkg -o default makepkg
complete -F _pacman_key -o default pacman-key
diff --git a/contrib/paccache.in b/contrib/paccache.sh.in
index a9e5bfbc..e8136559 100755..100644
--- a/contrib/paccache.in
+++ b/contrib/paccache.sh.in
@@ -20,6 +20,9 @@
shopt -s extglob
+declare -r myname='paccache'
+declare -r myver='@PACKAGE_VERSION@'
+
declare -a candidates=() cmdopts=() whitelist=() blacklist=()
declare -i delete=0 dryrun=0 filecount=0 move=0 needsroot=0 totalsaved=0 verbose=0
declare cachedir=@localstatedir@/cache/pacman/pkg delim=$'\n' keep=3 movedir= scanarch=
@@ -39,6 +42,8 @@ die() {
exit 1
}
+m4_include(../scripts/library/parseopts.sh)
+
# reads a list of files on stdin and prints out deletion candidates
pkgfilter() {
# there's whitelist and blacklist parameters passed to this
@@ -103,29 +108,10 @@ pkgfilter() {
}' "${@:3}"
}
-size_to_human() {
- awk -v size="$1" '
- BEGIN {
- suffix[1] = "B"
- suffix[2] = "KiB"
- suffix[3] = "MiB"
- suffix[4] = "GiB"
- suffix[5] = "TiB"
- count = 1
-
- while (size > 1024) {
- size /= 1024
- count++
- }
-
- sizestr = sprintf("%.2f", size)
- sub(/\.?0+$/, "", sizestr)
- printf("%s %s", sizestr, suffix[count])
- }'
-}
+m4_include(../scripts/library/size_to_human.sh)
runcmd() {
- if (( needsroot )); then
+ if (( needsroot && EUID != 0 )); then
msg "Privilege escalation required"
if sudo -v &>/dev/null && sudo -l &>/dev/null; then
sudo "$@"
@@ -174,70 +160,101 @@ summarize() {
usage() {
cat <<EOF
-usage: ${0##*/} <operation> [options] [targets...]
+usage: $myname <operation> [options] [targets...]
-${0##*/} is a flexible pacman cache cleaning utility, which has numerous
+$myname is a flexible pacman cache cleaning utility, which has numerous
options to help control how much, and what, is deleted from any directory
containing pacman package tarballs.
Operations:
- -d perform a dry run, only finding candidate packages.
- -m <movedir> move candidate packages to 'movedir'.
- -r remove candidate packages.
+ -d, --dryrun perform a dry run, only finding candidate packages.
+ -m, --move <dir> move candidate packages to 'movedir'.
+ -r, --remove remove candidate packages.
Options:
- -a <arch> scan for 'arch' (default: all architectures).
- -c <cachedir> scan 'cachedir' for packages (default: @localstatedir@/cache/pacman/pkg).
- -f apply force to mv(1) and rm(1) operations.
- -h display this help message.
- -i <pkgs> ignore 'pkgs', which is a comma separated. Alternatively,
- specify '-' to read package names from stdin, newline delimited.
- -k <num> keep 'num' of each package in 'cachedir' (default: 3).
- -u target uninstalled packages.
- -v increase verbosity. specify up to 3 times.
- -z use null delimiters for candidate names (only with -v and -vv)
+ -a, --arch <arch> scan for 'arch' (default: all architectures).
+ -c, --cachedir <dir> scan 'cachedir' for packages (default: @localstatedir@/cache/pacman/pkg).
+ -f, --force apply force to mv(1) and rm(1) operations.
+ -h, --help display this help message and exit.
+ -i, --ignore <pkgs> ignore 'pkgs', comma separated. Alternatively, specify '-' to
+ read package names from stdin, newline delimited.
+ -k, --keep <num> keep 'num' of each package in 'cachedir' (default: 3).
+ -u, --uninstalled target uninstalled packages.
+ -v, --verbose increase verbosity. specify up to 3 times.
+ -z, --null use null delimiters for candidate names (only with -v and -vv)
EOF
}
-if (( ! UID )); then
- error "Do not run this script as root. You will be prompted for privilege escalation."
- exit 42
-fi
+version() {
+ printf "%s %s\n" "$myname" "$myver"
+ echo 'Copyright (C) 2011 Dave Reisner <dreisner@archlinux.org>'
+}
+
+OPT_SHORT=':a:c:dfhi:k:m:rsuVvz'
+OPT_LONG=('arch:' 'cachedir:' 'dryrun' 'force' 'help' 'ignore:' 'keep:' 'move'
+ 'remove' 'uninstalled' 'version' 'verbose' 'null')
-while getopts ':a:c:dfhi:k:m:rsuvz' opt; do
- case $opt in
- a) scanarch=$OPTARG ;;
- c) cachedir=$OPTARG ;;
- d) dryrun=1 ;;
- f) cmdopts=(-f) ;;
- h) usage
+if ! parseopts "$OPT_SHORT" "${OPT_LONG[@]}" -- "$@"; then
+ exit 1
+fi
+set -- "${OPTRET[@]}"
+unset OPT_SHORT OPT_LONG OPTRET
+
+while :; do
+ case $1 in
+ -a|--arch)
+ scanarch=$2
+ shift ;;
+ -c|--cachedir)
+ cachedir=$2
+ shift ;;
+ -d|--dryrun)
+ dryrun=1 ;;
+ -f|--force)
+ cmdopts=(-f) ;;
+ -h|--help)
+ usage
exit 0 ;;
- i) if [[ $OPTARG = '-' ]]; then
- [[ ! -t 0 ]] && IFS=$'\n' read -r -d '' -a ign
- else
- IFS=',' read -r -a ign <<< "$OPTARG"
- fi
- blacklist+=("${ign[@]}")
- unset i ign ;;
- k) keep=$OPTARG
+ -i|--ignore)
+ if [[ $2 = '-' ]]; then
+ [[ ! -t 0 ]] && IFS=$'\n' read -r -d '' -a ign
+ else
+ IFS=',' read -r -a ign <<< "$2"
+ fi
+ blacklist+=("${ign[@]}")
+ unset i ign
+ shift ;;
+ -k|--keep)
+ keep=$2
if [[ -z $keep || -n ${keep//[0-9]/} ]]; then
die 'argument to option -k must be a non-negative integer'
else
keep=$(( 10#$keep ))
- fi ;;
- m) move=1 movedir=$OPTARG ;;
- r) delete=1 ;;
- u) IFS=$'\n' read -r -d '' -a ign < <(pacman -Qq)
- blacklist+=("${ign[@]}")
- unset ign ;;
- v) (( ++verbose )) ;;
- z) delim='\0' ;;
- :) die "option '--%s' requires an argument" "$OPTARG" ;;
- ?) die "invalid option -- '%s'" "$OPTARG" ;;
+ fi
+ shift ;;
+ -m|--move)
+ move=1 movedir=$2
+ shift ;;
+ -r|--remove)
+ delete=1 ;;
+ -u|--uninstalled)
+ IFS=$'\n' read -r -d '' -a ign < <(pacman -Qq)
+ blacklist+=("${ign[@]}")
+ unset ign ;;
+ -V|--version)
+ version
+ exit 0 ;;
+ -v|--verbose)
+ (( ++verbose )) ;;
+ -z|--null)
+ delim='\0' ;;
+ --)
+ shift
+ break 2 ;;
esac
+ shift
done
-shift $(( OPTIND - 1 ))
# remaining args are a whitelist
whitelist=("$@")
diff --git a/contrib/pacdiff.in b/contrib/pacdiff.sh.in
index 3f26f381..bfafda26 100755..100644
--- a/contrib/pacdiff.in
+++ b/contrib/pacdiff.sh.in
@@ -17,17 +17,25 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
+declare -r myname='pacdiff'
+declare -r myver='@PACKAGE_VERSION@'
+
diffprog=${DIFFPROG:-vimdiff}
diffsearchpath=${DIFFSEARCHPATH:-/etc}
locate=0
usage() {
- echo "pacdiff : a simple pacnew/pacorig/pacsave updater"
- echo "Usage : pacdiff [-l]"
- echo " -l/--locate makes pacdiff use locate rather than find"
+ echo "$myname : a simple pacnew/pacorig/pacsave updater"
+ echo "Usage : $myname [-l]"
+ echo " -l/--locate makes $myname use locate rather than find"
echo " DIFFPROG variable allows to override the default vimdiff"
echo " DIFFSEARCHPATH allows to override the default /etc path"
- echo "Example : DIFFPROG=meld DIFFSEARCHPATH=\"/boot /etc /usr\" pacdiff"
+ echo "Example : DIFFPROG=meld DIFFSEARCHPATH=\"/boot /etc /usr\" $myname"
+}
+
+version() {
+ printf "%s %s\n" "$myname" "$myver"
+ echo 'Copyright (C) 2007 Aaron Griffin <aaronmgriffin@gmail.com>'
}
cmd() {
@@ -42,8 +50,12 @@ if [ $# -gt 0 ]; then
case $1 in
-l|--locate)
locate=1;;
- *)
+ -V|--version)
+ version; exit 0;;
+ -h|--help)
usage; exit 0;;
+ *)
+ usage; exit 1;;
esac
fi
diff --git a/contrib/paclist.in b/contrib/paclist.sh.in
index 06b06f2c..7883e21b 100755..100644
--- a/contrib/paclist.in
+++ b/contrib/paclist.sh.in
@@ -17,6 +17,9 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
+declare -r myname='paclist'
+declare -r myver='@PACKAGE_VERSION@'
+
export TEXTDOMAIN='pacman'
export TEXTDOMAINDIR='/usr/share/locale'
@@ -27,13 +30,31 @@ if ! type gettext &>/dev/null; then
}
fi
-if [[ -z $1 || $1 = -@(h|-help) ]]; then
- printf '%s - List all packages installed from a given repo\n' "${0##*/}"
- printf 'Usage: %s <repo>\n' "${0##*/}"
- printf 'Example: %s testing\n' "${0##*/}"
+usage() {
+ printf '%s - List all packages installed from a given repo\n' "$myname"
+ printf 'Usage: %s <repo>\n' "$myname"
+ printf 'Example: %s testing\n' "$myname"
+}
+
+version() {
+ printf "%s %s\n" "$myname" "$myver"
+ echo 'Copyright (C) 2008 Dan McGee <dpmcgee@gmail.com>'
+ echo 'Copyright (C) 2011 Dave Reisner <dreisner@archlinux.org>'
+}
+
+if [[ -z $1 ]]; then
+ usage
exit 1
fi
+if [[ $1 = -@(h|-help) ]]; then
+ usage
+ exit 0
+elif [[ $1 = -@(V|-version) ]]; then
+ version
+ exit 0
+fi
+
printf -v installed '[%s]' "$(gettext installed)"
pacman -Sl $1 | awk -v i="$installed" '$NF == i { print $2,$3 }'
diff --git a/contrib/paclog-pkglist.in b/contrib/paclog-pkglist.sh.in
index 27dfd302..222bbc4c 100755..100644
--- a/contrib/paclog-pkglist.in
+++ b/contrib/paclog-pkglist.sh.in
@@ -17,15 +17,30 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
+declare -r myname='paclog-pkglist'
+declare -r myver='@PACKAGE_VERSION@'
+
export TEXTDOMAIN='pacman'
export TEXTDOMAINDIR='/usr/share/locale'
declare logfile=${1:-@localstatedir@/log/pacman.log}
+usage() {
+ printf 'usage: %s [pacman log]\n' "$myname"
+ printf 'example: %s @localstatedir@/log/pacman.log\n' "$myname"
+ printf '\ndefaults to: @localstatedir@/log/pacman.log\n'
+}
+
+version() {
+ printf "%s %s\n" "$myname" "$myver"
+ echo 'Copyright (C) 2011 Dave Reisner <dave@archlinux.org>'
+}
+
if [[ $1 ]]; then
if [[ $1 = -@(h|-help) ]]; then
- printf 'usage: %s [pacman log]\n' "${0##*/}"
- printf 'example: %s @localstatedir@/log/pacman.log\n' "${0##*/}"
- printf '\ndefaults to: @localstatedir@/log/pacman.log\n'
+ usage
+ exit 0
+ elif [[ $1 = -@(V|-version) ]]; then
+ version
exit 0
elif [[ ! -e $logfile ]]; then
printf $"target not found: %s\n" "$1"
diff --git a/contrib/pacscripts.in b/contrib/pacscripts.sh.in
index 37d3feae..84687145 100755..100644
--- a/contrib/pacscripts.in
+++ b/contrib/pacscripts.sh.in
@@ -24,8 +24,8 @@
set -o nounset
set -o errexit
-progname=$(basename $0)
-progver="0.4"
+declare -r myname='pacscripts'
+declare -r myver='@PACKAGE_VERSION@'
conf="@sysconfdir@/pacman.conf"
@@ -47,14 +47,20 @@ error() {
usage() {
echo "This program prints out the {pre,post}_{install,remove,upgrade} scripts"
echo "of a given package."
- echo "Usage: $progname pkgname|pkgfile"
+ 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: $progname gconf-editor"
- echo "Example: $progname gconf-editor-2.24.1-1-x86_64.pkg.tar.gz"
+ 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() {
@@ -127,6 +133,6 @@ fi
case "$1" in
--help|-h) usage; exit 0 ;;
- --version|-v) echo "$progname version $progver"; exit 0 ;;
+ --version|-V) version; exit 0 ;;
*) print_scriptlet $1 ;;
esac
diff --git a/contrib/pacsearch.in b/contrib/pacsearch.in
index db9d6ad1..b1db8abe 100755..100644
--- a/contrib/pacsearch.in
+++ b/contrib/pacsearch.in
@@ -24,22 +24,32 @@
use strict;
use warnings;
-my $progname = "pacsearch";
-my $version = "2.0";
+my $myname = 'pacsearch';
+my $myver = '@PACKAGE_VERSION@';
+
+sub usage {
+ print "$myname - Add color and install information to a pacman -Ss search\n";
+ print "Usage: $myname <pattern>\n";
+ print "Example: $myname ^gnome\n";
+}
+
+sub version {
+ printf "%s %s\n", $myname, $myver;
+ print "Copyright (C) 2008-2011 Dan McGee <dan\@archlinux.org>\n\n";
+ print "Based off original shell script version:\n";
+ print "Copyright (C) 2006-2007 Dan McGee <dan\@archlinux.org>\n";
+}
if ($#ARGV lt 0 || $ARGV[0] eq "--help" || $ARGV[0] eq "-h") {
- print "$progname - Add color and install information to a pacman -Ss search\n";
- print "Usage: $progname <pattern>\n";
- print "Example: $progname ^gnome\n";
+ usage;
if ($#ARGV lt 0) {
exit 1;
}
exit 0;
}
-if ($ARGV[0] eq "--version" || $ARGV[0] eq "-v") {
- print "$progname version $version\n";
- print "Copyright (C) 2006-2011 Dan McGee\n";
+if ($ARGV[0] eq "--version" || $ARGV[0] eq "-V") {
+ version;
exit 0;
}
diff --git a/contrib/pacsysclean.in b/contrib/pacsysclean.in
deleted file mode 100755
index 9e25d39e..00000000
--- a/contrib/pacsysclean.in
+++ /dev/null
@@ -1,53 +0,0 @@
-#!/bin/bash
-
-# pacsysclean - Sort installed packages by increasing installed size. Useful for system clean-up.
-
-PACMAN_OPTS=
-
-usage() {
- echo "pacsysclean - Sort installed packages by increasing installed size."
- echo
- echo "Usage: pacsysclean [options]"
- echo
- echo "Options:"
- echo " -o <options> Specify custom pacman query options (e.g., dt)"
- echo " -h, --help Show this help message and exit"
-}
-
-
-if [ -n "$1" ]; then
- case "$1" in
- -o) PACMAN_OPTS="${2}" ;;
- -h|--help) usage; exit 0 ;;
- *) usage; exit 1 ;;
- esac
-fi
-
-IFS=$'\n'
-name="^Name.*: (.*)$"
-size="^Installed Size.*: (.*) KiB$"
-
-[[ $PACMAN_OPTS && $PACMAN_OPTS != -* ]] && PACMAN_OPTS="-$PACMAN_OPTS"
-
-for line in $(LANG=C pacman -Qi $PACMAN_OPTS); do
- if [[ $line =~ $name ]]; then
- printf "%s\t" ${BASH_REMATCH[1]}
- elif [[ $line =~ $size ]]; then
- printf "%s\n" ${BASH_REMATCH[1]}
- fi
-done | sort -g -k2 | awk '
-BEGIN {
- split("KiB MiB GiB TiB PiB EiB ZiB YiB", suffix)
-}
-function format_size(size) {
- count = 1
- while (size + 0 > 1024) {
- size /= 1024
- count++
- }
- sizestr = sprintf("%.2f %s", size, suffix[count])
- return sizestr
-}
-{
- printf("%s\t%s\n", format_size($2), $1);
-}'
diff --git a/contrib/pacsysclean.sh.in b/contrib/pacsysclean.sh.in
new file mode 100644
index 00000000..37219ab5
--- /dev/null
+++ b/contrib/pacsysclean.sh.in
@@ -0,0 +1,64 @@
+#!/bin/bash
+
+# pacsysclean - Sort installed packages by increasing installed size. Useful for system clean-up.
+
+declare -r myname='pacsysclean'
+declare -r myver='@PACKAGE_VERSION@'
+
+PACMAN_OPTS=
+
+usage() {
+ echo "$myname - Sort installed packages by increasing installed size."
+ echo
+ echo "Usage: $myname [options]"
+ echo
+ echo "Options:"
+ echo " -o <options> Specify custom pacman query options (e.g., dt)"
+ echo " -h, --help Show this help message and exit"
+}
+
+version() {
+ printf "%s %s\n" "$myname" "$myver"
+ echo 'Copyright (C) 2011 Eric BĂ©langer <snowmaniscool@gmail.com>'
+}
+
+
+if [ -n "$1" ]; then
+ case "$1" in
+ -o) PACMAN_OPTS="${2}" ;;
+ -h|--help) usage; exit 0 ;;
+ -V|--version) version; exit 0 ;;
+ *) usage; exit 1 ;;
+ esac
+fi
+
+IFS=$'\n'
+name="^Name.*: (.*)$"
+size="^Installed Size.*: (.*) KiB$"
+
+[[ $PACMAN_OPTS && $PACMAN_OPTS != -* ]] && PACMAN_OPTS="-$PACMAN_OPTS"
+
+for line in $(LANG=C pacman -Qi $PACMAN_OPTS); do
+ if [[ $line =~ $name ]]; then
+ printf "%s\t" ${BASH_REMATCH[1]}
+ elif [[ $line =~ $size ]]; then
+ printf "%s\n" ${BASH_REMATCH[1]}
+ fi
+done | sort -g -k2 | awk '
+BEGIN {
+ split("KiB MiB GiB TiB PiB EiB ZiB YiB", suffix)
+}
+function format_size(size) {
+ count = 1
+ while (size + 0 > 1024) {
+ size /= 1024
+ count++
+ }
+ sizestr = sprintf("%.2f %s", size, suffix[count])
+ return sizestr
+}
+{
+ printf("%s\t%s\n", format_size($2), $1);
+}'
+
+# vim: set ts=2 sw=2 noet:
diff --git a/contrib/rankmirrors.sh.in b/contrib/rankmirrors.sh.in
new file mode 100644
index 00000000..875a1439
--- /dev/null
+++ b/contrib/rankmirrors.sh.in
@@ -0,0 +1,212 @@
+#!/bin/bash
+#
+# rankmirrors - read a list of mirrors from a file and rank them by speed
+# @configure_input@
+#
+# Copyright (c) 2009 Matthew Bruenig <matthewbruenig@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 3 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/>.
+
+# traps interrupt key to spit out pre-interrupt info
+trap finaloutput INT
+
+usage() {
+ echo "Usage: rankmirrors [options] MIRRORFILE | URL"
+ echo
+ echo "Ranks pacman mirrors by their connection and opening speed. Pacman mirror"
+ echo "files are located in @sysconfdir@/pacman.d/. It can also rank one mirror if the URL is"
+ echo "provided."
+ echo
+ echo "Options:"
+ echo " --version show program's version number and exit"
+ echo " -h, --help show this help message and exit"
+ echo " -n NUM number of servers to output, 0 for all"
+ echo " -t, --times only output mirrors and their response times"
+ echo " -u, --url test a specific url"
+ echo " -v, --verbose be verbose in ouptut"
+ echo " -r, --repo specify a specific repo name instead of guessing"
+ exit 0
+}
+
+version() {
+ echo "rankmirrors (pacman) @PACKAGE_VERSION@"
+ echo "Copyright (c) 2009 Matthew Bruenig <matthewbruenig@gmail.com>."
+ echo
+ echo "This is free software; see the source for copying conditions."
+ echo "There is NO WARRANTY, to the extent permitted by law."
+ exit 0
+}
+
+err() {
+ echo "$1" >&2
+ exit 1
+}
+
+# gettime fetchurl (e.g gettime http://foo.com/core/os/i686/core.db.tar.gz)
+# returns the fetching time, or timeout, or unreachable
+gettime() {
+ IFS=' ' output=( $(curl -s -m 10 -w "%{time_total} %{http_code}" "$1" -o/dev/null) )
+ (( $? == 28 )) && echo timeout && return
+ (( ${output[1]} >= 400 || ! ${output[1]} )) && echo unreachable && return
+ echo "${output[0]}"
+}
+
+# getfetchurl serverurl (e.g. getturl http://foo.com/core/os/i686)
+# if $repo is in the line, then assumes core
+# if $arch is in the line, then assumes $(uname -m)
+# returns a fetchurl (e.g. http://foo.com/core/os/i686/core.db.tar.gz)
+ARCH="$(uname -m)"
+getfetchurl() {
+ local strippedurl="${1%/}"
+
+ local replacedurl="${strippedurl//'$arch'/$ARCH}"
+ if [[ ! $TARGETREPO ]]; then
+ replacedurl="${replacedurl//'$repo'/core}"
+ local tmp="${replacedurl%/*}"
+ tmp="${tmp%/*}"
+
+ local reponame="${tmp##*/}"
+ else
+ replacedurl="${replacedurl//'$repo'/$TARGETREPO}"
+ local reponame="$TARGETREPO"
+ fi
+
+ if [[ -z $reponame || $reponame = $replacedurl ]]; then
+ echo "fail"
+ else
+ local fetchurl="${replacedurl}/$reponame.db"
+ echo "$fetchurl"
+ fi
+}
+
+# This exists to remove the need for a separate interrupt function
+finaloutput() {
+ IFS=$'\n' read -r -d '' -a sortedarray < \
+ <(printf '%s\n' "${timesarray[@]}" | LC_COLLATE=C sort)
+
+ # Final output for mirrorfile
+ numiterator="0"
+ if [[ $TIMESONLY ]]; then
+ echo
+ echo " Servers sorted by time (seconds):"
+ for line in "${sortedarray[@]}"; do
+ echo "${line#* } : ${line% *}"
+ ((numiterator++))
+ (( NUM && numiterator >= NUM )) && break
+ done
+ else
+ for line in "${sortedarray[@]}"; do
+ echo "Server = ${line#* }"
+ ((numiterator++))
+ (( NUM && numiterator >= NUM )) && break
+ done
+ fi
+ exit 0
+}
+
+
+# Argument parsing
+[[ $1 ]] || usage
+while [[ $1 ]]; do
+ if [[ ${1:0:2} = -- ]]; then
+ case "${1:2}" in
+ help) usage ;;
+ version) version ;;
+ times) TIMESONLY=1 ; shift ;;
+ verbose) VERBOSE=1 ; shift ;;
+ url) CHECKURL=1; [[ $2 ]] || err "Must specify url."; URL="$2"; shift 2;;
+ repo) [[ $2 ]] || err "Must specify repo name."; TARGETREPO="$2"; shift 2;;
+ *) err "\`$1' is an invalid argument."
+ esac
+ elif [[ ${1:0:1} = - ]]; then
+
+ if [[ ! ${1:1:1} ]]; then
+ [[ -t 0 ]] && err "Stdin is empty."
+ IFS=$'\n' linearray=( $(</dev/stdin) )
+ STDIN=1
+ shift
+ else
+ snum=1
+ for ((i=1 ; i<${#1}; i++)); do
+ case ${1:$i:1} in
+ h) usage ;;
+ t) TIMESONLY=1 ;;
+ v) VERBOSE=1 ;;
+ u) CHECKURL=1; [[ $2 ]] || err "Must specify url."; URL="$2"; snum=2;;
+ r) [[ $2 ]] || err "Must specify repo name."; TARGETREPO="$2"; snum=2;;
+ n) [[ $2 ]] || err "Must specify number." ; NUM="$2" ; snum=2;;
+ *) err "\`-$1' is an invald argument." ;;
+ esac
+ done
+ shift $snum
+ fi
+ elif [[ -f $1 ]]; then
+ FILE="1"
+ IFS=$'\n' linearray=( $(<$1) )
+ [[ $linearray ]] || err "File is empty."
+ shift
+ else
+ err "\`$1' does not exist."
+ fi
+done
+
+# Some sanity checks
+[[ $NUM ]] || NUM=0
+[[ $FILE && $CHECKURL ]] && err "Cannot specify a url and mirrorfile."
+[[ $FILE || $CHECKURL || $STDIN ]] || err "Must specify url, mirrorfile, or stdin."
+
+# Single url handling
+if [[ $CHECKURL ]]; then
+ url="$(getfetchurl "$URL")"
+ [[ $url = fail ]] && err "url \`$URL' is malformed."
+ [[ $VERBOSE ]] && echo "Testing $url..."
+ time=$(gettime "$url")
+ echo "$URL : $time"
+ exit 0
+fi
+
+# Get url results from mirrorfile, fill up the array, and so on
+if [[ $TIMESONLY ]]; then
+ echo "Querying servers, this may take some time..."
+elif [[ $FILE ]]; then
+ echo "# Server list generated by rankmirrors on $(date +%Y-%m-%d)"
+fi
+
+timesarray=()
+for line in "${linearray[@]}"; do
+ if [[ $line =~ ^[[:space:]]*# ]]; then
+ [[ $TIMESONLY ]] || echo $line
+ elif [[ $line =~ ^[[:space:]]*Server ]]; then
+
+ # Getting values and times and such
+ server="${line#*= }"
+ server="${server%%#*}"
+ url="$(getfetchurl "$server")"
+ [[ $url = fail ]] && err "url \`$URL' is malformed."
+ time=$(gettime "$url")
+ timesarray+=("$time $server")
+
+ # Output
+ if [[ $VERBOSE && $TIMESONLY ]]; then
+ echo "$server ... $time"
+ elif [[ $VERBOSE ]]; then
+ echo "# $server ... $time"
+ elif [[ $TIMESONLY ]]; then
+ echo -n " *"
+ fi
+ fi
+done
+finaloutput
+
+# vim: set ts=2 sw=2 noet:
diff --git a/contrib/updpkgsums.sh.in b/contrib/updpkgsums.sh.in
new file mode 100755
index 00000000..33e04d9c
--- /dev/null
+++ b/contrib/updpkgsums.sh.in
@@ -0,0 +1,93 @@
+#!/bin/bash
+#
+# updpkgsums - update source checksums in-place in PKGBUILDs
+#
+# Copyright (C) 2012 Dave Reisner <dreisner@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/>.
+
+shopt -s extglob
+
+declare -r myname='updpkgsums'
+declare -r myver='@PACKAGE_VERSION@'
+
+usage() {
+ printf 'usage: %s [buildfile]\n\n' "$myname"
+ printf ' -h, --help display this help message and exit\n'
+ printf ' -V, --version display version information and exit\n\n'
+ printf '%s will perform an in place update the checksums in the\n' "$myname"
+ printf 'path specified by [buildfile], defaulting to PKGBUILD in the current\n'
+ printf 'working directory.\n'
+}
+
+version() {
+ printf "%s %s\n" "$myname" "$myver"
+ echo 'Copyright (C) 2012 Dave Reisner <dreisner@archlinux.org>'
+}
+
+case $1 in
+ -h|--help) usage; exit ;;
+ -V|--version) version; exit ;;
+esac
+
+buildfile=${1:-PKGBUILD}
+if [[ ! -f $buildfile ]]; then
+ printf '==> ERROR: %s not found or is not a file\n' "$buildfile"
+ exit 1
+fi
+
+# Resolve any symlinks to avoid replacing the symlink with a file. But, we
+# have to do this portably -- readlink's flags are inconsistent across OSes.
+while [[ -L $buildfile ]]; do
+ buildfile=$(readlink "$buildfile")
+ if [[ $buildfile = */* ]]; then
+ cd "${buildfile%/*}"
+ buildfile=${buildfile##*/}
+ fi
+done
+
+# cd into the directory with the build file. This avoids creating random src/
+# directories scattered about the filesystem, and avoids cases where we might
+# not be able to write in the $PWD.
+if [[ $buildfile = */* ]]; then
+ cd "${buildfile%/*}"
+ buildfile=${buildfile##*/}
+fi
+
+# Check $PWD/ for permission to unlink the $buildfile and write a new one
+if [[ ! -w . ]]; then
+ printf $'==> ERROR: No write permission in `%s\'\n' "$PWD"
+ exit 1
+fi
+
+{
+ # Generate the new sums and try to unlink the file before writing stdin back
+ # into it. This final precaution shouldn't fail based on the previous checks,
+ # but it's better to be extra careful before unlinking files.
+ newsums=$(makepkg -g -p "$buildfile") && rm -f "$buildfile" &&
+ exec awk -v newsums="$newsums" '
+ /^[[:blank:]]*(md|sha)[[:digit:]]+sums=/,/\)[[:blank:]]*(#.*)?$/ {
+ if (!w) {
+ print newsums
+ w++
+ }
+ next
+ }
+
+ 1
+ END { if (!w) print newsums }
+ ' > "$buildfile"
+} < "$buildfile"
+
+# vim: set ts=2 sw=2 noet:
diff --git a/contrib/zsh_completion.in b/contrib/zsh_completion.in
index 2cfc946c..84ee93ca 100644
--- a/contrib/zsh_completion.in
+++ b/contrib/zsh_completion.in
@@ -1,4 +1,4 @@
-#compdef pacman pacman.static=pacman
+#compdef pacman pacman.static=pacman pacman-key makepkg
# copy this file to /usr/share/zsh/site-functions/_pacman
@@ -32,8 +32,8 @@ _pacman_opts_common=(
# options for passing to _arguments: options for --upgrade commands
_pacman_opts_pkgfile=(
'-d[Skip dependency checks]'
- '-f[Overwrite conflicting files]'
'--dbonly[Only remove database entry, do not remove files]'
+ '--force[Overwrite conflicting files]'
'--needed[Do not reinstall up to date packages]'
'--recursive[Reinstall all dependencies of target packages]'
'*:package file:_files -g "*.pkg.tar*(.)"'
@@ -85,7 +85,6 @@ _pacman_opts_sync_actions=(
# options for passing to _arguments: options for --sync command
_pacman_opts_sync_modifiers=(
'-d[Skip dependency checks]'
- '-f[Overwrite conflicting files]'
'-i[View package information]'
'-l[List all packages in a repository]'
'-p[Print download URIs for each package to be installed]'
@@ -98,6 +97,7 @@ _pacman_opts_sync_modifiers=(
_pacman_completions_all_groups'
'--asdeps[Install packages as non-explicitly installed]'
'--asexplicit[Install packages as explicitly installed]'
+ '--force[Overwrite conflicting files]'
)
# handles --help subcommand
@@ -286,7 +286,7 @@ _pacman_get_command() {
}
# main dispatcher
-_pacman() {
+_pacman_zsh_comp() {
case $words[2] in
-Q*g*) # ipkg groups
_arguments -s : \
@@ -332,5 +332,204 @@ _pacman() {
esac
}
-# run the main dispatcher
-_pacman "$@"
+_key_shortopts=(
+ '-h[show help]' \
+ '-a[Add the specified keys (empty for stdin)]: :_files'
+ '-d[Remove the Specified keyids]:*: :_keys'
+ '-e[Export the specified or all keyids]:*: :_keys'
+ '-f[List fingreprint for specidied or all keyids]:*: :_keys'
+ '-l[List the specified or all keys]:*: :_keys'
+ '-r[Fetch the specified keyids]:*: :_keys'
+ '-u[Update the trustdb of pacman]'
+ '-v[Verify the file specified by the signature]: :_files -g "*.sig"'
+ '-V[Show program version]'
+ )
+
+_key_longopts=(
+ '--help[show help]'
+ '--add[Add the specified keys (empty for stdin)]: :_files'
+ '--delete[Remove the Specified keyids]:*: :_keys'
+ '--export[Export the specified or all keyids]:*: :_keys'
+ '--finger[List fingreprint for specidied or all keyids]:*: :_keys'
+ '--list-keys[List the specified or all keys]:*: :_keys'
+ '--recv-keys[Fetch the specified keyids]:*: :_keys'
+ '--updatedb[Update the trustdb of pacman]'
+ '--verify[Verify the file specified by the signature]: :_files -g "*.sig"'
+ '--version[Show program version]'
+ '--edit-key[Present a menu for key management task on keyids]:*: :_keys'
+ '--import[Imports pubring.gpg from dir(s)]: :_files -g "*.gpg"'
+ '--import-tb[Imports ownertrust values from trustdb.gpg in dir(s)]: :_files -g "*.gpg"'
+ '--init[Ensure the keyring is properly initialized]'
+ '--list-sigs[List keys and their signatures]:*: :_keys'
+ '--lsign-key[Locally sign the specified keyid]:*: :_keys'
+ '--populate[Reload the default keys from the (given) keyrings in '/usr/share/pacman/keyrings']: :_path_files -W /usr/share/pacman/keyrings'
+ '--refresh-keys[Update specified or all keys from a keyserver]:*: :_keys'
+ )
+
+_pacman_key_options=(
+ '--config[Use an alternate config file (instead of /etc/pacman.con)]: :_files'
+ '--gpgdir[Set an alternate directory for GnuPG (instead of /etc/pacman.d/gnupg)]: :_files -/'
+ '--keyserver[Specify a keyserver to use if necessary]'
+ )
+
+_pacman_key() {
+ case $words[CURRENT] in
+ --*)
+ _arguments -s : \
+ "$_pacman_key_options[@]" \
+ "$_key_longopts[@]"
+ ;;
+ -*)
+ _arguments -s : \
+ "$_pacman_key_options[@]" \
+ "$_key_shortopts[@]" \
+ "$_key_longopts[@]"
+ ;;
+ *)
+ i=$#;
+ while [[ $words[$i] != -* ]] && [[ $words[$i] != "pacman-key" ]];do
+ i=$(($i-1))
+ done
+ case $i in
+ --*)
+ _arguments -s : \
+ "$_pacman_key_options[@]" \
+ "$_key_longopts[@]"
+ ;;
+ -*)
+ _arguments -s : \
+ "$_pacman_key_options[@]" \
+ "$_key_shortopts[@]" \
+ "$_key_longopts[@]"
+ ;;
+ *) return 1;;
+ esac
+ ;;
+ esac
+}
+
+_keys() {
+ local keylist keys
+ keylist=$(pacman-key --list-keys 2>/dev/null | awk '
+ $1 == "pub" {
+ # key id
+ split($2, a, "/"); print a[2]
+ }
+ $1 == "uid" {
+ # email
+ if (match($NF, /<[^>]+>/))
+ print substr($NF, RSTART + 1, RLENGTH - 2)
+ #this adds support for names as well if that is ever added
+ }
+ $1 == "uid" {
+ for (i=2;i<NF;i++) {printf "%s%s",sep, $i;sep=" "}; printf "\n"
+ }' |sed -e 's/(.*)//g' -e 's/^\ //g' -e 's/\ *$//g' |uniq
+ )
+ keys=(${(s:/:)${keylist//$'\n'/\/}})
+ _describe -t modules 'keys in keyring' keys && return 0
+}
+
+_makepkg_shortopts=(
+ '*-s[Install missing dependencies with pacman]'
+ '*-i[Install package after successful build]'
+ '*-A[Ignore incomplete arch field in PKGBUILD]'
+ '*-c[Clean up work files after build]'
+ '*-d[Skip all dependency checks]'
+ '*-e[Do not extract source files (use existing src/ dir)]'
+ '*-f[Overwrite existing package]'
+ '*-g[Generate integrity checks for source files]'
+ '*-h[Show help message and exit]'
+ '*-L[Log package build process]'
+ '*-m[Disable colorized output messages]'
+ '*-o[Download and extract files only]'
+ '-p[Use an alternate build script (instead of 'PKGBUILD')]: :_files'
+ '*-r[Remove installed dependencies after a successful build]'
+ '*-R[Repackage contents of the package without rebuilding]'
+ '*-S[Generate a source-only tarball without downloading sources]'
+ )
+
+_makepkg_action_none(){
+ _arguments \
+ "$_makepkg_shortopts[@]"\
+ "$_makepkg_longopts[@]"
+}
+_makepkg_longopts=(
+ '--ignorearch[Ignore incomplete arch field in PKGBUILD]'
+ '--clean[Clean up work files after build]'
+ '--nodeps[Skip all dependency checks]'
+ '--noextract[Do not extract source files (use existing src/ dir)]'
+ '--force[Overwrite existing package]'
+ '--geninteg[Generate integrity checks for source files]'
+ '--help[Show help message and exit]'
+ '--install[Install package after successful build]'
+ '--log[Log package build process]'
+ '--nocolor[Disable colorized output messages]'
+ '--nobuild[Download and extract files only]'
+ '--rmdeps[Remove installed dependencies after a successful build]'
+ '--repackage[Repackage contents of the package without rebuilding]'
+ '--syncdeps[Install missing dependencies with pacman]'
+ '--source[Generate a source-only tarball without downloading sources]'
+ '--allsource[Generate a source-only tarball including downloaded source]'
+ '--asroot[Allow makepkg to run as root user]'
+ '--check[Run check() function in the PKGBUILD]'
+ '--config[Use an alternate config file instead of '/etc/makepkg.conf']: :_files'
+ '--holdver[Prevent automatic version bumping for development PKGBUILDs]'
+ '--key[Specify key to use for gpg signing instead of the default]: :_keys'
+ '--nocheck[Do not run the check() function in the PKGBUILD]'
+ '--nosign[Do not create a signature for the package]'
+ '--pkg[Only build listed packages from a split package]'
+ '--sign[Sign the resulting package with gpg]'
+ '--skipchecksums[Do not verify checksums of the source files]'
+ '--skipinteg[do not perform any verification checks on source files]'
+ '--skippgpcheck[Do not verify source files with PGP signatures]'
+ '--noconfirm[do not ask for confirmation when resolving dependencies]'
+ '--asdeps[Install packages as non-explicitly installed]'
+ '--noprogressbar[Do not show a progress bar when downloading files]'
+ )
+_makepkg(){
+ case $words[CURRENT] in
+ -*)
+ _arguments -s -w : \
+ "$_makepkg_shortopts[@]" \
+ "$_makepkg_longopts[@]"
+ ;;
+ --* )
+ _arguments -s \
+ "$_makepkg_longopts[@]"
+ ;;
+ - )_makepkg_action_none ;;
+ * )
+ i=$#
+ while [[ $words[i] != -* ]] && [[ $words[$i] != "makepkg" ]];do
+ i=$((i-1));
+ done
+ case $words[$i] in
+ -*)
+ _arguments -s -w : \
+ "$_makepkg_shortopts[@]" \
+ "$_makepkg_longopts[@]"
+ ;;
+ --* )
+ _arguments -s \
+ "$_makepkg_longopts[@]"
+ ;;
+ - )_makepkg_action_none ;;
+ * ) return 1 ;;
+ esac
+ ;;
+ esac
+}
+_pacman_comp() {
+ case "$service" in
+ makepkg)
+ _makepkg "$@";;
+ pacman-key)
+ _pacman_key "$@";;
+ pacman)
+ _pacman_zsh_comp "$@";;
+ *)
+ _message "Error";;
+ esac
+}
+
+_pacman_comp "$@"