diff options
author | Ethan Sommer <e5ten.arch@gmail.com> | 2019-09-19 15:29:15 -0400 |
---|---|---|
committer | Ethan Sommer <e5ten.arch@gmail.com> | 2019-09-19 15:29:15 -0400 |
commit | 299f8e5828bd7e86428d58c6ce5ea11cc7dff575 (patch) | |
tree | f418b67a88d658c7f41cb871e34e85d892281847 | |
parent | b3c9fb8f01ad389624772a4ed1ee41f71ce1969b (diff) |
improved auracle info caching, improve option parsing by removing the if statement at the start of the loop, enable nounset, lots and lots of hopefully NFC
-rw-r--r-- | Makefile | 7 | ||||
-rwxr-xr-x | pacaur | 1248 | ||||
-rw-r--r-- | po/ca.po | 260 | ||||
-rw-r--r-- | po/da.po | 262 |
4 files changed, 801 insertions, 976 deletions
@@ -11,6 +11,7 @@ DATAROOTDIR = $(PREFIX)/share DOCDIR = $(DATAROOTDIR)/doc/pacaur MANPREFIX = $(DATAROOTDIR)/man MSGFMT = $(shell command -v msgfmt 2>/dev/null) +POD2MAN = $(shell command -v pod2man 2>/dev/null) TRANSLATIONS = \ ca \ @@ -39,16 +40,20 @@ all: doc # documentation doc: +ifneq ($(POD2MAN),) @echo "Generating documentation..." @pod2man --utf8 --section=8 --center="Pacaur Manual" --name="PACAUR" \ --release="pacaur $(VERSION)" ./README.pod ./pacaur.8 +endif # aux install: doc @echo "Installing..." @install -Dm644 ./config $(DESTDIR)$(DOCDIR)/config.example @install -Dm755 ./pacaur -t $(DESTDIR)$(BINDIR) - @sed -i "s%declare -r version=.*%declare -r version=\'$(VERSION)\'%" $(DESTDIR)$(BINDIR)/pacaur + @sed -e "s%(declare -r version=).*%\1\'$(VERSION)\'%" \ + -e "s%/usr/share/makepkg%$(shell pkg-config --variable=libmakepkgdir libmakepkg)%" \ + -Ei $(DESTDIR)$(BINDIR)/pacaur @install -Dm644 ./completions/bash.completion $(DESTDIR)$(DATAROOTDIR)/bash-completion/completions/pacaur @install -Dm644 ./completions/zsh.completion $(DESTDIR)$(DATAROOTDIR)/zsh/site-functions/_pacaur @install -Dm644 ./LICENSE -t $(DESTDIR)$(DATAROOTDIR)/licenses/pacaur @@ -1,9 +1,11 @@ #!/bin/bash +# shellcheck disable=1090 + # # pacaur: an AUR helper that minimizes user interaction # -shopt -s extglob +shopt -s extglob nullglob # gettext initialization export LC_COLLATE='C' @@ -17,71 +19,53 @@ declare -r version='4.8.6' # # Options -aur=0 asdeps=0 asexplicit=0 checkdeps=0 cleancache=0 color='' devel=0 downloadonly=0 help=0 -info=0 installpkg=0 native=0 needed=0 noconfirm=0 nodeps=0 noedit=0 noop=0 operation='' -pace=0 pacQ=0 pacS=0 rebuild=0 refresh=0 repo=0 search=0 upgrade=0 ver=0 QUIET=0 +aur=0 asdeps=0 asexplicit=0 checkdeps=0 clean=0 color='' devel=0 downloadonly=0 help=0 +info=0 installpkg=0 needed=0 noconfirm=0 noedit=0 noop=0 operation='' pace=0 pacQ=0 pacS=0 +rebuild=0 refresh=0 repo=0 search=0 upgrade=0 ver=0 declare -i ccount=0 dcount=0 pac=0 -pacmanarg=() pacopts=() auropts=() makeopts=() +pacmanarg=() pacopts=() auropts=() makeopts+=() ignoredpkgs=() ignoredgrps=() +export QUIET="${QUIET:-0}" -# determine config location -while IFS=':' read -rd: i; do - if [[ -d "${i}/pacaur" ]]; then - configdir="${i}/pacaur" - break - fi -done <<<"${XDG_CONFIG_DIRS:-/etc/xdg}:" -declare -r configdir="${configdir:-/etc/xdg/pacaur}" userconfigdir="${XDG_CONFIG_HOME:-${HOME}/.config}/pacaur" \ - userpacmandir="${XDG_CONFIG_HOME:-${HOME}/.config}/pacman" \ - usercachedir="${XDG_CACHE_HOME:-${HOME}/.cache}/pacaur" tmpdir="${XDG_RUNTIME_DIR:-/tmp}" - -# preserve environment variables -var=('PACMAN' {'PKG','SRC'}{'DEST','EXT'} {'SRCPKG','LOG'}'DEST' 'BUILDDIR' 'GPGKEY' 'PACKAGER' 'CARCH') -for i in "${var[@]}"; do - [[ ! "${!i-}" ]] || declare _"${i}"="${!i}" -done -PKGDEST="${PKGDEST:-}" - -# source makepkg variables -if [[ -r "${MAKEPKG_CONF-}" ]]; then - source "${MAKEPKG_CONF}" -else - source /etc/makepkg.conf - if [[ -r "${userpacmandir}/makepkg.conf" ]]; then - source "${userpacmandir}/makepkg.conf" - elif [[ -r "${HOME}/.makepkg.conf" ]]; then - source "${HOME}/.makepkg.conf" - fi -fi - -# restore environment variables -for i in "${var[@]/#/_}"; do - [[ ! "${!i-}" ]] || { j="${i#_}"; declare -x "${i#_}"="${!i:-${!j}}"; unset j; } -done +# determine whether we have gettext; make it a no-op if we do not +command -v gettext >/dev/null || gettext() { printf '%s\n' "$@"; } + +# import libmakepkg +: "${LIBRARY:=/usr/share/makepkg}" +source "${LIBRARY}/util/config.sh" +source "${LIBRARY}/util/option.sh" +source "${LIBRARY}/util/parseopts.sh" +load_makepkg_config +: "${PKGDEST:=}" +check_buildenv check n || checkdeps=1 + +## determine config location +XDG_CONFIG_DIRS="${XDG_CONFIG_DIRS:-/etc/xdg}" XDG_CONFIG_DIRS="${XDG_CONFIG_DIRS//://pacaur:}/pacaur:" +while read -rd: i; do [[ ! -d "${i}" ]] || { configdir="${i}"; break; } done <<<"${XDG_CONFIG_DIRS}" +declare -r tmpdir="${XDG_RUNTIME_DIR:-/tmp}" configdir="${configdir:-/etc/xdg/pacaur}" \ + userconfigdir="${XDG_CONFIG_HOME:-${HOME}/.config}/pacaur" \ + usercachedir="${XDG_CACHE_HOME:-${HOME}/.cache}/pacaur" # set default config variables -editor="${VISUAL:-${EDITOR:-vi}}" # build files editor -displaybuildfiles='diff' # display build files (none|diff|full) -silent='false' # silence output -sortby='name' # sort method (name|votes|popularity) -sortorder='ascending' # sort order (ascending|descending) -sudoloop='true' # prevent sudo timeout +editor="${VISUAL:-${EDITOR:-vi}}" # build files editor +displaybuildfiles='diff' # display build files (none|diff|full) +silent=0 # silence output +sortby='name' # sort method (name|votes|popularity) +sortorder='ascending' # sort order (ascending|descending) +sudoloop=1 # prevent sudo timeout # set variables -declare -r pacmanbin="${PACMAN:-pacman}" # pacman binary -declare -r clonedir="${AURDEST:-${usercachedir:?}}" # clone directory +declare -r pacman="${PACMAN:-pacman}" # pacman binary +declare -r clonedir="${AURDEST:-${usercachedir}}" # clone directory +pacman_conf=('pacman-conf') # source xdg config [[ ! -r "${configdir}/config" ]] || source "${configdir}/config" [[ ! -r "${userconfigdir}/config" ]] || source "${userconfigdir}/config" -# source makepkg libraries -for i in parseopts util option error; do - source "/usr/share/makepkg/util/${i}.sh" -done -check_buildoption check n || checkdeps=1 +set -u # enable after sourcing libmakepkg and configs which may break with it -# determine whether we have gettext; make it a no-op if we do not -type -p gettext >/dev/null || gettext() { printf '%s\n' "$@"; } +case "${silent}" in true) silent=1 ;; false) silent=0 ;; esac +case "${sudoloop}" in true) sudoloop=1;; false) sudoloop=0;; esac declare -r vcs='-@(cvs|svn|git|hg|bzr|darcs|daily*|nightly*)' # vcs package glob @@ -92,25 +76,23 @@ declare -r vcs='-@(cvs|svn|git|hg|bzr|darcs|daily*|nightly*)' # vcs package glob # ClassifyPkgs() { - local noaurpkgs=() norepopkgs=() + local i noaurpkgs=() # global aurpkgs repopkgs ((! repo)) || repopkgs=("${pkgs[@]}") ((! aur)) || aurpkgs=("${pkgs[@]#aur/}") # search aur/pkgs in AUR if ((! repo && ! aur)); then for i in "${pkgs[@]}"; do - if [[ "${i}" = 'aur/'* ]]; then - aurpkgs+=("${i:4}") # search aur/pkgs in AUR - continue - fi - noaurpkgs+=("${i}") - done - [[ "${noaurpkgs[*]}" ]] && - mapfile -t norepopkgs < <(LC_ALL='C' "${pacmanbin}" -Sp "${noaurpkgs[@]}" 2>&1 >/dev/null) - norepopkgs=("${norepopkgs[@]#error: target not found: }") - for i in "${norepopkgs[@]}"; do # do not search repo/pkgs in AUR - [[ " ${noaurpkgs[*]} " = *' '+([a-zA-Z0-9.+-])"/${i} "* ]] || aurpkgs+=("${i}") + [[ "${i::4}" = 'aur/' ]] && aurpkgs+=("${i:4}") || noaurpkgs+=("${i}") # search aur/pkgs in AUR done - mapfile -t repopkgs < <(CommArr 'aurpkgs' 'noaurpkgs' '-13') + if [[ "${noaurpkgs[*]}" ]]; then + while read -r i; do + #[[ "${i}" != 'error: database not found: '* ]] || continue + i="${i#error: target not found: }" + [[ "${i}" != 'error: '* ]] || continue + [[ " ${noaurpkgs[*]} " = *' '+([a-zA-Z0-9.+-])"/${i} "* ]] || aurpkgs+=("${i}") + done < <(LC_ALL='C' "${pacman}" -Sp "${noaurpkgs[@]}" 2>&1 >/dev/null) + fi + mapfile -t repopkgs < <(CommArr -13 aurpkgs noaurpkgs) fi } @@ -120,7 +102,7 @@ Core() { ((! upgrade)) || UpgradeAur IgnoreChecks DepsSolver - IgnoreDepsChecks + IgnoreDepsCheck ProviderChecks ConflictChecks ReinstallChecks @@ -134,16 +116,18 @@ UpgradeAur() { local foreignpkgs allaurpkgs i # global aurpkgs info $"%sStarting AUR upgrade...%s" "${colorW}" "${reset}" - mapfile -t foreignpkgs < <("${pacmanbin}" -Qmq) + mapfile -t aurpkgs < <(auracle sync -q) # use auracle to find out of date AUR packages + # quit if there are no possibilities for packages ending up in aurpkgs + ((devel)) || NothingToDo "${aurpkgs[@]}" "${pkgs[@]}" + + mapfile -t foreignpkgs < <("${pacman}" -Qmq) SetInfo "${foreignpkgs[@]}" mapfile -t allaurpkgs < <(GetInfo Name) # foreign packages check while read -r i; do warn $"%s is %snot present%s in AUR -- skipping" "${colorW}${i}${reset}" "${colorY}" "${reset}" - done < <(CommArr 'allaurpkgs' 'foreignpkgs' '-13') - - mapfile -t aurpkgs < <(auracle sync -q) # use auracle to find out of date AUR packages + done < <(CommArr -13 allaurpkgs foreignpkgs) # add devel packages if ((devel)); then @@ -154,14 +138,13 @@ UpgradeAur() { aurpkgs+=("${pkgs[@]}") - # avoid possible duplicate - aurpkgs=($(printf '%s\n' "${aurpkgs[@]}" | sort -u)) + mapfile -t aurpkgs < <(SortArr "${aurpkgs[@]}") # avoid possible duplicate NothingToDo "${aurpkgs[@]}" } IgnoreChecks() { - local checkaurpkgs checkaurpkgsAver checkaurpkgsQver checkaurpkgsgrp i + local checkaurpkgs checkaurpkgsver checkaurgrps i j # global aurpkgs rmaurpkgs [[ "${ignoredpkgs[*]}" || "${ignoredgrps[*]}" ]] || return @@ -171,20 +154,19 @@ IgnoreChecks() { # check targets SetInfo "${aurpkgsnover[@]}" mapfile -t checkaurpkgs < <(GetInfo Name) - mapfile -t errdeps < <(CommArr 'aurpkgsnover' 'checkaurpkgs' '-3') + mapfile -t errdeps < <(CommArr -3 aurpkgsnover checkaurpkgs) aurpkgsnover=() - mapfile -t checkaurpkgsAver < <(GetInfo Version) - mapfile -t checkaurpkgsQver < <(expac -Qv '%v' "${checkaurpkgs[@]}" 2>&1) + mapfile -t checkaurpkgsver < <(GetInfo Version) for i in "${!checkaurpkgs[@]}"; do - [[ "${checkaurpkgs[i]}" != *${vcs} ]] || checkaurpkgsAver[i]=$"latest" + [[ "${checkaurpkgs[i]}" != *${vcs} ]] || checkaurpkgsver[i]=$"latest" isignored=0 - if [[ " ${ignoredpkgs[*]} " = *" ${checkaurpkgs[i]} "* ]]; then + if [[ "${ignoredpkgs[*]}" && " ${ignoredpkgs[*]} " = *" ${checkaurpkgs[i]} "* ]]; then isignored=1 elif [[ "${ignoredgrps[*]}" ]]; then - checkaurpkgsgrp=($(GetInfo Groups "${checkaurpkgs[i]}")) - mapfile -tO "${#checkaurpkgsgrp[@]}" checkaurpkgsgrp < <(expac -Ql'\n' '%G' "${checkaurpkgs[i]}") - for j in "${checkaurpkgsgrp[@]}"; do + mapfile -t checkaurgrps < <(GetInfo Groups "${checkaurpkgs[i]}") + mapfile -tO "${#checkaurgrps[@]}" checkaurgrps < <(expac -Ql'\n' '%G' "${checkaurpkgs[i]}") + for j in "${checkaurgrps[@]}"; do [[ " ${ignoredgrps[*]} " != *" ${j} "* ]] || isignored=1 done fi @@ -204,7 +186,8 @@ IgnoreChecks() { fi else warn $"%s: ignoring package upgrade (%s => %s)" "${colorW}${checkaurpkgs[i]}${reset}" \ - "${colorR}${checkaurpkgsQver[i]}${reset}" "${colorG}${checkaurpkgsAver[i]}${reset}" + "${colorR}$(expac -Q '%v' "${checkaurpkgs[i]}")${reset}" \ + "${colorG}${checkaurpkgsver[i]}${reset}" rmaurpkgs+=("${checkaurpkgs[i]}") continue fi @@ -217,9 +200,9 @@ IgnoreChecks() { } DepsSolver() { - local i aurpkgsconflicts + local i j aurpkgsconflicts repodeps=() # global aurpkgs aurpkgsnover aurpkgsproviders aurdeps deps errdeps - # global errdepsnover foreignpkgs repodeps depsAname depsAver depsAood depsQver + # global errdepsnover foreignpkgs depsAname depsAver depsAood depsQver printf '%s\n' $"resolving dependencies..." # remove AUR pkgs versioning @@ -230,14 +213,14 @@ DepsSolver() { # set targets providers aurpkgsproviders=("${aurpkgsnover[@]}") - aurpkgsproviders+=($(GetInfo Provides)) + mapfile -tO "${#aurpkgsproviders[@]}" aurpkgsproviders < <(GetInfo Provides) aurpkgsproviders=("${aurpkgsproviders[@]%%[><=]*}") # check targets conflicts - aurpkgsconflicts=($(GetInfo Conflicts)) + mapfile -t aurpkgsconflicts < <(GetInfo Conflicts) if [[ "${aurpkgsconflicts[*]}" ]]; then aurpkgsconflicts=("${aurpkgsconflicts[@]%%[><=]*}") - mapfile -t aurpkgsconflicts < <(CommArr 'aurpkgsproviders' 'aurpkgsconflicts' '-12') + mapfile -t aurpkgsconflicts < <(CommArr -12 aurpkgsproviders aurpkgsconflicts) for i in "${aurpkgsconflicts[@]}"; do [[ " ${aurpkgsnover[*]} " = *" ${i} "* ]] || continue [[ " $(GetInfo Conflicts "${i}") " != *" ${i} "* ]] || continue @@ -249,11 +232,11 @@ DepsSolver() { deps=("${aurpkgsnover[@]}") - [[ "${foreignpkgs[*]}" ]] || mapfile -t foreignpkgs < <("${pacmanbin}" -Qmq) + [[ "${foreignpkgs[*]}" ]] || mapfile -t foreignpkgs < <("${pacman}" -Qmq) FindDepsAur "${aurpkgsnover[@]}" # avoid possible duplicate - mapfile -t deps < <(CommArr 'aurdepspkgs' 'deps' '-13') + mapfile -t deps < <(CommArr -13 aurdepspkgs deps) deps+=("${aurdepspkgs[@]}") # ensure correct dependency order @@ -268,8 +251,8 @@ DepsSolver() { mapfile -t depsAood < <(GetInfo OutOfDate) mapfile -t depsAmain < <(GetInfo Maintainer) for i in "${!depsAname[@]}"; do - read -rd' ' depsQver[i] < <(expac -Qs '%v' "^${depsAname[i]}$") - [[ "${depsQver[i]}" ]] || depsQver[i]='%' # avoid empty elements shift + read -r depsQver[i] < <(expac -Qs '%v' "^${depsAname[i]}$") + : "${depsQver[i]:=%}" # avoid empty elements shift [[ "${depsAname[i]}" != *${vcs} ]] || depsAver[i]=$"latest" done @@ -279,23 +262,19 @@ DepsSolver() { if [[ " ${aurpkgsnover[*]} " = *" ${errdepsnover[i]} "* ]]; then fail $"no results found for %s" "${errdeps[i]}" else - unset tsorterrdeps errdepslist currenterrdep + unset -v currenterrdep # find relevant tsorted deps chain for j in "${deps[@]}"; do tsorterrdeps+=("${j}") [[ "${j}" != "${errdepsnover[i]}" ]] || break done # reverse deps order - for j in "${!tsorterrdeps[@]}"; do - tsorterrdepsrev[j]="${tsorterrdeps[-j-1]}" - done - tsorterrdeps=("${tsorterrdepsrev[@]}"); unset tsorterrdepsrev + mapfile -t tsorterrdeps < \ + <(for j in "${!tsorterrdeps[@]}"; do printf '%s\n' "${tsorterrdeps[-j-1]}"; done) errdepslist+=("${tsorterrdeps[0]}") FindDepsAurError "${tsorterrdeps[@]}" - for j in "${!errdepslist[@]}"; do - [[ "${errdepslist[-j-1]}" ]] && errdepslistrev+=("${errdepslist[-j-1]}") - done - errdepslist=("${errdepslistrev[@]}"); unset errdepslistrev + mapfile -t errdepslist < \ + <(for j in "${!errdepslist[@]}"; do printf '%s\n' "${errdepslist[-j-1]}"; done) fail $"no results found for %s (dependency tree: %s)" "${errdeps[i]}" "${errdepslist[*]}" fi done @@ -306,17 +285,16 @@ DepsSolver() { FindDepsRepo "${repodeps[@]}" # avoid possible duplicate - repodepspkgs=($(printf '%s\n' "${repodepspkgs[@]}" | sort -u)) + mapfile -t repodepspkgs < <(SortArr "${repodepspkgs[@]}") } FindDepsAur() { - local depAname depAver depspkgs depspkgsaurtmp builtpkg vcsdepspkgs assumedepspkgs aurversionpkgs + local depAname depAver depspkgs depspkgsaurtmp builtpkg assumedepspkgs vcsdepspkgs=() aurversionpkgs=() local aurversionpkgsname aurversionpkgsver aurversionpkgsaurver aurversionpkgsverdiff i j # global aurpkgsnover depspkgsaur errdeps repodeps aurdepspkgs prevdepspkgsaur foreignpkgs - ((nodeps && dcount >= 2)) && return + ((dcount < 2)) || return # set info - unset aurversionpkgs if [[ "${depspkgsaur[*]}" ]]; then SetInfo "${depspkgsaur[@]}" aurversionpkgs=("${prevdepspkgsaur[@]}") @@ -328,39 +306,35 @@ FindDepsAur() { # versioning check if [[ "${aurversionpkgs[*]}" ]]; then for i in "${!aurversionpkgs[@]}"; do - unset aurversionpkgsname aurversionpkgsver aurversionpkgsaurver aurversionpkgsverdiff - aurversionpkgsname="${aurversionpkgs[i]%%[><=]*}" - aurversionpkgsver="${aurversionpkgs[i]##*[><=]}" + aurversionpkgsname="${aurversionpkgs[i]%%[><=]*}" aurversionpkgsver="${aurversionpkgs[i]##*[><=]}" aurversionpkgsaurver="$(GetInfo Version "${aurversionpkgsname}")" - aurversionpkgsverdiff="$(vercmp "${aurversionpkgsaurver}" "${aurversionpkgsver}")" + aurversionpkgsverdiff="$(Vercmp "${aurversionpkgsaurver}" "${aurversionpkgsver}")" # not found in AUR nor repo [[ "${aurversionpkgsaurver}" || " ${errdeps[*]} " = *" ${aurversionpkgs[i]} "* ]] || { errdeps+=("${aurversionpkgs[i]}"); continue; } case "${aurversionpkgs[i]}" in - *">"*|*"<"*|*"="*) - # found in AUR but version not correct + *">"*|*"<"*|*"="*) # found in AUR but version not correct case "${aurversionpkgs[i]}" in - *">="*) ((aurversionpkgsverdiff >= 0)) && continue;; - *"<="*) ((aurversionpkgsverdiff <= 0)) && continue;; - *">"*) ((aurversionpkgsverdiff > 0)) && continue;; - *"<"*) ((aurversionpkgsverdiff < 0)) && continue;; - *"="*) ((aurversionpkgsverdiff == 0)) && continue;; + *">="*) ((aurversionpkgsverdiff < 0)) || continue;; + *"<="*) ((aurversionpkgsverdiff > 0)) || continue;; + *">"*) ((aurversionpkgsverdiff <= 0)) || continue;; + *"<"*) ((aurversionpkgsverdiff >= 0)) || continue;; + *"="*) ((aurversionpkgsverdiff)) || continue;; esac - [[ " ${errdeps[*]} " = *" ${aurversionpkgs[i]} "* ]] || - errdeps+=("${aurversionpkgs[i]}");; + [[ " ${errdeps[*]} " = *" ${aurversionpkgs[i]} "* ]] || errdeps+=("${aurversionpkgs[i]}");; *) continue;; esac done fi - depspkgs=($(GetInfo Depends)) + mapfile -t depspkgs < <(GetInfo Depends) # cached packages makedeps check if [[ ! "${PKGDEST}" ]] || ((rebuild)); then - depspkgs+=($(GetInfo MakeDepends)) - ((checkdeps)) && depspkgs+=($(GetInfo CheckDepends)) + mapfile -tO "${#depspkgs[@]}" depspkgs < <(GetInfo MakeDepends) + ((! checkdeps)) || mapfile -tO "${#depspkgs[@]}" depspkgs < <(GetInfo CheckDepends) else depspkgsaurtmp=("${depspkgsaur[@]:-${aurpkgs[@]}}") for i in "${!depspkgsaurtmp[@]}"; do @@ -368,104 +342,99 @@ FindDepsAur() { depAver="$(GetInfo Version "${depspkgsaurtmp[i]}")" GetBuiltPkg "${depAname}-${depAver}" "${PKGDEST}" if [[ ! "${builtpkg}" ]]; then - depspkgs+=($(GetInfo MakeDepends "${depspkgsaurtmp[i]}")) - ((checkdeps)) && depspkgs+=($(GetInfo CheckDepends "${depspkgsaurtmp[i]}")) + mapfile -tO "${#depspkgs[@]}" depspkgs < <(GetInfo MakeDepends "${depspkgsaurtmp[i]}") + ((! checkdeps)) || + mapfile -tO "${#depspkgs[@]}" depspkgs < <(GetInfo CheckDepends "${depspkgsaurtmp[i]}") fi - unset builtpkg + builtpkg='' done fi # remove deps provided by targets - [[ "${aurpkgsproviders[*]}" ]] && mapfile -t depspkgs < <(CommArr 'aurpkgsproviders' 'depspkgs' '-13') + [[ ! "${aurpkgsproviders[*]}" ]] || mapfile -t depspkgs < <(CommArr -13 aurpkgsproviders depspkgs) # workaround for limited RPC support of architecture dependent fields if [[ "${CARCH}" = 'i686' ]]; then for i in "${!depspkgs[@]}"; do - [[ "${depspkgs[i]}" != @(lib32-|gcc-multilib)* ]] || unset 'depspkgs[i]' + case "${depspkgs[i]}" in lib32-*|gcc-multilib*) unset -v 'depspkgs[i]';; esac done - depspkgs=("${depspkgs[@]}") fi - # remove versioning - depspkgs=("${depspkgs[@]%%[><=]*}") - # remove installed deps - if ((! devel)); then - mapfile -t depspkgs < <("${pacmanbin}" -T -- "${depspkgs[@]}" | sort -u) - else - # check providers - unset vcsdepspkgs + if ((devel)); then + # remove versioning and check providers + depspkgs=("${depspkgs[@]%%[><=]*}") for i in "${!depspkgs[@]}"; do - read -rd' ' j < <(expac -Qs '%n %P' "^${depspkgs[i]}$") + read -r j < <(expac -Qs '%n' "^${depspkgs[i]}$") if [[ "${j}" ]]; then depspkgs[i]="${j}" - ((devel)) && [[ " ${ignoredpkgs[*]} " != *" ${j} "* && "${j}" = *${vcs} ]] && + ((! devel)) || [[ " ${ignoredpkgs[*]} " = *" ${j} "* || "${j}" != *${vcs} ]] || vcsdepspkgs+=("${j}") else foreignpkgs+=("${depspkgs[i]}") fi done # reorder devel - mapfile -t depspkgs < <("${pacmanbin}" -T -- "${depspkgs[@]}" | sort -u) - mapfile -t depspkgs < <(CommArr 'depspkgs' 'vcsdepspkgs' '-3') + mapfile -t depspkgs < <("${pacman}" -T "${depspkgs[@]}") + mapfile -t depspkgs < <(CommArr -3 depspkgs vcsdepspkgs) + else + mapfile -t depspkgs < <("${pacman}" -T "${depspkgs[@]}") fi # split repo and AUR depends pkgs - unset depspkgsaur + unset -v depspkgsaur if [[ "${depspkgs[*]}" ]]; then # remove all pkgs versioning - if ((nodeps && dcount == 1)); then + if ((dcount == 1)); then depspkgs=("${depspkgs[@]%%[><=]*}") # assume installed deps elif [[ "${assumeinstalled[*]}" ]]; then # remove versioning assumeinstalled=("${assumeinstalled[@]%%[><=]*}") for i in "${!assumeinstalled[@]}"; do - unset assumedepspkgs + unset -v assumedepspkgs for j in "${!depspkgs[@]}"; do assumedepspkgs[j]="${depspkgs[j]%%[><=]*}" [[ " ${assumedepspkgs[*]} " = *" ${assumeinstalled[i]} "* ]] && depspkgs[j]="${assumeinstalled[i]}" done done - mapfile -t depspkgs < <(CommArr 'assumeinstalled' 'depspkgs' '-13') + mapfile -t depspkgs < <(CommArr -13 assumeinstalled depspkgs) fi if [[ "${depspkgs[*]}" ]]; then - mapfile -t depspkgsaur < <(LC_ALL='C' "${pacmanbin}" -Sp "${depspkgs[@]}" 2>&1 >/dev/null) && - depspkgsaur=("${depspkgsaur[@]#error: target not found: }") - mapfile -tO "${#repodeps[@]}" repodeps < <(CommArr 'depspkgsaur' 'depspkgs' '-13') + mapfile -t depspkgsaur < <(LC_ALL='C' "${pacman}" -Sp "${depspkgs[@]}" 2>&1 >/dev/null) + depspkgsaur=("${depspkgsaur[@]#error: target not found: }") + mapfile -tO "${#repodeps[@]}" repodeps < <(CommArr -13 depspkgsaur depspkgs) fi fi - unset depspkgs + unset -v depspkgs - # remove duplicate - [[ "${depspkgsaur[*]}" ]] && mapfile -t depspkgsaur < <(CommArr 'aurdepspkgs' 'depspkgsaur' '-13') + # remove duplicates + [[ ! "${depspkgsaur[*]}" ]] || mapfile -t depspkgsaur < <(CommArr -13 aurdepspkgs depspkgsaur) # dependency cycle check - [[ "${prevdepspkgsaur[*]}" && "${prevdepspkgsaur[*]}" = "${depspkgsaur[*]}" ]] && + [[ ! "${prevdepspkgsaur[*]}" || "${prevdepspkgsaur[*]}" != "${depspkgsaur[*]}" ]] || error $"dependency cycle detected (%s)" "${depspkgsaur[*]}" "${E_INSTALL_DEPS_FAILED}" if [[ "${depspkgsaur[*]}" ]]; then - # store for AUR version check - ((nodeps)) || prevdepspkgsaur=("${depspkgsaur[@]}") - # remove duplicates and versioning - depspkgsaur=($(printf '%s\n' "${depspkgsaur[@]%%[><=]*}" | sort -u)) + ((dcount)) || prevdepspkgsaur=("${depspkgsaur[@]}") # store for AUR version check + depspkgsaur=("${depspkgsaur[@]%%[><=]*}") # remove versioning fi [[ ! "${depspkgsaur[*]}" ]] || { aurdepspkgs+=("${depspkgsaur[@]}"); FindDepsAur "${depspkgsaur[@]}"; } } SortDepsAur() { - local i j sortaurpkgs sortdepspkgs sortdepspkgsaur + local i j sortdepspkgs sortdepspkgsaur sortaurpkgs=("${checkedsortdepspkgsaur[@]:-${aurpkgs[@]}}") # global checkedsortdepspkgsaur allcheckedsortdepspkgsaur errdepsnover - sortaurpkgs=("${checkedsortdepspkgsaur[@]:-${aurpkgs[@]}}") - unset checkedsortdepspkgsaur + checkedsortdepspkgsaur=() for i in "${!sortaurpkgs[@]}"; do - unset sortdepspkgs sortdepspkgsaur + sortdepspkgsaur=() - sortdepspkgs+=($(GetInfo Depends "${sortaurpkgs[i]}")) - sortdepspkgs+=($(GetInfo MakeDepends "${sortaurpkgs[i]}")) - ((checkdeps)) && sortdepspkgs+=($(GetInfo CheckDepends "${sortaurpkgs[i]}")) + mapfile -t sortdepspkgs < <(GetInfo Depends "${sortaurpkgs[i]}") + mapfile -tO "${#sortdepspkgs[@]}" sortdepspkgs < <(GetInfo MakeDepends "${sortaurpkgs[i]}") + ((! checkdeps)) || + mapfile -tO "${#sortdepspkgs[@]}" sortdepspkgs < <(GetInfo CheckDepends "${sortaurpkgs[i]}") # remove versioning errdepsnover=("${errdeps[@]%%[><=]*}") @@ -473,47 +442,48 @@ SortDepsAur() { # check AUR deps only for j in "${!sortdepspkgs[@]}"; do sortdepspkgs[j]="${sortdepspkgs[j]%%[><=]*}" - sortdepspkgsaur+=($(GetInfo Name "${sortdepspkgs[j]}")) + mapfile -tO "${#sortdepspkgsaur[@]}" sortdepspkgsaur < <(GetInfo Name "${sortdepspkgs[j]}") # add erroneous AUR deps - [[ " ${errdepsnover[*]} " = *" ${sortdepspkgs[j]} "* ]] && sortdepspkgsaur+=("${sortdepspkgs[j]}") + [[ " ${errdepsnover[*]} " != *" ${sortdepspkgs[j]} "* ]] || sortdepspkgsaur+=("${sortdepspkgs[j]}") done # prepare tsort list - if [[ ! "${sortdepspkgsaur[*]}" ]]; then - tsortdeps+=("${sortaurpkgs[i]} ${sortaurpkgs[i]}") - else + if [[ "${sortdepspkgsaur[*]}" ]]; then for j in "${!sortdepspkgsaur[@]}"; do tsortdeps+=("${sortaurpkgs[i]} ${sortdepspkgsaur[j]}") done + else + tsortdeps+=("${sortaurpkgs[i]} ${sortaurpkgs[i]}") fi # filter non checked deps - mapfile -t sortdepspkgsaur < <(CommArr 'allcheckedsortdepspkgsaur' 'sortdepspkgsaur' '-13') + mapfile -t sortdepspkgsaur < <(CommArr -13 allcheckedsortdepspkgsaur sortdepspkgsaur) if [[ "${sortdepspkgsaur[*]}" ]]; then checkedsortdepspkgsaur+=("${sortdepspkgsaur[@]}") allcheckedsortdepspkgsaur+=("${sortdepspkgsaur[@]}") - allcheckedsortdepspkgsaur=($(printf '%s\n' "${allcheckedsortdepspkgsaur[@]}" | sort -u)) + mapfile -t allcheckedsortdepspkgsaur < <(SortArr "${allcheckedsortdepspkgsaur[@]}") fi done if [[ "${checkedsortdepspkgsaur[*]}" ]]; then - checkedsortdepspkgsaur=($(printf '%s\n' "${checkedsortdepspkgsaur[@]}" | sort -u)) + mapfile -t checkedsortdepspkgsaur < <(SortArr "${checkedsortdepspkgsaur[@]}") SortDepsAur "${checkedsortdepspkgsaur[@]}" fi } FindDepsAurError() { - local i nexterrdep nextallerrdeps + local i nexterrdep="${nexterrdep-}" nextallerrdeps # global errdepsnover errdepslist tsorterrdeps currenterrdep for i in "${tsorterrdeps[@]}"; do [[ " ${errdepsnover[*]} ${errdepslist[*]} " = *" ${i} "* ]] && break || nexterrdep="${i}" done - [[ "${currenterrdep[*]}" ]] || currenterrdep="${tsorterrdeps[0]}" + currenterrdep="${currenterrdep:-${tsorterrdeps[0]}}" if [[ " ${aurpkgs[*]} " != *" ${nexterrdep} "* ]]; then - nextallerrdeps=($(GetInfo Depends "${nexterrdep}")) - nextallerrdeps+=($(GetInfo MakeDepends "${nexterrdep}")) - ((checkdeps)) && nextallerrdeps+=($(GetInfo CheckDepends "${nexterrdep}")) + mapfile -t nextallerrdeps < <(GetInfo Depends "${nexterrdep}") + mapfile -tO "${#nextallerrdeps[@]}" nextallerrdeps < <(GetInfo MakeDepends "${nexterrdep}") + ((! checkdeps)) || + mapfile -tO "${#nextallerrdeps[@]}" nextallerrdeps < <(GetInfo CheckDepends "${nexterrdep}") # remove versioning nextallerrdeps=("${nextallerrdeps[@]%%[><=]*}") @@ -538,60 +508,58 @@ FindDepsAurError() { } FindDepsRepo() { - local allrepodepspkgs repodepspkgstmp + local allrepodepspkgs=() repodepspkgstmp=() # global repodeps repodepspkgs [[ "${repodeps[*]}" ]] || return # reduce root binary deps - repodeps=($(printf '%s\n' "${repodeps[@]}" | sort -u)) + mapfile -t repodeps < <(SortArr "${repodeps[@]}") # add initial repodeps [[ "${repodepspkgs[*]}" ]] || repodepspkgs=("${repodeps[@]}") + repodepspkgs=("${repodepspkgs[@]:-${repodeps[@]}}") - # get non installed binary deps - unset allrepodepspkgs repodepspkgstmp - # no version check needed as all deps are repo deps + # get non installed binary deps, no version check needed as all deps are repo deps [[ ! "${repodeps[*]}" ]] || mapfile -t allrepodepspkgs < <(expac -S1l'\n' '%E' "${repodeps[@]}") [[ ! "${allrepodepspkgs[*]}" ]] || - mapfile -t repodepspkgstmp < <("${pacmanbin}" -T -- "${allrepodepspkgs[@]}" | sort -u) + mapfile -t repodepspkgstmp < <("${pacman}" -T "${allrepodepspkgs[@]}" | sort -u) # remove duplicate - [[ ! "${repodepspkgstmp[*]}" ]] || mapfile -t repodepspkgstmp < <(CommArr 'repodepspkgs'{,'tmp'} '-13') + [[ ! "${repodepspkgstmp[*]}" ]] || mapfile -t repodepspkgstmp < <(CommArr -13 repodepspkgs{,tmp}) [[ ! "${repodepspkgstmp[*]}" ]] || { repodepspkgs+=("${repodepspkgstmp[@]}") repodeps=("${repodepspkgstmp[@]}"); FindDepsRepo "${repodeps[@]}"; } } FindDepsRepoProvider() { - local allrepodepspkgs providerrepodepspkgstmp - # global repodeps repodepspkgs + local -a allproviderrepodepspkgs=() providerrepodepspkgstmp=() + # global repodepspkgs [[ "${providerspkgs[*]}" ]] || return # reduce root binary deps - providerspkgs=($(printf '%s\n' "${providerspkgs[@]}" | sort -u)) + mapfile -t providerspkgs < <(SortArr "${providerspkgs[@]}") # get non installed repo deps - unset allproviderrepodepspkgs providerrepodepspkgstmp [[ ! "${providerspkgs[*]}" ]] || mapfile -t allproviderrepodepspkgs < <(expac -S1l'\n' '%E' "${providerspkgs[@]}") # no version check needed as all deps are binary - [[ "${allproviderrepodepspkgs[*]}" ]] && - mapfile -t providerrepodepspkgstmp < <("${pacmanbin}" -T -- "${allproviderrepodepspkgs[@]}" | sort -u) + [[ ! "${allproviderrepodepspkgs[*]}" ]] || + mapfile -t providerrepodepspkgstmp < <("${pacman}" -T "${allproviderrepodepspkgs[@]}" | sort -u) # remove duplicate - [[ "${providerrepodepspkgstmp[*]}" ]] && - mapfile -t providerrepodepspkgstmp < <(CommArr 'repodepspkgs' 'providerrepodepspkgstmp' '-13') + [[ ! "${providerrepodepspkgstmp[*]}" ]] || + mapfile -t providerrepodepspkgstmp < <(CommArr -13 repodepspkgs providerrepodepspkgstmp) [[ ! "${providerrepodepspkgstmp[*]}" ]] || { repodepspkgs+=("${providerrepodepspkgstmp[@]}") providerspkgs=("${providerrepodepspkgstmp[@]}"); FindDepsRepoProvider "${providerspkgs[@]}"; } } IgnoreDepsChecks() { - local i - # global ignoredpkgs aurpkgs aurdepspkgs aurdepspkgsgrp repodepspkgsgrp rmaurpkgs deps repodepspkgs + local i repodepspkgsgrp=() + # global ignoredpkgs ignoredgrps aurpkgs aurdepspkgs aurdepspkgsgrp rmaurpkgs deps repodepspkgs [[ "${ignoredpkgs[*]}" || "${ignoredgrps[*]}" ]] || return # add checked targets and preserve tsorted order - deps=("${deps[@]:0:${#aurpkgs[@]}}") + deps=("${deps[@]::${#aurpkgs[@]}}") # check dependencies for i in "${repodepspkgs[@]}"; do @@ -599,11 +567,10 @@ IgnoreDepsChecks() { if [[ " ${ignoredpkgs[*]} " = *" ${i} "* ]]; then isignored=1 elif [[ "${ignoredgrps[*]}" ]]; then - unset repodepspkgsSgrp repodepspkgsQgrp mapfile -t repodepspkgsgrp < <(expac -S1l'\n' '%G' "${i}") mapfile -tO "${#repodepspkgsgrp[@]}" repodepspkgsgrp < <(expac -Ql'\n' '%G' "${i}") for j in "${repodepspkgsgrp[@]}"; do - [[ " ${ignoredgrps[*]} " = *" ${j} "* ]] && isignored=1 + [[ " ${ignoredgrps[*]} " != *" ${j} "* ]] || isignored=1 done fi @@ -615,18 +582,18 @@ IgnoreDepsChecks() { done for i in "${aurdepspkgs[@]}"; do # skip already checked dependencies - [[ " ${aurpkgs[*]} " = *" ${i} "* ]] && continue - [[ " ${rmaurpkgs[*]} " = *" ${i} "* ]] && + [[ " ${aurpkgs[*]} " != *" ${i} "* ]] || continue + [[ " ${rmaurpkgs[*]} " != *" ${i} "* ]] || error $"Unresolved dependency '%s'" "${colorW}${i}${reset}" "${E_INSTALL_DEPS_FAILED}" isignored=0 if [[ " ${ignoredpkgs[*]} " = *" ${i} "* ]]; then isignored=1 elif [[ "${ignoredgrps[*]}" ]]; then - aurdepspkgsgrp=($(GetInfo Groups "${i}")) + mapfile -t aurdepspkgsgrp < <(GetInfo Groups "${i}") mapfile -tO "${#aurdepspkgsgrp[@]}" aurdepspkgsgrp < <(expac -Ql'\n' '%G' "${i}") for j in "${aurdepspkgsgrp[@]}"; do - [[ " ${ignoredgrps[*]} " = *" ${j} "* ]] && isignored=1 + [[ " ${ignoredgrps[*]} " != *" ${j} "* ]] || isignored=1 done fi @@ -647,38 +614,34 @@ IgnoreDepsChecks() { } ProviderChecks() { - local providersdeps providersdepsnover providers repodepspkgsprovided providerspkgs provided - local nb providersnb + local providersdeps{,nover} repodepspkgsprovided providerspkgs {,providers}{,nb} provided=() # global repodepspkgs repoprovidersconflictingpkgs repodepsSver repodepsSrepo repodepsQver [[ "${repodepspkgs[*]}" ]] || return # filter directly provided deps mapfile -t noprovidersdeps < <(expac -S1 '%n' "${repodepspkgs[@]}") - mapfile -t providersdeps < <(CommArr 'noprovidersdeps' 'repodepspkgs' '-13') + mapfile -t providersdeps < <(CommArr -13 noprovidersdeps repodepspkgs) # remove installed providers - mapfile -t providersdeps < <("${pacmanbin}" -T -- "${providersdeps[@]}" | sort -u) + mapfile -t providersdeps < <("${pacman}" -T "${providersdeps[@]}" | sort -u) for i in "${!providersdeps[@]}"; do # check versioning - unset providersdepsname providersdepsver providersdepsSname providersdepsSver - providersdepsname="${providersdeps[i]%%[><=]*}" - providersdepsver="${providersdeps[i]##*[><=]}" - mapfile -t providersdepsSname < <(expac -Ss '%n' "^${providersdepsname[i]}$") - mapfile -t providersdepsSver < <(expac -Ss '%v' "^${providersdepsname[i]}$") + providersdepsname="${providersdeps[i]%%[><=]*}" providersdepsver="${providersdeps[i]##*[><=]}" + mapfile -t providersdepsSname < <(expac -Ss '%n' "^${providersdepsname}$") + mapfile -t providersdepsSver < <(expac -Ss '%v' "^${providersdepsname}$") case "${providersdeps[i]}" in *">"*|*"<"*|*"="*) for j in "${!providersdepsSname[@]}"; do - unset providersdepverdiff - providersdepsverdiff="$(vercmp "${providersdepsver}" "${providersdepsSver[j]}")" + providersdepsverdiff="$(Vercmp "${providersdepsver}" "${providersdepsSver[j]}")" # found in repo but version not correct case "${providersdeps[i]}" in - *">="*) ((providersdepsverdiff >= 0)) && continue;; - *"<="*) ((providersdepsverdiff <= 0)) && continue;; - *">"*) ((providersdepsverdiff > 0)) && continue;; - *"<"*) ((providersdepsverdiff < 0)) && continue;; - *"="*) ((providersdepsverdiff == 0)) && continue;; + *">="*) ((providersdepsverdiff < 0)) || continue;; + *"<="*) ((providersdepsverdiff > 0)) || continue;; + *">"*) ((providersdepsverdiff <= 0)) || continue;; + *"<"*) ((providersdepsverdiff >= 0)) || continue;; + *"="*) ((providersdepsverdiff)) || continue;; esac providersdepsnover+=("${providersdepsSname[j]}") done @@ -692,20 +655,18 @@ ProviderChecks() { mapfile -t providers < <(expac -Ss '%n' "^${providersdeps[i]}$" | sort -u) # filter out non matching versioned providers - [[ "${providersdepsnover[*]}" ]] && mapfile -t providers < <(CommArr 'providers'{'depsnover',} '-12') + [[ ! "${providersdepsnover[*]}" ]] || mapfile -t providers < <(CommArr -12 providers{depsnover,}) # skip if provided in dependency chain repodepspkgsprovided=0 - for j in "${!providers[@]}"; do - [[ " ${repodepspkgs[*]} " != *" ${providers[j]} "* ]] || repodepspkgsprovided=1 + for j in "${providers[@]}"; do + [[ " ${repodepspkgs[*]} " != *" ${j} "* ]] || repodepspkgsprovided=1 done - ((repodepspkgsprovided)) && continue + ((! repodepspkgsprovided)) || continue # skip if already provided if [[ "${providerspkgs[*]}" ]]; then - providerspkgs=($(printf '%s|' "${providerspkgs[@]}")) - providerspkgs=("${providerspkgs[@]%|}") - mapfile -tO "${#provided[@]}" provided < <(expac -Ssl'\n' '%S' "^(${providerspkgs[*]})$") + mapfile -tO "${#provided[@]}" provided < <(IFS='|'; expac -Ssl'\n' '%S' "^(${providerspkgs[*]})$") [[ " ${provided[*]} " != *" ${providersdeps[i]} "* ]] || continue fi @@ -717,7 +678,7 @@ ProviderChecks() { providersnb="$(("${#providers[@]}" - 1))" # count from 0 while ((nb < 0 || nb >= "${#providers}")); do printf '\n%s ' $"Enter a number (default=0):" - case "${TERM}" in + case "${TERM:-}" in dumb) read -r nb;; *) read -rn "${#providersnb}" nb; printf '\n';; esac @@ -739,11 +700,8 @@ ProviderChecks() { providerspkgs+=("${providers[nb]}") done - # add selected providers to repo deps - repodepspkgs+=("${providerspkgs[@]}") - - # store for installation - repoprovidersconflictingpkgs+=("${providerspkgs[@]}") + # add selected providers to repo deps and store for installation + repodepspkgs+=("${providerspkgs[@]}") repoprovidersconflictingpkgs+=("${providerspkgs[@]}") FindDepsRepoProvider "${providerspkgs[@]}" @@ -751,15 +709,19 @@ ProviderChecks() { if [[ "${repodepspkgs[*]}" ]]; then mapfile -t repodepspkgs < <(expac -S1 '%n' "${repodepspkgs[@]}" | sort -u) mapfile -t repodepsSver < <(expac -S1 '%v' "${repodepspkgs[@]}") - mapfile -t repodepsQver < <(expac -Q '%v' "${repodepspkgs[@]}") + if [[ "$("${pacman_conf[@]}" VerbosePkgLists)" ]]; then + for i in "${!repodepspkgs[@]}"; do + repodepsQver[i]="$(expac -Q '%v' "${repodepspkgs[i]}")" + done + fi mapfile -t repodepsSrepo < <(expac -S1 '%r/%n' "${repodepspkgs[@]}") fi } ConflictChecks() { local allQprovides allQconflicts Aprovides Aconflicts aurconflicts aurAconflicts Qrequires i j - local k l repodepsprovides repodepsconflicts checkedrepodepsconflicts repodepsconflictsname - local repodepsconflictsver localver repoconflictingpkgs + local k l repodepsprovides repodepsconflicts repodepsconflictsname checkedrepodepsconflicts=() + local repodepsconflictsver localver repoconflictingpkgs repoconflicts=() # global deps depsAname aurdepspkgs aurconflictingpkgs aurconflictingpkgskeep aurconflictingpkgsrm # global depsQver repodepspkgs repoconflictingpkgskeep repoconflictingpkgsrm repoprovidersconflictingpkgs printf '%s\n' $"looking for inter-conflicts..." @@ -770,27 +732,25 @@ ConflictChecks() { # AUR conflicts Aprovides=("${depsAname[@]}") - Aprovides+=($(GetInfo Provides)) - Aconflicts=($(GetInfo Conflicts)) + mapfile -tO "${#Aprovides[@]}" Aprovides < <(GetInfo Provides) + mapfile -t Aconflicts < <(GetInfo Conflicts) # remove AUR versioning - Aprovides=("${Aprovides[@]%%[><=]*}") - Aconflicts=("${Aconflicts[@]%%[><=]*}") - mapfile -t aurconflicts < <(CommArr 'Aprovides' 'allQconflicts' '-12') - mapfile -tO "${#aurconflicts[@]}" aurconflicts < <(CommArr 'Aconflicts' 'allQprovides' '-12') - aurconflicts=($(printf '%s\n' "${aurconflicts[@]}" | sort -u)) + Aprovides=("${Aprovides[@]%%[><=]*}") Aconflicts=("${Aconflicts[@]%%[><=]*}") + mapfile -t aurconflicts < <(CommArr -12 Aprovides allQconflicts; CommArr -12 Aconflicts allQprovides) + mapfile -t aurconflicts < <(SortArr "${aurconflicts[@]}") for i in "${aurconflicts[@]}"; do - unset aurAconflicts - [[ " ${depsAname[*]} " = *" ${i} "* ]] && aurAconflicts=("${i}") + aurAconflicts=() + [[ " ${depsAname[*]} " != *" ${i} "* ]] || aurAconflicts=("${i}") for j in "${depsAname[@]}"; do - [[ " $(GetInfo Conflicts "${j}") " = *" ${i} "* ]] && aurAconflicts+=("${j}") + [[ " $(GetInfo Conflicts "${j}") " != *" ${i} "* ]] || aurAconflicts+=("${j}") done for j in "${aurAconflicts[@]}"; do - unset Aprovides - read -rd' ' k < <(expac -Qs '%n %P' "^${i}$") - ((! installpkg)) && [[ " ${aurdepspkgs[*]} " != *" ${j} "* ]] && continue # download only - [[ "${j}" = "${k}" || ! "${k}" ]] && continue # skip if reinstalling or if no conflict exists + Aprovides=() + read -r k < <(expac -Qs '%n' "^${i}$") + ((installpkg)) || [[ " ${aurdepspkgs[*]} " = *" ${j} "* ]] || continue # download only + [[ "${j}" != "${k}" && "${k}" ]] || continue # skip if reinstalling or if no conflict exists Aprovides=("${j}") if ((! noconfirm)) && [[ " ${aurconflictingpkgs[*]} " != *" ${k} "* ]]; then @@ -799,12 +759,10 @@ ConflictChecks() { aurconflictingpkgskeep+=("${j}") aurconflictingpkgsrm+=("${k}") for l in "${!depsAname[@]}"; do - [[ " ${depsAname[l]} " != *"${k}"* ]] || - read -rd' ' depsQver[l] < <(expac -Qs '%v' "^${k}$") + [[ " ${depsAname[l]} " != *"${k}"* ]] || read -r depsQver[l] < <(expac -Qs '%v' "^${k}$") done - Aprovides+=($(GetInfo Provides "${j}")) - # remove AUR versioning - Aprovides=("${Aprovides[@]%%[><=]*}") + mapfile -tO "${#Aprovides[@]}" Aprovides < <(GetInfo Provides "${j}") + Aprovides=("${Aprovides[@]%%[><=]*}") # remove AUR versioning [[ " ${Aprovides[*]} ${aurconflictingpkgsrm[*]} " = *" ${k} "* ]] || CheckRequires "${k}" break else @@ -819,9 +777,8 @@ ConflictChecks() { fi fi fi - Aprovides+=($(GetInfo Provides "${j}")) - # remove AUR versioning - Aprovides=("${Aprovides[@]%%[><=]*}") + mapfile -tO "${#Aprovides[@]}" Aprovides < <(GetInfo Provides "${j}") + Aprovides=("${Aprovides[@]%%[><=]*}") # remove AUR versioning [[ " ${Aprovides[*]} ${aurconflictingpkgsrm[*]} " = *" ${k} "* ]] || CheckRequires "${k}" done done @@ -836,43 +793,38 @@ ConflictChecks() { mapfile -t repodepsconflicts < <(expac -S1l'\n' '%H' "${repodepspkgs[@]}") # versioning check - unset checkedrepodepsconflicts for i in "${!repodepsconflicts[@]}"; do - unset repodepsconflictsname repodepsconflictsver localver repodepsconflictsname="${repodepsconflicts[i]%%[><=]*}" repodepsconflictsver="${repodepsconflicts[i]##*[><=]}" localver="$(expac -Q '%v' "${repodepsconflictsname}")" - repodepsconflictsverdiff="$(vercmp "${repodepsconflictsver}" "${localver}")" + repodepsconflictsverdiff="$(Vercmp "${repodepsconflictsver}" "${localver}")" if [[ "${localver}" ]]; then case "${repodepsconflicts[i]}" in - *">="*) ((repodepsconflictsverdiff >= 0)) && continue;; - *"<="*) ((repodepsconflictsverdiff <= 0)) && continue;; - *">"*) ((repodepsconflictsverdiff > 0)) && continue;; - *"<"*) ((repodepsconflictsverdiff < 0)) && continue;; - *"="*) ((repodepsconflictsverdiff == 0)) && continue;; + *">="*) ((repodepsconflictsverdiff < 0)) || continue;; + *"<="*) ((repodepsconflictsverdiff > 0)) || continue;; + *">"*) ((repodepsconflictsverdiff <= 0)) || continue;; + *"<"*) ((repodepsconflictsverdiff >= 0)) || continue;; + *"="*) ((repodepsconflictsverdiff)) || continue;; esac checkedrepodepsconflicts+=("${repodepsconflictsname}") fi done - mapfile -tO "${#repoconflicts[@]}" repoconflicts < <(CommArr 'repodepsprovides' 'allQconflicts' '-12') + mapfile -tO "${#repoconflicts[@]}" repoconflicts < <(CommArr -12 repodepsprovides allQconflicts) mapfile -tO "${#repoconflicts[@]}" repoconflicts < \ - <(CommArr 'checkedrepodepsconflicts' 'allQprovides' '-12') - repoconflicts=($(printf '%s\n' "${repoconflicts[@]}" | sort -u)) + <(CommArr -12 checkedrepodepsconflicts allQprovides) + mapfile -t repoconflicts < <(SortArr "${repoconflicts[@]}") fi for i in "${repoconflicts[@]}"; do - unset Qprovides - read -rd' ' j < <(expac -Ss '%n %C %S' "^${i}$") - read -rd' ' k < <(expac -Qs '%n %C %S' "^${i}$") - [[ "${j}" = "${k}" || ! "${k}" ]] && continue # skip when no conflict with repopkgs + read -r j < <(expac -Ss '%n' "^${i}$") + read -r k < <(expac -Qs '%n' "^${i}$") + [[ "${j}" != "${k}" && "${k}" ]] || continue # skip when no conflict with repopkgs if ((! noconfirm)) && [[ " ${repoconflictingpkgs[*]} " != *" ${k} "* ]]; then if ! Proceed n $"%s and %s are in conflict (%s). Remove %s?" "${j}" "${k}" "${i}" "${k}"; then - repoconflictingpkgs+=("${j}" "${k}") - repoconflictingpkgskeep+=("${j}") - repoconflictingpkgsrm+=("${k}") - repoprovidersconflictingpkgs+=("${j}") + repoconflictingpkgs+=("${j}" "${k}") repoconflictingpkgskeep+=("${j}") + repoconflictingpkgsrm+=("${k}") repoprovidersconflictingpkgs+=("${j}") mapfile -t Qprovides < <(expac -Ssl'\n' '%S' "^${k}$") [[ " ${Qprovides[*]} ${repoconflictingpkgsrm[*]} " = *" ${k} "* ]] || CheckRequires "${k}" break @@ -894,29 +846,26 @@ ConflictChecks() { } ReinstallChecks() { - local i depsAtmp + local i j depsAtmp=("${depsAname[@]}") # global aurpkgs aurdepspkgs deps aurconflictingpkgs depsAname depsQver depsAver depsAood depsAmain - depsAtmp=("${depsAname[@]}") for i in "${!depsAtmp[@]}"; do [[ " ${aurpkgs[*]} " = *" ${depsAname[i]} "* && " ${aurconflictingpkgs[*]} " != *" ${depsAname[i]} "* ]] || continue - [[ "${depsQver[i]}" != ?('%') && "$(vercmp "${depsAver[i]}" "${depsQver[i]}")" -le 0 ]] || continue + [[ "${depsQver[i]}" != ?('%') && "$(Vercmp "${depsAver[i]}" "${depsQver[i]}")" -le 0 ]] || continue ((installpkg)) || [[ " ${aurdepspkgs[*]} " = *" ${depsAname[i]} "* ]] || continue if [[ "${depsAname[i]}" = *${vcs} ]]; then warn $"%s latest revision -- fetching" "${colorW}${depsAname[i]}${reset}" + elif ((needed)); then + warn $"%s-%s is up to date -- skipping" "${colorW}${depsAname[i]}" "${depsQver[i]}${reset}" + for j in "${!deps[@]}"; do [[ "${deps[j]}" != "${depsAname[i]}" ]] || unset -v 'deps[j]'; done + deps=("${deps[@]}") + unset -v 'depsAname[i]' 'depsQver[i]' 'depsAver[i]' 'depsAood[i]' 'depsAmain[i]' else - if ((! needed)); then - warn $"%s-%s is up to date -- reinstalling" "${colorW}${depsAname[i]}" "${depsQver[i]}${reset}" - else - warn $"%s-%s is up to date -- skipping" "${colorW}${depsAname[i]}" "${depsQver[i]}${reset}" - mapfile -t deps < <(printf ' %s \n' "${deps[@]}") - deps=($(printf '%s\n' "${deps[@]// ${depsAname[i]} /}")) - unset 'depsAname[i]' 'depsQver[i]' 'depsAver[i]' 'depsAood[i]' 'depsAmain[i]' - fi + warn $"%s-%s is up to date -- reinstalling" "${colorW}${depsAname[i]}" "${depsQver[i]}${reset}" fi done - ((needed)) && depsAname=("${depsAname[@]}") && depsQver=("${depsQver[@]}") && - depsAver=("${depsAver[@]}") && depsAood=("${depsAood[@]}") && depsAmain=("${depsAmain[@]}") + depsAname=("${depsAname[@]}") depsQver=("${depsQver[@]}") depsAver=("${depsAver[@]}") + depsAood=("${depsAood[@]}") depsAmain=("${depsAmain[@]}") NothingToDo "${deps[@]}" } @@ -924,7 +873,7 @@ OutOfDateChecks() { local i # global depsAname depsAver depsAood for i in "${!depsAname[@]}"; do - (("${depsAood[i]}" > 0)) && + ((depsAood[i] <= 0)) || warn $"%s-%s has been flagged %sout of date%s on %s" "${colorW}${depsAname[i]}" "${depsAver[i]}${reset}" "${colorR}" "${reset}" "${colorY}$(printf '%(%c)T' "${depsAood[i]}")${reset}" done } @@ -933,8 +882,8 @@ OrphanChecks() { local i # global depsAname depsAver depsAmain for i in "${!depsAname[@]}"; do - [[ "${depsAmain[i]}" = 'null' || ! "${depsAmain[i]}" ]] && - warn $"%s-%s is %sorphaned%s in AUR" "${colorW}${depsAname[i]}" "${depsAver[i]}${reset}" "${colorR}" "${reset}" + [[ "${depsAmain[i]}" != '%' ]] || warn $"%s-%s is %sorphaned%s in AUR" \ + "${colorW}${depsAname[i]}" "${depsAver[i]}${reset}" "${colorR}" "${reset}" done } @@ -949,10 +898,10 @@ Prompt() { mapfile -t binarymsize < <(expac -S1 '%m' "${repodepspkgs[@]}") sumk=0 summ=0 for i in "${!repodepspkgs[@]}"; do - GetBuiltPkg "${repodepspkgs[i]}-${repodepsSver[i]}" "$(pacman-conf CacheDir)" - [[ "${builtpkg}" ]] && binaryksize[i]=0 - sumk="$((sumk + "${binaryksize[i]}"))" - summ="$((summ + "${binarymsize[i]}"))" + GetBuiltPkg "${repodepspkgs[i]}-${repodepsSver[i]}" "$("${pacman_conf[@]}" CacheDir)" + [[ ! "${builtpkg}" ]] || binaryksize[i]=0 + ((sumk += binaryksize[i])) + ((summ += binarymsize[i])) done sumk="$((sumk / 1048576)).$((sumk / 1024 % 1024 * 100 / 1024))" summ="$((summ / 1048576)).$((summ / 1024 % 1024 * 100 / 1024))" @@ -960,30 +909,29 @@ Prompt() { # cached packages check for i in "${!depsAname[@]}"; do - [[ ! "${PKGDEST}" ]] || ((rebuild)) && break + [[ "${PKGDEST}" && rebuild -eq 0 ]] || break GetBuiltPkg "${depsAname[i]}-${depsAver[i]}" "${PKGDEST}" - [[ "${builtpkg}" ]] && cachedpkgs+=("${depsAname[i]}") depsAcached[i]='('$"cached"')' || depsAcached[i]='' - unset builtpkg + [[ "${builtpkg}" ]] && + cachedpkgs+=("${depsAname[i]}") depsAcached[i]='('$"cached"')' || depsAcached[i]='' + builtpkg='' done - if [[ "$(pacman-conf VerbosePkgLists)" ]]; then - straurname=$"AUR Packages (${#deps[@]})"; strreponame=$"Repo Packages (${#repodepspkgs[@]})" - stroldver=$"Old Version"; strnewver=$"New Version"; strsize=$"Download Size" + if [[ "$("${pacman_conf[@]}" VerbosePkgLists)" ]]; then + straurname=$"AUR Packages ""(${#deps[@]})" strreponame=$"Repo Packages ""(${#repodepspkgs[@]})" + stroldver=$"Old Version" strnewver=$"New Version" strsize=$"Download Size" depsArepo=("${depsAname[@]/#/aur/}") lname="$(GetLength "${depsArepo[@]}" "${repodepsSrepo[@]}" "${straurname}" "${strreponame}")" lver="$(GetLength "${depsQver[@]}" "${depsAver[@]}" "${repodepsQver[@]}" "${repodepsSver[@]}" "${stroldver}" "${strnewver}")" lsize="$(GetLength "${strsize}")" # local version column cleanup - for i in "${!deps[@]}"; do - [[ "${depsQver[i]}" != '%' ]] || unset 'depsQver[i]' - done + for i in "${!deps[@]}"; do [[ "${depsQver[i]}" != '%' ]] || depsQver[i]=''; done # show detailed output printf "\n${colorW}%-${lname}s %-${lver}s %-${lver}s${reset}\n\n" \ "${straurname}" "${stroldver}" "${strnewver}" for i in "${!deps[@]}"; do printf "%-${lname}s ${colorR}%-${lver}s${reset} ${colorG}%-${lver}s${reset} %${lsize}s\n" \ - "${depsArepo[i]}" "${depsQver[i]}" "${depsAver[i]}" "${depsAcached[i]}" + "${depsArepo[i]}" "${depsQver[i]}" "${depsAver[i]}" "${depsAcached[i]-}" done if [[ "${repodepspkgs[*]}" ]]; then @@ -994,24 +942,24 @@ Prompt() { "${strreponame}" "${stroldver}" "${strnewver}" "${strsize}" for i in "${!repodepspkgs[@]}"; do printf "%-${lname}s ${colorR}%-${lver}s${reset} ${colorG}%-${lver}s${reset} %${lsize}s\n" \ - "${repodepsSrepo[i]}" "${repodepsQver[i]}" "${repodepsSver[i]}" $"${binarysize[i]} MiB" + "${repodepsSrepo[i]}" "${repodepsQver[i]}" "${repodepsSver[i]}" "${binarysize[i]}"$" MiB" done fi else # show version for i in "${!deps[@]}"; do - depsver="${depsver-}${depsAname[i]}-${depsAver[i]} " + depsver+="${depsAname[i]}-${depsAver[i]} " done for i in "${!repodepspkgs[@]}"; do - repodepspkgsver="${repodepspkgsver-}${repodepspkgs[i]}-${repodepsSver[i]} " + repodepspkgsver+="${repodepspkgs[i]}-${repodepsSver[i]} " done - printf "\n${colorW}%-16s${reset} %s\n" $"AUR Packages (${#deps[@]})" "${depsver}" - [[ "${repodepspkgs[*]}" ]] && - printf "${colorW}%-16s${reset} %s\n" $"Repo Packages (${#repodepspkgs[@]})" "${repodepspkgsver}" + printf "\n${colorW}%-16s${reset} %s\n" $"AUR Packages ""(${#deps[@]})" "${depsver}" + [[ ! "${repodepspkgs[*]}" ]] || + printf "${colorW}%-16s${reset} %s\n" $"Repo Packages ""(${#repodepspkgs[@]})" "${repodepspkgsver}" fi if [[ "${repodepspkgs[*]}" ]]; then - strrepodlsize=$"Repo Download Size:"; strrepoinsize=$"Repo Installed Size:"; strsumk="${sumk}"$"MiB" + strrepodlsize=$"Repo Download Size:" strrepoinsize=$"Repo Installed Size:" strsumk="${sumk}"$"MiB" strsumm="${summ}"$"MiB" lreposizelabel="$(GetLength "${strrepodlsize}" "${strrepoinsize}")" lreposize="$(GetLength "${strsumk}" "${strsumm}")" printf "\n${colorW}%-${lreposizelabel}s${reset} %${lreposize}s\n" "${strrepodlsize}" "${strsumk}" @@ -1027,7 +975,7 @@ Prompt() { } DownloadPkgs() { - local i + local i basepkgstmp=() # global basepkgs info $"%sRetrieving package(s)...%s" "${colorW}" "${reset}" GetPkgbase "$@" @@ -1035,30 +983,27 @@ DownloadPkgs() { # no results check [[ "${basepkgs[*]}" ]] || error $"no results found" "${E_INSTALL_DEPS_FAILED}" - # reset - for i in "${basepkgs[@]}"; do - if [[ -d "${clonedir}/${i}" ]]; then - git -C "${clonedir}/${i}" reset --hard HEAD -q # updated pkgver of vcs packages block pull - [[ "${displaybuildfiles}" = 'diff' ]] && - git -C "${clonedir}/${i}" rev-parse HEAD >"${clonedir}/${i}/.git/HEAD.prev" - fi - done + # record previous HEAD for diff viewing + if [[ "${displaybuildfiles}" = 'diff' ]]; then + basepkgstmp=("${basepkgs[@]/#/${clonedir}/}") + for i in "${basepkgstmp[@]/%//}"; do + git -C "${i}" rev-parse HEAD >"${i}/.git/HEAD.prev" + done + fi - # clone - auracle -C "${clonedir}" clone "$@" >/dev/null || - error $"failed to retrieve packages" "${E_INSTALL_DEPS_FAILED}" + auracle -C "${clonedir}" clone "$@" >/dev/null || error $"failed to retrieve packages" 1 # clone } EditPkgs() { local viewed=0 i j erreditpkg prev # global cachedpkgs installscripts editor - ((noedit)) && return + ((! noedit)) || return for i in "$@"; do - [[ " ${cachedpkgs[*]} " = *" ${i} "* ]] && continue + [[ " ${cachedpkgs[*]} " != *" ${i} "* ]] || continue GetInstallScripts "${i}" if ((! pace)); then if [[ "${displaybuildfiles}" = 'diff' && -e "${clonedir}/${i}/.git/HEAD.prev" ]]; then - prev="$(<"${clonedir}/${i}/.git/HEAD.prev")" + read -r prev <"${clonedir}/${i}/.git/HEAD.prev" # show diff if git -C "${clonedir}/${i}" diff --quiet --no-ext-diff "${prev}" -- . ':!\.SRCINFO'; then warn $"%s build files are up-to-date -- skipping" "${colorW}${i}${reset}" @@ -1086,7 +1031,7 @@ EditPkgs() { if [[ -e "${clonedir}/${i}/${j}" ]]; then "${editor}" "${clonedir}/${i}/${j}" && info $"%s script viewed" "${colorW}${j}${reset}" || - erreditpkg+=("${i}") + erreditpkg+=("${i}") else error $"Could not open %s script" "${colorW}${j}${reset}" "${E_MISSING_FILE}" fi @@ -1116,9 +1061,8 @@ EditPkgs() { done if [[ "${erreditpkg[*]}" ]]; then - for i in "${erreditpkg[@]}"; do - fail $"%s errored on exit" "${colorW}${i}${reset}" - done + erreditpkg=("${erreditpkg[@]/#/${colorW}}") + fail $"%s errored on exit" "${erreditpkg[@]/%/${reset}}" exit "${E_FAIL}" fi @@ -1132,10 +1076,10 @@ EditPkgs() { } MakePkgs() { - local i j k oldorphanpkgs neworphanpkgs orphanpkgs oldoptionalpkgs newoptionalpkgs optionalpkgs - local errinstall pkgsdepslist vcsclients vcschecked aurpkgsAver aurpkgsQver built{,deps}pkgs - local basepkgsupdate checkpkgsdepslist isaurdeps makedeps {basepkgs,pkgsdeps}rev - # global deps basepkgs sudoloop pkgsbase pkgsdeps aurpkgs aurdepspkgs builtpkg errmakepkg + local oldorphanpkgs orphanpkgs oldoptionalpkgs optionalpkgs pkgsdepslist + local vcsclients vcschecked aurpkgsAver aurpkgsQver built{,deps}pkgs + local checkpkgsdepslist isaurdeps makedeps errmakepkgs i j k l + # global deps basepkgs sudoloop pkgsbase pkgsdeps aurpkgs aurdepspkgs builtpkg # global repoprovidersconflictingpkgs # download @@ -1143,86 +1087,78 @@ MakePkgs() { EditPkgs "${basepkgs[@]}" # current orphan and optional packages - mapfile -t oldorphanpkgs < <("${pacmanbin}" -Qdtq) - mapfile -t oldoptionalpkgs < <("${pacmanbin}" -Qdttq) - mapfile -t oldoptionalpkgs < <(CommArr 'oldorphanpkgs' 'oldoptionalpkgs' '-13') + mapfile -t oldorphanpkgs < <("${pacman}" -Qtdq) + mapfile -t oldoptionalpkgs < <("${pacman}" -Qttdq) + mapfile -t oldoptionalpkgs < <(CommArr -13 oldorphanpkgs oldoptionalpkgs) # initialize sudo - if sudo -n "${pacmanbin}" -V &>/dev/null || sudo -v; then - [[ "${sudoloop}" = 'true' ]] && SudoV & + if sudo -n "${pacman}" -V &>/dev/null || sudo -v; then + ((! sudoloop)) || SudoV & fi # split packages support for i in "${!pkgsbase[@]}"; do for j in "${!deps[@]}"; do - if [[ "${pkgsbase[i]}" = "${pkgsbase[j]}" && "${pkgsdeps[*]}" != *",${deps[j]}"?(,*) ]]; then + [[ "${pkgsbase[i]}" != "${pkgsbase[j]}" || "${pkgsdeps[*]}" = *",${deps[j]}"?(,*) ]] || pkgsdeps[i]+=",${deps[j]}" - fi done done pkgsdeps=("${pkgsdeps[@]#,}") # remove empty array indices and leading ',' # reverse deps order - for i in "${!basepkgs[@]}"; do - basepkgsrev[i]="${basepkgs[-i-1]}" - done - basepkgs=("${basepkgsrev[@]}") - for i in "${!pkgsdeps[@]}"; do - pkgsdepsrev[i]="${pkgsdeps[-i-1]}" - done - pkgsdeps=("${pkgsdepsrev[@]}") + mapfile -t basepkgs < <(for i in "${!basepkgs[@]}"; do printf '%s\n' "${basepkgs[-i-1]}"; done) + mapfile -t pkgsdeps < <(for i in "${!pkgsdeps[@]}"; do printf '%s\n' "${pkgsdeps[-i-1]}"; done) # integrity check for i in "${!basepkgs[@]}"; do - IFS=',' read -ra pkgsdepslist <<< "${pkgsdeps[i]}" # get split packages list + mapfile -td',' pkgsdepslist < <(printf '%s' "${pkgsdeps[i]}") # get split packages list # cache check - unset builtpkg + builtpkg='' if [[ "${basepkgs[i]}" != *${vcs} ]]; then for j in "${pkgsdepslist[@]}"; do - [[ "${PKGDEST}" ]] && ((! rebuild)) && + [[ ! "${PKGDEST}" ]] || ((rebuild)) || GetBuiltPkg "${j}-$(GetInfo Version "${j}")" "${PKGDEST}" done fi # install vcs clients (checking pkgbase extension only does not take fetching specific # commit into account) - unset vcsclients - makedeps=($(GetInfo MakeDepends "${basepkgs[i]}")) - for k in git subversion mercurial bzr cvs darcsl; do - [[ " ${makedeps[*]} " = *" ${k} "* ]] && vcsclients+=("${k}") + vcsclients=() + mapfile -t makedeps < <(GetInfo MakeDepends "${basepkgs[i]}") + + for j in git subversion mercurial bzr cvs darcsl; do + [[ " ${makedeps[*]} " != *" ${j} "* ]] || vcsclients+=("${j}") done - unset makedeps for j in "${vcsclients[@]}"; do if [[ " ${vcschecked[*]} " != *" ${j} "* ]]; then - expac -Qs '' "^${j}$" || sudo "${pacmanbin}" -S --asdeps --noconfirm -- "${j}" + expac -Qs '' "^${j}$" || sudo "${pacman}" -S --asdeps --noconfirm "${j}" vcschecked+=("${j}") fi done if [[ ! "${builtpkg-}" ]] || ((rebuild)); then - cd "${clonedir:?}/${basepkgs[i]}" || exit "${E_MISSING_FILE}" + cd_safe "${clonedir}/${basepkgs[i]}" info $"Checking %s integrity..." "${colorW}${pkgsdeps[i]}${reset}" - if [[ "${silent}" = 'true' ]]; then - makepkg -f --verifysource "${makeopts[@]}" &>/dev/null || errmakepkg+=("${pkgsdeps[i]}") + if ((silent)); then + makepkg -f --verifysource "${makeopts[@]}" &>/dev/null || errmakepkgs+=("${pkgsdeps[i]}") else - makepkg -f --verifysource "${makeopts[@]}" >/dev/null || errmakepkg+=("${pkgsdeps[i]}") + makepkg -f --verifysource "${makeopts[@]}" >/dev/null || errmakepkgs+=("${pkgsdeps[i]}") fi # extraction, prepare and pkgver update info $"Preparing %s..." "${colorW}${pkgsdeps[i]}${reset}" - if [[ "${silent}" = 'true' ]]; then - makepkg -od --skipinteg "${makeopts[@]}" &>/dev/null || errmakepkg+=("${pkgsdeps[i]}") + if ((silent)); then + makepkg -od --skipinteg "${makeopts[@]}" &>/dev/null || errmakepkgs+=("${pkgsdeps[i]}") else - makepkg -od --skipinteg "${makeopts[@]}" || errmakepkg+=("${pkgsdeps[i]}") + makepkg -od --skipinteg "${makeopts[@]}" || errmakepkgs+=("${pkgsdeps[i]}") fi fi done - if [[ "${errmakepkg[*]}" || "${errinstall[*]}" ]]; then - for i in "${errmakepkg[@]}"; do - fail $"failed to verify integrity or prepare %s package" "${colorW}${i}${reset}" - done + if [[ "${errmakepkgs[*]}" ]]; then + errmakepkgs=("${errmakepkgs[@]/#/${colorW}}") + fail $"failed to verify integrity or prepare %s package" "${errmakepkgs[@]/%/${reset}}" # remove sudo lock - rm -f "${tmpdir:?}/pacaur.sudov.lck" + rm -f "${tmpdir}/pacaur.sudov.lck" exit "${E_FAIL}" fi @@ -1231,35 +1167,35 @@ MakePkgs() { # set build lock [[ ! -e "${tmpdir}/pacaur.build.lck" ]] || error $"pacaur.build.lck exists in %s" "${tmpdir}" "${E_FAIL}" - : >"${tmpdir}/pacaur.build.lck" + :>"${tmpdir}/pacaur.build.lck" # install provider packages and repo conflicting packages that makepkg --noconfirm cannot handle if [[ "${repoprovidersconflictingpkgs[*]}" ]]; then info $"Installing %s dependencies..." "${colorW}${repoprovidersconflictingpkgs[*]}${reset}" - sudo "${pacmanbin}" -S "${repoprovidersconflictingpkgs[@]}" --ask 36 --asdeps --noconfirm + sudo "${pacman}" -S "${repoprovidersconflictingpkgs[@]}" --ask 36 --asdeps --noconfirm fi # main for i in "${!basepkgs[@]}"; do - IFS=',' read -ra pkgsdepslist <<< "${pkgsdeps[i]}" # get split packages list + mapfile -td',' pkgsdepslist < <(printf '%s' "${pkgsdeps[i]}") # get split packages list - cd "${clonedir}/${basepkgs[i]}" || exit "${E_MISSING_FILE}" + cd_safe "${clonedir}/${basepkgs[i]}" # retrieve updated version - mapfile -td'-' k < <(makepkg --packagelist); aurpkgsAver="${k[-3]}-${k[-2]}"; unset k + mapfile -td'-' k < <(makepkg --packagelist); aurpkgsAver="${k[-3]}-${k[-2]}"; unset -v k # build devel if necessary only (supported protocols only) if [[ "${basepkgs[i]}" = *${vcs} ]]; then # check split packages update - unset basepkgsupdate checkpkgsdepslist + checkpkgsdepslist=() for j in "${pkgsdepslist[@]}"; do - read -rd' ' < <(expac -Qs '%v' "^${j}$") aurpkgsQver + aurpkgsQver="$(expac -Qs '%v' "^${j}$")" if ((needed && ! rebuild)) && - [[ "${aurpkgsQver}" && "$(vercmp "${aurpkgsQver}" "${aurpkgsAver}")" -ge 0 ]]; then - warn $"%s is up-to-date -- skipping" "${colorW}${j}${reset}" && continue + [[ "${aurpkgsQver}" && "$(Vercmp "${aurpkgsQver}" "${aurpkgsAver}")" -ge 0 ]]; then + warn $"%s is up-to-date -- skipping" "${colorW}${j}${reset}"; continue else - basepkgsupdate='true'; checkpkgsdepslist+=("${j}") + checkpkgsdepslist+=("${j}") fi done - if [[ "${basepkgsupdate}" ]]; then + if [[ "${checkpkgsdepslist[*]}" ]]; then pkgsdepslist=("${checkpkgsdepslist[@]}") else continue @@ -1268,21 +1204,21 @@ MakePkgs() { # check package cache for j in "${pkgsdepslist[@]}"; do - unset builtpkg - [[ "${PKGDEST}" ]] && ((! rebuild)) && GetBuiltPkg "${j}-${aurpkgsAver}" "${PKGDEST}" + builtpkg='' + [[ ! "${PKGDEST}" ]] || ((rebuild)) || GetBuiltPkg "${j}-${aurpkgsAver}" "${PKGDEST}" if [[ "${builtpkg}" ]]; then if [[ " ${aurdepspkgs[*]} " = *" ${j} "* ]] || ((installpkg)); then info $"Installing %s cached package..." "${colorW}${j}${reset}" - sudo "${pacmanbin}" -U --ask 36 --noconfirm "${pacopts[@]//--quiet}" -- "${builtpkg}" + sudo "${pacman}" -U --ask 36 --noconfirm "${pacopts[@]}" "${builtpkg}" [[ " ${aurpkgs[*]} " = *" ${j} "* ]] || - sudo "${pacmanbin}" -D "${j}" --asdeps "${pacopts[@]}" &>/dev/null + sudo "${pacman}" -D "${j}" --asdeps "${pacopts[@]}" &>/dev/null else warn $"Package %s already available in cache" "${colorW}${j}${reset}" fi pkgsdeps=("${pkgsdeps[@]/#${j},}"); pkgsdeps=("${pkgsdeps[@]/%,${j}}") pkgsdeps=("${pkgsdeps[@]//,${j},/,}") for k in "${!pkgsdeps[@]}"; do - [[ "${pkgsdeps[k]}" = "${j}" ]] && pkgsdeps[k]='%' + [[ "${pkgsdeps[k]}" != "${j}" ]] || pkgsdeps[k]='%' done continue fi @@ -1298,13 +1234,13 @@ MakePkgs() { if ((! installpkg)); then isaurdeps=0 for j in "${pkgsdepslist[@]}"; do - [[ " ${aurdepspkgs[*]} " = *" ${j} "* ]] && isaurdeps=1 + [[ " ${aurdepspkgs[*]} " != *" ${j} "* ]] || isaurdeps=1 done - ((isaurdeps)) && makeopts+=('-r') + ((! isaurdeps)) || makeopts+=('-r') fi # skip install for packages that fail to build - if [[ "${silent}" = 'true' ]]; then + if ((silent)); then makepkg -sefc "${makeopts[@]}" --noconfirm &>/dev/null || { errmakepkgs+=("${pkgsdeps[i]}"); continue; } else @@ -1312,13 +1248,13 @@ MakePkgs() { fi # retrieve filename - unset builtpkgs builtdepspkgs + builtpkgs=() builtdepspkgs=() for j in "${pkgsdepslist[@]}"; do - unset builtpkg + builtpkg='' if [[ "${PKGDEST}" ]]; then GetBuiltPkg "${j}-${aurpkgsAver}" "${PKGDEST}" else - GetBuiltPkg "${j}-${aurpkgsAver}" "${clonedir:?}/${basepkgs[i]}" + GetBuiltPkg "${j}-${aurpkgsAver}" "${clonedir}/${basepkgs[i]}" fi [[ " ${aurdepspkgs[*]} " = *" ${j} "* ]] && builtdepspkgs+=("${builtpkg}") || builtpkgs+=("${builtpkg}") @@ -1327,16 +1263,16 @@ MakePkgs() { # install if ((installpkg)) || [[ ! "${builtpkgs[*]}" ]]; then info $"Installing %s package(s)..." "${colorW}${pkgsdeps[i]}${reset}" - sudo "${pacmanbin}" -U "${builtdepspkgs[@]}" "${builtpkgs[@]}" \ - --ask 36 "${pacopts[@]//--quiet}" --noconfirm + sudo "${pacman}" -U "${builtdepspkgs[@]}" "${builtpkgs[@]}" \ + --ask 36 "${pacopts[@]}" --noconfirm fi # set dep status if ((installpkg)); then for j in "${pkgsdepslist[@]}"; do - [[ " ${aurpkgs[*]} " = *" ${j} "* ]] || sudo "${pacmanbin}" -D "${j}" --asdeps &>/dev/null - ((asdeps)) && sudo "${pacmanbin}" -D "${j}" --asdeps &>/dev/null - ((asexplicit)) && sudo "${pacmanbin}" -D "${j}" --asexplicit &>/dev/null + [[ " ${aurpkgs[*]} " = *" ${j} "* ]] || sudo "${pacman}" -D "${j}" --asdeps &>/dev/null + ((! asdeps)) || sudo "${pacman}" -D "${j}" --asdeps &>/dev/null + ((! asexplicit)) || sudo "${pacman}" -D "${j}" --asexplicit &>/dev/null done fi done @@ -1345,73 +1281,65 @@ MakePkgs() { if ((! installpkg)); then [[ ! "${aurdepspkgs[*]}" ]] || mapfile -t aurdepspkgs < <(expac -Q '%n' "${aurdepspkgs[@]}") [[ ! "${aurdepspkgs[*]}" ]] || { info $"Removing installed AUR dependencies..." - sudo "${pacmanbin}" -Rsn "${aurdepspkgs[@]}" --noconfirm; } + sudo "${pacman}" -Rsn "${aurdepspkgs[@]}" --noconfirm; } # re-add removed conflicting packages - [[ ! "${aurconflictingpkgsrm[*]}${repoconflictingpkgsrm[*]}" ]] || sudo "${pacmanbin}" -S \ + [[ ! "${aurconflictingpkgsrm[*]}${repoconflictingpkgsrm[*]}" ]] || sudo "${pacman}" -S \ "${aurconflictingpkgsrm[@]}" "${repoconflictingpkgsrm[@]}" --ask 36 --asdeps --needed --noconfirm fi - # remove locks - rm "${tmpdir:?}/pacaur.build.lck" - rm -f "${tmpdir:?}/pacaur.sudov.lck" + rm -f "${tmpdir}/pacaur."{'build','sudov'}'.lck' # remove locks # new orphan and optional packages check - mapfile -t orphanpkgs < <("${pacmanbin}" -Qdtq) - mapfile -t neworphanpkgs < <(CommArr 'oldorphanpkgs' 'orphanpkgs' '-13') - for i in "${neworphanpkgs[@]}"; do + mapfile -t orphanpkgs < <("${pacman}" -Qdtq) + while read -r i; do warn $"%s is now an %sorphan%s package" "${colorW}${i}${reset}" "${colorY}" "${reset}" - done - mapfile -t optionalpkgs < <("${pacmanbin}" -Qdttq) - mapfile -t optionalpkgs < <(CommArr 'orphanpkgs' 'optionalpkgs' '-13') - mapfile -t newoptionalpkgs < <(CommArr 'oldoptionalpkgs' 'optionalpkgs' '-13') - for i in "${newoptionalpkgs[@]}"; do + done < <(CommArr -13 oldorphanpkgs orphanpkg) + mapfile -t optionalpkgs < <("${pacman}" -Qdttq) + mapfile -t optionalpkgs < <(CommArr -13 orphanpkgs optionalpkgs) + while read -r i; do warn $"%s is now an %soptional%s package" "${colorW}${i}${reset}" "${colorY}" "${reset}" - done + done < <(CommArr -13 oldoptionalpkgs optionalpkgs) # makepkg and install failure check - if [[ "${errmakepkg[*]}" ]]; then - for i in "${errmakepkg[@]}"; do - fail $"failed to build %s package(s)" "${colorW}${i}${reset}" - done + if [[ "${errmakepkgs[*]}" ]]; then + errmakepkgs=("${errmakepkgs[@]/#/${colorW}}") + fail $"failed to build %s package(s)" "${errmakepkgs[@]/%/${reset}}" exit "${E_PACKAGE_FAILED}" fi - [[ "${errinstall[*]}" ]] && exit "${E_INSTALL_FAILED}" } CleanCache() { - local i cachepkgs foreignpkgs foreignpkgsbase - mapfile -t cachedir < <(pacman-conf CacheDir) + local cachepkgs foreignpkgs foreignpkgsbase + mapfile -t cachedir < <("${pacman_conf[@]}" CacheDir) [[ ! "${cachedir[*]}" ]] || cachedir=("${cachedir[@]%/}") PKGDEST="${PKGDEST%/}" if [[ "${PKGDEST}" && " ${cachedir[*]} " != *" ${PKGDEST} "* ]]; then - ((ccount == 1)) && printf '\n%s\n %s\n' $"Packages to keep:" $"All locally installed packages" + ((ccount != 1)) || printf '\n%s\n %s\n' $"Packages to keep:" $"All locally installed packages" printf '\n%s %s\n' $"AUR cache directory:" "${PKGDEST}" if ((ccount == 1)); then if Proceed y $"Do you want to remove all other packages from AUR cache?"; then printf '%s\n' $"removing old packages from cache..." - cachepkgs=("${PKGDEST:?}"/*); cachepkgs=("${cachepkgs[@]##*/}") + cachepkgs=("${PKGDEST}/"*) cachepkgs=("${cachepkgs[@]##*/}") for i in "${cachepkgs[@]%-*}"; do - [[ "${i}" != "$(expac -Q '%n-%v' "${i%-*-*}")" ]] && rm "${PKGDEST:?}/${i}"-* + [[ "${i}" = "$(expac -Q '%n-%v' "${i%-*-*}")" ]] || rm "${PKGDEST}/${i}-"* done fi else Proceed n $"Do you want to remove ALL files from AUR cache?" || { printf '%s\n' $"removing all files from AUR cache..." - rm "${PKGDEST:?}/"* &>/dev/null; } + rm "${PKGDEST}/"* &>/dev/null; } fi fi if [[ -d "${SRCDEST}" ]]; then - ((ccount == 1)) && - printf '\n%s\n %s\n' $"Sources to keep:" $"All development packages sources" + ((ccount != 1)) || printf '\n%s\n %s\n' $"Sources to keep:" $"All development packages sources" printf '\n%s %s\n' $"AUR source cache directory:" "${SRCDEST}" - if ((ccount == 1)); then - Proceed y $"Do you want to remove all non development files from AUR source cache?" && - printf '%s\n' $"removing non development files from source cache..." && - rm -f "${SRCDEST:?}"/* &>/dev/null - else - Proceed n $"Do you want to remove ALL files from AUR source cache?" || - printf '%s\n' $"removing all files from AUR source cache..." && - rm -rf "${SRCDEST:?}"/* + if ((ccount == 1)) && + Proceed y $"Do you want to remove all non development files from AUR source cache?"; then + printf '%s\n' $"removing non development files from source cache..." + rm -f "${SRCDEST}/"* &>/dev/null + elif ! Proceed n $"Do you want to remove ALL files from AUR source cache?"; then + printf '%s\n' $"removing all files from AUR source cache..." + rm -rf "${SRCDEST:?}/"* fi fi if [[ -d "${clonedir}" ]]; then @@ -1424,23 +1352,23 @@ CleanCache() { fi printf '\n%s %s\n' $"AUR clone directory:" "${clonedir}" if ((ccount == 1)); then - mapfile -t foreignpkgs < <("${pacmanbin}" -Qmq) + mapfile -t foreignpkgs < <("${pacman}" -Qmq) mapfile -t foreignpkgsbase < <(expac -Q '%e' "${foreignpkgs[@]}") # get target if [[ "${pkgs[*]}" ]]; then mapfile -t pkgsbase < <(expac -Q '%e' "${pkgs[@]}") - mapfile -t aurpkgsbase < <(CommArr 'pkgsbase' 'foreignpkgsbase' '-12') + mapfile -t aurpkgsbase < <(CommArr -13 pkgsbase foreignpkgsbase) if Proceed y $"Do you want to remove %s clones from AUR clone directory?" \ "${aurpkgsbase[*]}"; then printf '%s\n\n' $"removing uninstalled clones from AUR clone cache..." for i in "${aurpkgsbase[@]}"; do - [[ -d "${clonedir}/${i}" ]] && rm -rf "${clonedir:?}/${i}" + [[ ! -d "${clonedir}/${i}" ]] || rm -rf "${clonedir:?}/${i}" done fi else if Proceed y $"Do you want to remove all uninstalled clones from AUR clone directory?"; then printf '%s\n\n' $"removing uninstalled clones from AUR clone cache..." - for i in "${clonedir:?}/"*; do + for i in "${clonedir}/"*; do [[ ! -d "${i}" || " ${foreignpkgsbase[*]} " = *" ${i} "* ]] || rm -rf "${clonedir:?}/${i}" done @@ -1448,8 +1376,8 @@ CleanCache() { if [[ ! "${PKGDEST}" || ! "${SRCDEST}" ]]; then if Proceed y $"Do you want to remove all untracked files from AUR clone directory?"; then printf '%s\n' $"removing untracked files from AUR clone cache..." - for i in "${clonedir:?}/"*; do - [[ -d "${i}" ]] && + for i in "${clonedir}/"*; do + [[ ! -d "${i}" ]] || git --git-dir="${i}/.git" --work-tree="${i}" clean -ffdx &>/dev/null done fi @@ -1458,9 +1386,7 @@ CleanCache() { else if ! Proceed n $"Do you want to remove ALL clones from AUR clone directory?"; then printf '%s\n' $"removing all clones from AUR clone cache..." - for i in "${clonedir:?}/"*; do - [[ -d "${i}" ]] && rm -rf "${i}" - done + for i in "${clonedir}/"*; do [[ ! -d "${i}" ]] || rm -rf "${i}"; done fi fi fi @@ -1469,25 +1395,18 @@ CleanCache() { GetIgnoredPkgs() { # global ignoredpkgs - mapfile -tO "${#ignoredpkgs[@]}" ignoredpkgs < <(pacman-conf IgnorePkg) - ignoredpkgs=("${ignoredpkgs[@]//,/ }") + mapfile -tO "${#ignoredpkgs[@]}" ignoredpkgs < <("${pacman_conf[@]}" IgnorePkg) } GetIgnoredGrps() { # global ignoredgrps - mapfile -tO "${#ignoredgrps[@]}" ignoredgrps < <(pacman-conf IgnoreGroup) - ignoredgrps=("${ignoredgrps[@]//,/ }") + mapfile -tO "${#ignoredgrps[@]}" ignoredgrps < <("${pacman_conf[@]}" IgnoreGroup) } GetInstallScripts() { - local installscriptspath # global installscripts - [[ -d "${clonedir}/$1" ]] || return - unset installscriptspath installscripts - shopt -s nullglob - installscriptspath=("${clonedir}/$1/"*'.install') - shopt -u nullglob - [[ "${installscriptspath[*]}" ]] && installscripts=("${installscriptspath[@]##*/}") + [[ ! -d "${clonedir}/$1" ]] || + installscripts=("${clonedir}/$1/"*'.install') installscripts=("${installscripts[@]##*/}") } GetBuiltPkg() { @@ -1498,99 +1417,98 @@ GetBuiltPkg() { for ext in "${PKGEXT}" .pkg.tar{.xz,,.gz,.bz2,.lzo,.lrz,.Z}; do builtpkg="$2/$1-${CARCH}${ext}" [[ -f "${builtpkg}" ]] || builtpkg="$2/$1-any${ext}" - [[ -f "${builtpkg}" ]] && break + [[ ! -f "${builtpkg}" ]] || break done - [[ -f "${builtpkg}" ]] || { unset builtpkg; return 1; } + [[ -f "${builtpkg}" ]] || { builtpkg=''; return 1; } } GetPkgbase() { local i # global pkgsbase basepkgs + [[ "${pkgsbase[*]:-}" ]] || pkgsbase=() SetInfo "$@" for i in "$@"; do - pkgsbase+=("$(GetInfo PackageBase "${i}")") + mapfile -tO "${#pkgsbase[@]}" pkgsbase < <(GetInfo PackageBase "${i}") done for i in "${pkgsbase[@]}"; do [[ " ${basepkgs[*]} " = *" ${i} "* ]] || basepkgs+=("${i}") done } +# shellcheck disable=SC2034,SC2154 SetInfo() { - # Usage: SetInfo $@ - # Use auracle formatted info output for all aur packages passed to SetInfo, and sort it into - # associated arrays - local fields=(Name PackageBase Version Maintainer OutOfDate Groups {,Make,Check}Depends Provides Conflicts) - local auracle_packages=("$@") cache_array=() info_arrays=() i j - - # cache previous info arrays in temporary arrays of the same names, but prefixed with c - if [[ "${Name[*]}" ]]; then - mapfile -t cache_array < <(declare -p "${fields[@]}") - local -A "${cache_array[@]/#declare -A /c}" - fi + # Use auracle formatted info output for all aur packages passed to SetInfo, + # and sort it into associated arrays + local i apkgs=() ainfo=() + local -n field - unset "${fields[@]}" + unset -v Name PackageBase Version Maintainer OutOfDate Groups {,Make,Check}Depends Provides Conflicts [[ "$*" ]] || return - declare -Ag "${fields[@]}" + declare -Ag \ + {,c}{Name,PackageBase,Version,Maintainer,OutOfDate,Groups,{,Make,Check}Depends,Provides,Conflicts} - for i in "${!cName[@]}"; do - if [[ " $* " = *" ${cName[${i}]} "* ]]; then - for j in "${!auracle_packages[@]}"; do - [[ "${cName[${i}]}" != "${auracle_packages[j]}" ]] || unset "auracle_packages[${j}]" - done - Name[${i}]="${cName[${i}]}" - PackageBase[${i}]="${cPackageBase[${i}]}" - Version[${i}]="${cVersion[${i}]}" - Maintainer[${i}]="${cMaintainer[${i}]}" - OutOfDate[${i}]="${cOutOfDate[${i}]}" - Groups[${i}]="${cGroups[${i}]}" - Depends[${i}]="${cDepends[${i}]}" - MakeDepends[${i}]="${cMakeDepends[${i}]}" - CheckDepends[${i}]="${cCheckDepends[${i}]}" - Provides[${i}]="${cProvides[${i}]}" + for i in "$@"; do + if [[ " ${cName[*]} " = *" ${i} "* ]]; then + Name[${i}]="${cName[${i}]}" PackageBase[${i}]="${cPackageBase[${i}]}" + Version[${i}]="${cVersion[${i}]}" Maintainer[${i}]="${cMaintainer[${i}]}" + OutOfDate[${i}]="${cOutOfDate[${i}]}" Groups[${i}]="${cGroups[${i}]}" + Depends[${i}]="${cDepends[${i}]}" MakeDepends[${i}]="${cMakeDepends[${i}]}" + CheckDepends[${i}]="${cCheckDepends[${i}]}" Provides[${i}]="${cProvides[${i}]}" Conflicts[${i}]="${cConflicts[${i}]}" + else + apkgs+=("${i}") fi done - if [[ "${auracle_packages[*]}" ]]; then - mapfile -t info_arrays < <(auracle info "${auracle_packages[@]}" -F \ - $'Name[{name}]={name}\nPackageBase[{name}]={pkgbase}\nVersion[{name}]={version}\nMaintainer[{name}]={maintainer}\nOutOfDate[{name}]={outofdate:%s}\nGroups[{name}]={groups:\037}\nDepends[{name}]={depends:\037}\nMakeDepends[{name}]={makedepends:\037}\nCheckDepends[{name}]={checkdepends:\037}\nProvides[{name}]={provides:\037}\nConflicts[{name}]={conflicts:\037}') - [[ ! "${info_arrays[*]}" ]] || declare -g "${info_arrays[@]}" - fi + if [[ "${apkgs[*]}" ]]; then + mapfile -t ainfo < <(auracle info "${apkgs[@]}" -F \ + $'Name[{name}]={name}\nPackageBase[{name}]={pkgbase} + Version[{name}]={version}\nMaintainer[{name}]={maintainer} + OutOfDate[{name}]={outofdate:%s}\nGroups[{name}]={groups} + Depends[{name}]={depends}\nMakeDepends[{name}]={makedepends} + CheckDepends[{name}]={checkdepends}\nProvides[{name}]={provides} + Conflicts[{name}]={conflicts}'); ainfo=("${ainfo[@]##* }") + [[ ! "${ainfo[*]}" ]] || declare -g "${ainfo[@]}" "${ainfo[@]/#/c}" + fi + for i in "${!Maintainer[@]}"; do : "${Maintainer[${i}]:=%}"; done + for field in Groups Depends MakeDepends CheckDepends Provides Conflicts; do + for i in "${!field[@]}"; do + [[ "${field[${i}]}" ]] || unset -v "field[${i}]" + done + done } GetInfo() { - local -n field="$1" - - if [[ "$2" ]]; then - printf '%s\n' "${field[$2]//$'\037'/$'\n'}" - else - printf '%s\n' "${field[@]//$'\037'/ }" + local field + field="$(declare -p "$1")" + local -A "${field/#declare -A $1/field}"; shift + + if (("$#")) && [[ "$1" && "${field[$1]:-}" ]]; then + printf '%s\n' "${field[$1]// /$'\n'}" + elif ((! "$#")); then + [[ ! "${field[*]}" ]] || printf '%s\n' "${field[@]// /$'\n'}" fi } CheckRequires() { local -a Qrequires - mapfile -t Qrequires < <(expac -Ql'\n' '%N' "$@") - if [[ "${Qrequires[*]}" ]]; then + if mapfile -t Qrequires < <(expac -Ql'\n' '%N' "$@"); wait "$!"; then fail $"failed to prepare transaction (could not satisfy dependencies)" error $"%s: requires %s" "${Qrequires[*]}" "$*" "${E_INSTALL_DEPS_FAILED}" fi } Proceed() { - local answer ret readline=0 + local answer ret readfullline=0 - if [[ "${TERM-}" = 'dumb' ]] || ((cleancache)); then - readline=1 + if [[ "${TERM:-}" = 'dumb' ]] || ((clean)); then + readfullline=1 fi case "$1" in y) printf "%s::%s %s$2 [Y/n] %s" "${colorB}" "${reset}" "${colorW}" "${@:3}" "${reset}" - if ((noconfirm)); then - printf '\n' - return 0 - fi - while true; do - if ((readline)); then + ((! noconfirm)) || { printf '\n'; return 0; } + for ((;;)); do + if ((readfullline)); then read -r answer else read -rsn 1 answer @@ -1598,106 +1516,121 @@ Proceed() { case "${answer}" in [Yy]|'') ret=0; break;; [Nn]) ret=1; break;; - *) ((readline)) && ret=1 && break;; + *) ((! readfullline)) || { ret=1; break; };; esac done;; n) printf "%s::%s %s$2 [y/N] %s" "${colorB}" "${reset}" "${colorW}" "${@:3}" "${reset}" - if ((noconfirm)); then - printf '\n' - return 0 - fi - while true; do - if ((readline)); then + ((! noconfirm)) || { printf '\n'; return 0; } + for ((;;)); do + if ((readfullline)); then read -r answer else - read -rsn 1 answer + read -rsn1 answer fi case "${answer}" in [Nn]|'') ret=0; break;; [Yy]) ret=1; break;; - *) ((readline)) && ret=0 && break;; + *) ((! readfullline)) || { ret=0; break; };; esac done;; esac - ((readline)) || printf '%s\n' "${answer}" + ((readfullline)) || printf '%s\n' "${answer}" return "${ret}" } +msg() { # shellcheck disable=SC2059 + printf "$1 $2\n" "${@:3}" +} + info() { - printf "%s::%s $1\n" "${colorB}" "${reset}" "${@:2}" + msg "${colorB}::${reset}" "$@" } warn() { - printf "%swarning:%s $1\n" "${colorY}" "${reset}" "${@:2}" >&2 + msg "${colorY}warning:${reset}" "$@" >&2 } fail() { - printf "%serror:%s $1\n" "${colorR}" "${reset}" "${@:2}" >&2 + msg "${colorR}error:${reset}" "$@" >&2 } error() { - printf "%serror:%s $1\n" "${colorR}" "${reset}" "${@:2:$#-2}" >&2 - exit "${!#}" + fail "${@:1:$#-1}"; exit "${!#}" } GetLength() { local length=0 i for i in "$@"; do - (("${#i}" > length)) && length="${#i}" + ((length="${#i}" > length ? "${#i}" : length)) done printf '%s\n' "${length}" } NothingToDo() { - [[ ! "$*" ]] && printf '%s\n' $" there is nothing to do" && exit "${E_OK}" || return 0 + [[ "$*" ]] || { printf '%s\n' $" there is nothing to do"; exit "${E_OK}"; } } SudoV() { - : >"${tmpdir}/pacaur.sudov.lck" + local sleep + :>"${tmpdir}/pacaur.sudov.lck" + exec {sleep}<> <(:) while [[ -e "${tmpdir}/pacaur.sudov.lck" ]]; do - sudo "${pacmanbin}" -V >/dev/null - sleep 298 + sudo "${pacman}" -V >/dev/null + read -rt 298 -u "${sleep}" || : done } CommArr() { - # args are names of 2 arrays and outputs elements that are only in the 2nd - local array1="$1[@]" array2="$2[@]" - comm <(sort -u <(printf '%s\n' "${!array1-}")) <(sort -u <(printf '%s\n' "${!array2-}")) "$3" + # args are names of 2 array names and arguments to comm + local arr='' arr1="$2[@]" arr2="$3[@]" + [[ ! "${arr:=$(comm "$1" <(SortArr "${!arr1}") <(SortArr "${!arr2}"))}" ]] || + printf '%sii' "${arr}" +} + +SortArr() { + local IFS=$'\n' + ((! "$#")) || sort -u <<<"$*" # pass all arguments to sort -u +} + +Vercmp() { + case "$1" in + "$2") printf '%d' 0;; + *) vercmp "$1" "$2";; + esac } -trap Cancel INT Cancel() { printf '\n' - rm -f "${tmpdir:?}"/pacaur.{build,sudov}.lck - exit + rm -f "${tmpdir}"/pacaur.{build,sudov}.lck + exit 130 } Usage() { - printf '%s\n' $"usage: pacaur <operation> [options] [target(s)] -- See also pacaur(8)" - printf '%s\n' $"operations:" - printf '%s\n' $" pacman extension" - printf '%s\n' $" -S, -Ss, -Si, -Sw, -Su, -Qu, -Sc, -Scc" - printf '%s\n' $" extend pacman operations to the AUR" - printf '%s\n' $" general" - printf '%s\n' $" -v, --version display version information" - printf '%s\n' $" -h, --help display help information" - printf '\n' - printf '%s\n' $"options:" - printf '%s\n' $" pacman extension - can be used with the -S, -Ss, -Si, -Sw, -Su, -Sc, -Scc operations" - printf '%s\n' $" -a, --aur only search, build, install or clean target(s) from the AUR" - printf '%s\n' $" -r, --repo only search, build, install or clean target(s) from the repositories" - printf '%s\n' $" general" - printf '%s\n' $" -e, --edit edit target(s) PKGBUILD and view install script" - printf '%s\n' $" -q, --quiet show less information for query and search" - printf '%s\n' $" --devel consider AUR development packages upgrade" - printf '%s\n' $" --foreign consider already installed foreign dependencies" - printf '%s\n' $" --ignore ignore a package upgrade (can be used more than once)" - printf '%s\n' $" --needed do not reinstall already up-to-date target(s)" - printf '%s\n' $" --noconfirm do not prompt for any confirmation" - printf '%s\n' $" --noedit do not prompt to edit files" - printf '%s\n' $" --rebuild always rebuild package(s)" - printf '%s\n' $" --silent silence output" + printf '%s\n' \ + $"usage: pacaur <operation> [options] [target(s)] -- See also pacaur(8)" \ + $"operations:" \ + $" pacman extension" \ + $" -S, -Ss, -Si, -Sw, -Su, -Qu, -Sc, -Scc" \ + $" extend pacman operations to the AUR" \ + $" general" \ + $" -v, --version display version information" \ + $" -h, --help display help information" \ + '' \ + $"options:" \ + $" pacman extension - can be used with the -S, -Ss, -Si, -Sw, -Su, -Sc, -Scc operations" \ + $" -a, --aur only search, build, install or clean target(s) from the AUR" \ + $" -r, --repo only search, build, install or clean target(s) from the repositories" \ + $" general" \ + $" -e, --edit edit target(s) PKGBUILD and view install script" \ + $" -q, --quiet show less information for query and search" \ + $" --devel consider AUR development packages upgrade" \ + $" --foreign consider already installed foreign dependencies" \ + $" --ignore ignore a package upgrade (can be used more than once)" \ + $" --needed do not reinstall already up-to-date target(s)" \ + $" --noconfirm do not prompt for any confirmation" \ + $" --noedit do not prompt to edit files" \ + $" --rebuild always rebuild package(s)" \ + $" --silent silence output" exit "${E_OK}" } @@ -1705,66 +1638,74 @@ Usage() { # Main # +trap Cancel INT + # options -shortopts="DFQRSTUVacdefghiklmnopqrstuvwxy" +shortopts='DFQRSTUVacdeghiklmnopqrstuvwxy' longopts=('help' 'database' 'files' 'query' 'remove' 'sync' 'deptest' 'upgrade') +printf -v case_ops '%s|' "${longopts[@]}" longopts+=('asdeps' 'asexplicit' 'cascade' 'changelog' 'check' 'clean' 'confirm' 'dbonly' 'debug' 'deps' 'disable-download-timeout' 'downloadonly' 'explicit' 'file' 'foreign' 'groups' 'info' 'list' 'machinereadable' 'native' 'needed' 'noconfirm' 'nodeps' 'noprogressbar' 'nosave' 'noscriptlet' 'owns' 'print' 'recursive' 'refresh' 'regex' 'quiet' 'search' 'sysupgrade' 'unneeded' 'unrequired' 'upgrades' 'verbose') -longopts+=('arch:' 'assume-installed:' 'cachedir:' 'color:' 'config:' 'dbpath:' 'gpgdir:' 'hookdir:' - 'ignore:' 'ignoregroup:' 'logfile:' 'overwrite:' 'print-format:' 'root:' 'sysroot:') -longopts_aur=('aur' 'by:' 'devel' 'edit' 'literal' 'noedit' 'rebuild' 'repo' 'rsort:' 'searchby:' +printf -v case_lo '%s|' "${longopts[@]}" +longopts_arg=('arch:' 'assume-installed:' 'cachedir:' 'color:' 'config:' 'dbpath:' 'gpgdir:' 'hookdir:' + 'ignore:' 'ignoregroup:' 'logfile:' 'overwrite:' 'print-format:' 'root:' 'sysroot:') +printf -v case_lo_arg '%s|' "${longopts_arg[@]%:}" +longopts_aur=('aur' 'by:' 'devel' 'edit' 'literal' 'noedit' 'rebuild' 'repo' 'rsort:' 'searchby:' 'silent' 'sort:' 'update' 'version') -parseopts "${shortopts}" "${longopts[@]}" "${longopts_aur[@]}" -- "$@" || exit "${E_INVALID_OPTION}" +parseopts "${shortopts}" "${longopts[@]}" "${longopts_arg[@]}" "${longopts_aur[@]}" -- "$@" || + exit "${E_INVALID_OPTION}" set -- "${OPTRET[@]}" -while true; do - [[ "$1" != -[cdf-qs-zDFQRSTUV] ]] || pacmanarg+=("$1") - for i in "${longopts[@]}"; do - [[ "$1" != '--'@(version|database|files|query|remove|sync|deptest|upgrade) ]] || - { tmp="${1:1:2}" pacmanarg+=("${tmp^^}"); break; } - [[ "$1" != "--${i}" ]] || pacopts+=("$1") - [[ "$1": != "--${i}" ]] || pacopts+=("$1=$2") - done +for ((;;)); do case "$1" in - -S|--sync) pacS=1 pac+=1 installpkg=1 operation='sync';; - -Q|--query) pacQ=1 pac+=1;; - -s|--search) search=1;; - -i|--info) info=1;; - -e|--edit) pace=1;; - -u|--upgrades|--sysupgrade) upgrade=1 installpkg=1;; - -q|--quiet) declare -x QUIET=1; auropts+=("$1");; - -c|--clean) cleancache=1 ccount+=1;; - -n|--native) native=1;; - -r|--repo) repo=1;; - -a|--aur) aur=1;; - --ignore) ignoredpkgs+=("$2"); shift;; - --color) color="$2"; shift;; - --literal) auropts+=("$1");; - --?(search)by) auropts+=("--searchby=$2"); shift;; - --sort) sortorder='ascending' sortby="$2"; shift;; - --rsort) sortorder='descending' sortby="$2"; shift;; - -d|--nodeps) nodeps=1 makeopts+=("$1") dcount+=1;; - --assume-installed) assumeinstalled+=("$2"); shift;; - -[DFRTUV]|--@(database|files|remove|deptest|upgrade)) pac+=1;; - --@(asdeps|asexplicit|devel|needed|noconfirm|noedit|rebuild)) declare "${1#--}"=1;; - -[glp]|--@(groups|list|print)) noop=1;; - -w|--downloadonly) downloadonly=1;; - --silent) silent='true' pacopts+=('--quiet') auropts+=('--quiet') makeopts+=('--log');; - -y|--refresh) refresh=1;; - -h|--help) help=1;; - --version) operation='version' pac+=1;; - -v) ver=1;; - --) shift; break;; + -S|--sync) pacS=1 installpkg=1 operation='sync';;& + -Q|--query) pacQ=1;;& + -c|--clean) clean=1 ccount+=1;;& + -d|--nodeps) makeopts+=("$1") dcount+=1;;& + -[glp]|--@(groups|list|print)) noop=1;;& + -h|--help) help=1;;& + -i|--info) info=1;;& + -n|--native) repo=1;;& + -q|--quiet) QUIET=1 pacmanarg+=('-q') auropts+=("$1");; + -s|--search) search=1;;& + -u|--upgrades|--sysupgrade) upgrade=1 installpkg=1;;& + -v) ver=1;;& + -w|--downloadonly) downloadonly=1;;& + -y|--refresh) refresh=1;;& + --as@(deps|explicit)) declare "${1#--}"=1;;& + --@(needed|noconfirm)) declare "${1#--}"=1;;& + --assume-installed) assumeinstalled+=("$2");;& + --color) color="$2";;& + --config) pacman_conf+=("$1" "$2");;& + --ignore) mapfile -tO "${#ignoredpkgs[@]}" ignoredpkgs <<<"${2//,/$'\n'}";;& + --ignoregroup) mapfile -tO "${#ignoredgrps[@]}" ignoredgrps <<<"${2//,/$'\n'}";;& + --version) operation='version';;& + -e|--edit) pace=1;; + -a|--aur) aur=1;; + -r|--repo) repo=1;; + --@(devel|noedit|rebuild)) declare "${1#--}"=1;; + --literal) auropts+=("$1");; + --silent) silent=1 pacmanarg+=('-q') auropts+=('-q') makeopts+=('-L');; + --?(search)by) auropts+=("--searchby=$2"); shift;; + --sort) sortorder='ascending' sortby="$2"; shift;; + --rsort) sortorder='descending' sortby="$2"; shift;; + -[DFQRSTUV]) pacmanarg+=("$1") pac+=1;; + -[cg-ik-qs-y]) pacmanarg+=("$1");; + --@(${case_ops%|})) pacmanarg+=("${1:1:2}") pacmanarg[-1]="${pacmanarg[-1]^^}" pac+=1;; + --@(${case_lo%|})|-d) pacopts+=("$1");; + --@(${case_lo_arg%|})) pacopts+=("$1=$2"); shift;; + --) shift; break;; esac shift done # help or version -[[ "${operation}" = 'version' ]] || ((! pac || ver)) && { printf 'pacaur %s\n' "${version}"; exit "${E_OK}"; } -((! pac && help)) && Usage +{ [[ "${operation}" != 'version' ]] && ((pac || ! ver)); } || + { printf 'pacaur %s\n' "${version}"; exit "${E_OK}"; } +((pac || ! help)) || Usage # sorting case "${sortorder}" in @@ -1776,28 +1717,27 @@ esac pkgs=("$@") # color -[[ ! "${color}" && (! "$(pacman-conf Color)" || "${operation}" = 'upgrades' || - "${QUIET}" -ne 0 && "${search}" -ne 0) ]] && color='never' || color='auto' -pacopts+=("--color=${color}") auropts+=("--color=${color}") -if [[ "${color}" != 'never' ]]; then - declare -r reset=$'\033[0m' colorR=$'\033[1;31m' colorG=$'\033[1;32m' colorY=$'\033[1;33m' \ - colorB=$'\033[1;34m' colorM=$'\033[1;35m' colorW=$'\033[1;39m' -else - declare -r reset='' colorR='' colorG='' colorY='' colorB='' colorM='' colorW='' - makeopts+=('-m') -fi +[[ ! "${color}" && (! "$("${pacman_conf[@]}" Color)" || "${operation}" = 'upgrades' || + QUIET -ne 0 && search -ne 0) ]] && color='never' || color='auto' + +case "${color}" in + never) declare -r reset='' colorR='' colorG='' colorY='' colorB='' colorM='' colorW='' + pacopts+=('--color=never') auropts+=('--color=never') makeopts+=('-m');; + *) declare -r reset=$'\e[0m' colorR=$'\e[1;31m' colorG=$'\e[1;32m' colorY=$'\e[1;33m' \ + colorB=$'\e[1;34m' colorM=$'\e[1;35m' colorW=$'\e[1;39m' + pacopts+=('--color=auto') auropts+=('--color=auto');; +esac # sanity check ((! aur)) || refresh=0 ((! pace || pac)) || operation='edit' -((! pacQ || ! pace)) || pacopts+=('-e') +((! pacQ || ! pace)) || pacmanarg+=('-e') ((! pacQ || ! upgrade)) || operation='upgrades' -((! pacQ || ! native)) || repo=1 ((! pacS || ! downloadonly)) || installpkg=0 ((! pacS || ! noop)) || operation='' -((! pacS || ! cleancache)) || search=0 info=0 upgrade=0 +((! pacS || ! clean)) || search=0 info=0 upgrade=0 ((pac <= 1)) || error $"only one operation may be used at a time" "${E_FAIL}" -[[ "${operation}" != sync ]] || ((search || info || cleancache || EUID)) || +[[ "${operation}" != 'sync' ]] || ((search || info || clean || EUID)) || error $"you cannot perform this operation as root" "${E_ROOT}" ((! pacS || ! search || ! info)) || error $"invalid option: '--info' and '--search' may not be used together" "${E_INVALID_OPTION}" @@ -1809,9 +1749,9 @@ command -v "${editor%% *}" >/dev/null || [[ -w "${clonedir}" ]] || error $"%s does not have write permission" "${colorW}${clonedir}${reset}" "${E_FS_PERMISSIONS}" [[ "${pkgs[*]}" || ("${operation}" != @(sync|edit) && " ${pacmanarg[*]} " != *' -'[RU]' '*) ]] || - ((help+refresh+upgrade+cleancache+info)) || error $"no targets specified (use -h for help)" "${E_FAIL}" -((! repo || ! aur)) || { aur=0 repo=0 - warn $"invalid option: '-r/--repo' and '-a/--aur' may not be used together, disabling both"; } + ((help + refresh + upgrade + clean + info)) || error $"no targets specified (use -h for help)" "${E_FAIL}" +((! repo || ! aur)) || + error $"invalid option: '--repo' and '--aur' may not be used together" "${E_INVALID_OPTION}" # operations case "${operation}" in @@ -1824,56 +1764,50 @@ case "${operation}" in if ((search)); then if ((! aur)); then if ((refresh)); then - sudo "${pacmanbin}" "${pacmanarg[@]}" "${pacopts[@]}" -- "${pkgs[@]}" + sudo "${pacman}" "${pacmanarg[@]}" "${pacopts[@]}" -- "${pkgs[@]}" else - "${pacmanbin}" "${pacmanarg[@]}" "${pacopts[@]}" -- "${pkgs[@]}" + "${pacman}" "${pacmanarg[@]}" "${pacopts[@]}" -- "${pkgs[@]}" fi - exitrepo="$?" fi + exitrepo="$?" if ((! repo)) && [[ "${pkgs[*]}" ]]; then - auracle search "${auropts[@]}" -- "${pkgs[@]#aur/}"; exitaur="$?" + auracle search "${auropts[@]}" -- "${pkgs[@]#aur/}" fi - # exit code - ((! exitrepo || ! exitaur)) && exit "${E_OK}" || exit "${E_FAIL}" + exitaur="$?" + ((! exitrepo || ! exitaur)) && exit "${E_OK}" || exit "${E_FAIL}" # exit code # info (-Si, -i) handling elif ((info)); then if [[ ! "${pkgs[*]}" ]] && ((refresh)); then - sudo "${pacmanbin}" "${pacmanarg[@]}" "${pacopts[@]}" + sudo "${pacman}" "${pacmanarg[@]}" "${pacopts[@]}" elif [[ ! "${pkgs[*]}" ]]; then - "${pacmanbin}" "${pacmanarg[@]}" "${pacopts[@]}" + "${pacman}" "${pacmanarg[@]}" "${pacopts[@]}" else ClassifyPkgs "${pkgs[@]}" fi if [[ "${repopkgs[*]}" ]]; then if ((refresh)); then - sudo "${pacmanbin}" "${pacmanarg[@]}" "${pacopts[@]}" "${repopkgs[@]}" + sudo "${pacman}" "${pacmanarg[@]}" "${pacopts[@]}" "${repopkgs[@]}" else - "${pacmanbin}" "${pacmanarg[@]}" "${pacopts[@]}" "${repopkgs[@]}" + "${pacman}" "${pacmanarg[@]}" "${pacopts[@]}" "${repopkgs[@]}" fi fi if [[ "${aurpkgs[*]}" ]]; then if ((refresh)) && [[ ! "${repopkgs[*]}" ]]; then - sudo "${pacmanbin}" -Sy "${pacopts[@]}" + sudo "${pacman}" -Sy "${pacopts[@]}" fi - if ((! aur)); then - info $"Package(s) %s not found in repositories, trying %sAUR%s..." \ + ((aur)) || info $"Package(s) %s not found in repositories, trying %sAUR%s..." \ "${colorW}${aurpkgs[*]}${reset}" "${colorM}" "${reset}" - fi auracle info "${auropts[@]}" -- "${aurpkgs[@]}" fi # clean (-Sc) handling - elif ((cleancache)); then - if ((! aur)); then - sudo "${pacmanbin}" "${pacmanarg[@]}" "${pacopts[@]}" "${repopkgs[@]}" - fi - if ((! repo)); then - CleanCache "${pkgs[@]}" - fi + elif ((clean)); then + ((aur)) || sudo "${pacman}" "${pacmanarg[@]}" "${pacopts[@]}" "${repopkgs[@]}" + ((repo)) || CleanCache "${pkgs[@]}" # sysupgrade (-Su, -u) handling elif ((upgrade)); then - [[ "${pkgs[*]}" ]] && ClassifyPkgs "${pkgs[@]}" + [[ ! "${pkgs[*]}" ]] || ClassifyPkgs "${pkgs[@]}" if ((! aur)); then - if ! sudo "${pacmanbin}" "${pacmanarg[@]}" "${pacopts[@]}" "${repopkgs[@]}" && ((repo)); then + if ! sudo "${pacman}" "${pacmanarg[@]}" "${pacopts[@]}" "${repopkgs[@]}" && ((repo)); then exit "${E_FAIL}" fi fi @@ -1881,58 +1815,52 @@ case "${operation}" in info $"Package(s) %s not found in repositories, trying %sAUR%s..." \ "${colorW}${aurpkgs[*]}${reset}" "${colorM}" "${reset}" fi - if ((! repo)); then - Core - fi + ((repo)) || Core elif ((help)); then - "${pacmanbin}" "${pacmanarg[@]}" "${pacopts[@]}" -- "${pkgs[@]}" + "${pacman}" "${pacmanarg[@]}" "${pacopts[@]}" -- "${pkgs[@]}" # sync (-S, -y), downloadonly (-Sw, -m), refresh (-Sy) else if [[ ! "${pkgs[*]}" ]]; then - sudo "${pacmanbin}" "${pacmanarg[@]}" "${pacopts[@]}" + sudo "${pacman}" "${pacmanarg[@]}" "${pacopts[@]}" else ClassifyPkgs "${pkgs[@]}" fi - if [[ "${repopkgs[*]}" ]]; then - sudo "${pacmanbin}" "${pacmanarg[@]}" "${pacopts[@]}" "${repopkgs[@]}" - fi + [[ ! "${repopkgs[*]}" ]] || sudo "${pacman}" "${pacmanarg[@]}" "${pacopts[@]}" "${repopkgs[@]}" if [[ "${aurpkgs[*]}" ]]; then if ((refresh)) && [[ ! "${repopkgs[*]}" ]]; then - sudo "${pacmanbin}" -Sy "${pacopts[@]}" + sudo "${pacman}" -Sy "${pacopts[@]}" fi - if ((! aur)); then - info $"Package(s) %s not found in repositories, trying %sAUR%s..." \ + ((aur)) || info $"Package(s) %s not found in repositories, trying %sAUR%s..." \ "${colorW}${aurpkgs[*]}${reset}" "${colorM}" "${reset}" - fi Core fi fi exit;; upgrades) # upgrades (-Qu) handling - if ((! aur)); then - "${pacmanbin}" "${pacmanarg[@]}" "${pacopts[@]}" -- "${pkgs[@]}" - fi + ((aur)) || "${pacman}" "${pacmanarg[@]}" "${pacopts[@]}" -- "${pkgs[@]}" exitrepo="$?" if ((! repo)); then [[ "${pkgs[*]}" ]] || - mapfile -t pkgs < <("${pacmanbin}" -qm "${pacmanarg[@]//-u}" "${pacopts[@]//--upgrades}") + mapfile -t pkgs < <("${pacman}" -q "${pacmanarg[@]/%-u/-m}" \ + "${pacopts[@]/%--upgrades/--foreign}") auracle sync "${auropts[@]}" -- "${pkgs[@]}" - exitaur="$?" fi + exitaur="$?" if ((! exitrepo || ! exitaur)); then exit "${E_OK}" else exit "${E_FAIL}" fi;; - *) if [[ " ${pacmanarg[*]} " = *' -F '* ]] && ((refresh)); then - sudo "${pacmanbin}" "${pacmanarg[@]}" "${pacopts[@]}" -- "${pkgs[@]}" + *) # other operations handling + if [[ " ${pacmanarg[*]} " = *' -F '* ]] && ((refresh)); then + sudo "${pacman}" "${pacmanarg[@]}" "${pacopts[@]}" -- "${pkgs[@]}" elif [[ ! "${pkgs[*]}" || " ${pacmanarg[*]} " = *' -'[DFQTglp]' '* ]] && - ((! asdeps && ! asexplicit)); then - "${pacmanbin}" "${pacmanarg[@]}" "${pacopts[@]}" -- "${pkgs[@]}" + ((! asdeps && ! asexplicit && ! refresh)); then + "${pacman}" "${pacmanarg[@]}" "${pacopts[@]}" -- "${pkgs[@]}" else - sudo "${pacmanbin}" "${pacmanarg[@]}" "${pacopts[@]}" -- "${pkgs[@]}" + sudo "${pacman}" "${pacmanarg[@]}" "${pacopts[@]}" -- "${pkgs[@]}" fi - exit;; # others operations handling + exit;; esac # vim:set ts=4 sw=4 et: @@ -13,13 +13,13 @@ msgstr "" "X-Generator: Poedit 1.8.5\n" #: pacaur:115 -msgid "${colorW}Starting AUR upgrade...${reset}" -msgstr "${colorW}S'està iniciant una actualització AUR...${reset}" +msgid "%sStarting AUR upgrade...%s" +msgstr "%sS'està iniciant una actualització AUR...%s" #: pacaur:129 -msgid "${colorW}$i${reset} is ${colorY}not present${reset} in AUR -- skipping" +msgid "%s is %snot present%s in AUR -- skipping" msgstr "" -"${colorW}$i${reset} ${colorY}no està present${reset} en l'AUR -- s'està " +"%s %sno està present%s en l'AUR -- s'està " "saltant" #: pacaur:159 pacaur:215 pacaur:1111 @@ -27,78 +27,78 @@ msgid "latest" msgstr "últim" #: pacaur:164 -msgid "${checkaurpkgs[$i]} is in IgnorePkg/IgnoreGroup. Install anyway?" +msgid "%s is in IgnorePkg/IgnoreGroup. Install anyway?" msgstr "" -"${checkaurpkgs[$i]} és en IgnorePkg/IgnoreGroup. S'ha d'instal·lar igualment?" +"%s és en IgnorePkg/IgnoreGroup. S'ha d'instal·lar igualment?" #: pacaur:165 -msgid "${colorW}${checkaurpkgs[$i]}${reset}: ignoring package upgrade" +msgid "%s: ignoring package upgrade" msgstr "" -"${colorW}${checkaurpkgs[$i]}${reset}: s'està ignorant l'actualització de " +"%s: s'està ignorant l'actualització de " "paquet" #: pacaur:170 msgid "" -"${colorW}${checkaurpkgs[$i]}${reset}: ignoring package upgrade " -"(${colorR}${checkaurpkgsQver[$i]}${reset} => " -"${colorG}${checkaurpkgsAver[$i]}${reset})" +"%s: ignoring package upgrade " +"(%s => " +"%s)" msgstr "" -"${colorW}${checkaurpkgs[$i]}${reset}: s'està ignorant l'actualització de " -"paquet (${colorR}${checkaurpkgsQver[$i]}${reset} => " -"${colorG}${checkaurpkgsAver[$i]}${reset})" +"%s: s'està ignorant l'actualització de " +"paquet (%s => " +"%s)" #: pacaur:184 msgid "resolving dependencies..." msgstr "s'estan resolent les dependències..." #: pacaur:220 -msgid "no results found for $i" -msgstr "no s'ha trobat cap resultat per a $i" +msgid "no results found for %s" +msgstr "no s'ha trobat cap resultat per a %s" #: pacaur:358 msgid "dependency cycle detected" msgstr "s'ha detectat un cicle de dependències" #: pacaur:426 pacaur:441 -msgid "${colorW}$i${reset}: ignoring package upgrade" -msgstr "${colorW}$i${reset}: s'està ignorant l'actualització de paquet" +msgid "%s: ignoring package upgrade" +msgstr "%s: s'està ignorant l'actualització de paquet" #: pacaur:427 pacaur:433 pacaur:438 pacaur:442 -msgid "Unresolved dependency '${colorW}$i${reset}'" -msgstr "No s'ha resolt la dependència '${colorW}$i${reset}'" +msgid "Unresolved dependency '%s'" +msgstr "No s'ha resolt la dependència '%s'" #: pacaur:437 -msgid "$i dependency is in IgnorePkg/IgnoreGroup. Install anyway?" +msgid "%s dependency is in IgnorePkg/IgnoreGroup. Install anyway?" msgstr "" -"La dependència $i és en IgnorePkg/IgnoreGroup. S'ha d'instal·lar igualment?" +"La dependència %s és en IgnorePkg/IgnoreGroup. S'ha d'instal·lar igualment?" #: pacaur:470 msgid "" -"${colorW}There are ${#providers[@]} providers available for " -"${providersdeps[$i]}:${reset}" +"%sThere are %s providers available for " +"%s:%s" msgstr "" -"${colorW}Hi ha ${#providers[@]} proveïdors disponibles per " -"${providersdeps[$i]}:${reset}" +"%sHi ha %s proveïdors disponibles per " +"%s:%s" #: pacaur:477 msgid "Enter a number (default=0):" msgstr "Introduïu un número (per defecte=0):" #: pacaur:482 -msgid "invalid value: $nb is not between 0 and $providersnb" -msgstr "valor no và lid: $nb no està entre 0 i $providersnb" +msgid "invalid value: %s is not between 0 and %s" +msgstr "valor no và lid: %s no està entre 0 i %s" #: pacaur:484 -msgid "invalid number: $nb" -msgstr "el nombre no és và lid: $nb" +msgid "invalid number: %s" +msgstr "el nombre no és và lid: %s" #: pacaur:526 msgid "looking for inter-conflicts..." msgstr "s'estan cercant interconflictes..." #: pacaur:562 pacaur:631 -msgid "$j and $k are in conflict ($i). Remove $k?" -msgstr "$j i $k tenen conflictes ($i). S'elimina $k?" +msgid "%s and %s are in conflict (%s). Remove %s?" +msgstr "%s i %s tenen conflictes (%s). S'elimina %s?" #: pacaur:576 pacaur:639 msgid "unresolvable package conflicts detected" @@ -109,35 +109,33 @@ msgid "failed to prepare transaction (conflicting dependencies)" msgstr "ha fallat en preparar la transacció (dependències conflictives)" #: pacaur:578 pacaur:641 -msgid "$j and $k are in conflict" -msgstr "$j i $k tenen conflictes" +msgid "%s and %s are in conflict" +msgstr "%s i %s tenen conflictes" #: pacaur:659 -msgid "${colorW}${depsAname[$i]}${reset} latest revision -- fetching" -msgstr "última revisió de ${colorW}${depsAname[$i]}${reset} -- s'està obtenint" +msgid "%s latest revision -- fetching" +msgstr "última revisió de %s -- s'està obtenint" #: pacaur:662 msgid "" -"${colorW}${depsAname[$i]}-${depsQver[$i]}${reset} is up to date -- " +"%s-%s is up to date -- " "reinstalling" msgstr "" -"${colorW}${depsAname[$i]}-${depsQver[$i]}${reset} és al dia -- s'està " +"%s-%s és al dia -- s'està " "reinstal·lant" #: pacaur:664 msgid "" -"${colorW}${depsAname[$i]}-${depsQver[$i]}${reset} is up to date -- skipping" -msgstr "${colorW}${depsAname[$i]}-${depsQver[$i]}${reset} és al dia -- saltant" +"%s-%s is up to date -- skipping" +msgstr "%s-%s és al dia -- saltant" #: pacaur:679 msgid "" -"${colorW}${depsAname[$i]}-${depsAver[$i]}${reset} has been flagged ${colorR}" -"out of date${reset} on ${colorY}$(date -d \"@${depsAood[$i]}\" \"+%Y-%m-%d" -"\")${reset}" +"%s-%s has been flagged %s" +"out of date%s on %s" msgstr "" -"${colorW}${depsAname[$i]}-${depsAver[$i]}${reset} s'ha marcat com a ${colorR}" -"fora de data${reset} en ${colorY}$(date -d \"@${depsAood[$i]}\" \"+%Y-%m-%d" -"\")${reset}" +"%s-%s s'ha marcat com a %s" +"fora de data%s en %s" #: pacaur:707 msgid "cached" @@ -160,16 +158,16 @@ msgid "Download Size" msgstr "Mida de la baixada" #: pacaur:722 pacaur:746 -msgid "AUR Packages (${#deps[@]}):" -msgstr "Paquets AUR (${#deps[@]}):" +msgid "AUR Packages " +msgstr "Paquets AUR " #: pacaur:732 pacaur:747 -msgid "Repo Packages (${#repodepspkgs[@]}):" -msgstr "Paquets de repositoris (${#repodepspkgs[@]}):" +msgid "Repo Packages " +msgstr "Paquets de repositoris " #: pacaur:735 -msgid "${binarysize[$i]} MiB" -msgstr "${binarysize[$i]} MiB" +msgid " MiB" +msgstr " MiB" #: pacaur:751 msgid "Repo Download Size:" @@ -192,110 +190,104 @@ msgid "download" msgstr "baixada" #: pacaur:761 -msgid "Proceed with $action?" -msgstr "Inicio la $action?" +msgid "Proceed with installation?" +msgstr "Inicio la installation?" + +#: pacaur:762 +msgid "Proceed with download?" +msgstr "Inicio la download?" #: pacaur:770 -msgid "${colorW}Retrieving package(s)...${reset}" -msgstr "${colorW}S'està (an) recuperant el(s) paquet(s)...${reset}" +msgid "%sRetrieving package(s)...%s" +msgstr "%sS'està (an) recuperant el(s) paquet(s)...%s" #: pacaur:805 -msgid "View $i build files diff?" +msgid "View %s build files diff?" msgstr "" #: pacaur:808 #, fuzzy -msgid "${colorW}$i${reset} build files diff viewed" -msgstr "S'ha vist l'script de ${colorW}$j${reset}" +msgid "%s build files diff viewed" +msgstr "S'ha vist l'script de %s" #: pacaur:812 -msgid "View $i PKGBUILD?" -msgstr "Voleu veure el PKGBUILD de $i?" +msgid "View %s PKGBUILD?" +msgstr "Voleu veure el PKGBUILD de %s?" #: pacaur:813 pacaur:827 -msgid "${colorW}$i${reset} PKGBUILD viewed" -msgstr "S'ha vist el PKGBUILD de ${colorW}$i${reset}" +msgid "%s PKGBUILD viewed" +msgstr "S'ha vist el PKGBUILD de %s" #: pacaur:813 pacaur:827 -msgid "Could not open ${colorW}$i${reset} PKGBUILD" -msgstr "No s'ha pogut obrir el PKGBUILD de ${colorW}$i${reset}" +msgid "Could not open %s PKGBUILD" +msgstr "No s'ha pogut obrir el PKGBUILD de %s" #: pacaur:818 -msgid "View $j script?" -msgstr "Voleu veure l'script de $j?" +msgid "View %s script?" +msgstr "Voleu veure l'script de %s?" #: pacaur:819 pacaur:830 -msgid "${colorW}$j${reset} script viewed" -msgstr "S'ha vist l'script de ${colorW}$j${reset}" +msgid "%s script viewed" +msgstr "S'ha vist l'script de %s" #: pacaur:819 pacaur:830 -msgid "Could not open ${colorW}$j${reset} script" -msgstr "No s'ha pogut obrir l'script de ${colorW}$j${reset}" +msgid "Could not open %s script" +msgstr "No s'ha pogut obrir l'script de %s" #: pacaur:891 -msgid "Checking ${colorW}${pkgsdeps[$i]}${reset} integrity..." -msgstr "S'està comprovant la integritat de ${colorW}${pkgsdeps[$i]}${reset}..." +msgid "Checking %s integrity..." +msgstr "S'està comprovant la integritat de %s..." #: pacaur:903 -msgid "failed to verify ${colorW}$i${reset} integrity" -msgstr "ha fallat en verificar la integritat de ${colorW}$j${reset}" +msgid "failed to verify %s integrity" +msgstr "ha fallat en verificar la integritat de %s" #: pacaur:908 -msgid "build.lck exists in $tmpdir" -msgstr "build.lck existeix en $tmpdir" +msgid "build.lck exists in %s" +msgstr "build.lck existeix en %s" #: pacaur:913 #, fuzzy msgid "" -"Installing ${colorW}${repoprovidersconflictingpkgs[@]}${reset} " +"Installing %s " "dependencies..." msgstr "" "S'estan instal·lant les dependències de " -"${colorW}${providerpkgs[@]}${reset}..." +"%s..." #: pacaur:937 -msgid "${colorW}$j${reset} is up-to-date -- skipping" -msgstr "${colorW}$j${reset} és al dia -- s'està saltant" +msgid "%s-%s is up-to-date -- skipping" +msgstr "%s-%s és al dia -- s'està saltant" #: pacaur:953 -msgid "Installing ${colorW}$j${reset} cached package..." +msgid "Installing %s cached package..." msgstr "" -"S'està instal·lant el paquet ${colorW}$j${reset} des de la memòria cau..." +"S'està instal·lant el paquet %s des de la memòria cau..." #: pacaur:957 -msgid "Package ${colorW}$j${reset} already available in cache" -msgstr "El paquet ${colorW}$j${reset} ja està disponible en la memòria cau" +msgid "Package %s already available in cache" +msgstr "El paquet %s ja està disponible en la memòria cau" #: pacaur:966 -msgid "Building ${colorW}${pkgsdeps[$i]}${reset} package(s)..." -msgstr "S'està (an) construint ${colorW}${pkgsdeps[$i]}${reset} paquet(s)..." +msgid "Building %s package(s)..." +msgstr "S'està (an) construint %s paquet(s)..." #: pacaur:1001 #, fuzzy -msgid "Installing ${colorW}${pkgsdeps[$i]}${reset} package(s)..." -msgstr "S'està (an) construint ${colorW}${pkgsdeps[$i]}${reset} paquet(s)..." - -#: pacaur:1003 -msgid "" -"${colorW}${pkgsdeps[$i]}${reset} package(s) failed to install. Check ." -"SRCINFO for mismatching data with PKGBUILD." -msgstr "" +msgid "Installing %s package(s)..." +msgstr "S'està (an) construint %s paquet(s)..." #: pacaur:1021 msgid "Removing installed AUR dependencies..." msgstr "S'estan eliminant les dependències AUR instal·lades..." #: pacaur:1037 -msgid "${colorW}$i${reset} is a ${colorY}new orphan${reset} package" -msgstr "${colorW}$i${reset} és un ${colorY}nou paquet orfe${reset}" +msgid "%s is a %snew orphan%s package" +msgstr "%s és un %snou paquet orfe%s" #: pacaur:1042 -msgid "failed to build ${colorW}$i${reset} package(s)" -msgstr "ha fallat en construir ${colorW}${pkgsdeps[$i]}${reset} paquet(s)" - -#: pacaur:1069 pacaur:1110 -msgid "[ ignored ]" -msgstr "[ ignorat ]" +msgid "failed to build %s package(s)" +msgstr "ha fallat en construir %s paquet(s)" #: pacaur:1125 msgid "Packages to keep:" @@ -365,16 +357,8 @@ msgstr "" "ha fallat en preparar la transacció (no s'ha pogut satisfer les dependències)" #: pacaur:1243 -msgid "${Qrequires[@]}: requires $@" -msgstr "${Qrequires[@]}: requereix $@" - -#: pacaur:1252 -msgid "$2 [Y/n] " -msgstr "$2 [S/n] " - -#: pacaur:1259 -msgid "$2 [y/N] " -msgstr "$2 [s/N] " +msgid "%s: requires %s" +msgstr "%s: requereix %s" #: pacaur:1290 msgid " there is nothing to do" @@ -402,38 +386,6 @@ msgstr "" msgid " extend pacman operations to the AUR" msgstr " estén les operacions del pacman a l'AUR" -#: pacaur:1315 -msgid " AUR specific" -msgstr " especÃfic a l'AUR" - -#: pacaur:1316 -msgid " -s, --search search AUR for matching strings" -msgstr " -s, --search cerca cadenes coincidents en l'AUR" - -#: pacaur:1317 -msgid " -i, --info view package information" -msgstr " -i, --info mostra la informació dels paquets" - -#: pacaur:1318 -msgid "" -" -d, --download download target(s) -- pass twice to download AUR " -"dependencies" -msgstr "" -" -d, --download baixa objectiu(s) -- passa'l dues vegades per baixar les " -"dependències AUR" - -#: pacaur:1319 -msgid " -m, --makepkg download and make target(s)" -msgstr " -m, --makepkg baixa i fes objectiu(s)" - -#: pacaur:1320 -msgid " -y, --sync download, make and install target(s)" -msgstr " -y, --sync baixa, fes i instal·la objectiu(s)" - -#: pacaur:1321 -msgid " -k, --check check for AUR update(s)" -msgstr " -k, --check cerca actualització(ons) AUR" - #: pacaur:1323 pacaur:1331 msgid " general" msgstr " general" @@ -531,16 +483,10 @@ msgstr "no podeu realitzar aquesta operació com a root" msgid "${colorW}editor${reset} variable unset" msgstr "la variable ${colorW}editor${reset} no està establerta" -#: pacaur:1471 -msgid "" -"${colorW}clonedir${reset} or ${colorW}\\$AURDEST${reset} should be set to a " -"non volatile memory location" -msgstr "" - #: pacaur:1472 #, fuzzy -msgid "${colorW}$clonedir${reset} does not have write permission." -msgstr "${colorW}$builddir${reset} no té permÃs d'escriptura." +msgid "%s does not have write permission." +msgstr "%s no té permÃs d'escriptura." #: pacaur:1473 msgid "no targets specified (use -h for help)" @@ -552,11 +498,11 @@ msgstr "no s'ha trobat l'objectiu" #: pacaur:1511 pacaur:1523 pacaur:1531 msgid "" -"Package(s) ${colorW}${aurpkgs[*]}${reset} not found in repositories, trying " -"${colorM}AUR${reset}..." +"Package(s) %s not found in repositories, trying " +"%sAUR%s..." msgstr "" -"El(s) paquet(s) ${colorW}${aurpkgs[*]}${reset} no es troba(en) als " -"repositoris, s'està intentant amb l'${colorM}AUR${reset}..." +"El(s) paquet(s) %s no es troba(en) als " +"repositoris, s'està intentant amb l'%sAUR%s..." #~ msgid "Installing ${colorW}${pkgsdeps[$i]}${reset} dependencies..." #~ msgstr "" @@ -12,87 +12,87 @@ msgstr "" "X-Generator: Poedit 1.8.7.1\n" #: pacaur:115 -msgid "${colorW}Starting AUR upgrade...${reset}" -msgstr "${colorW}Starter AUR opgradering...${reset}" +msgid "%sStarting AUR upgrade...%s" +msgstr "%sStarter AUR opgradering...%s" #: pacaur:134 -msgid "${colorW}$i${reset} is ${colorY}not present${reset} in AUR -- skipping" +msgid "%s is %snot present%s in AUR -- skipping" msgstr "" -"${colorW}$i${reset} er ${colorY}ikke tilstede${reset} i AUR -- springer over" +"%s er %sikke tilstede%s i AUR -- springer over" #: pacaur:163 pacaur:207 pacaur:1160 msgid "latest" msgstr "nyeste" #: pacaur:168 -msgid "${checkaurpkgs[$i]} is in IgnorePkg/IgnoreGroup. Install anyway?" -msgstr "${checkaurpkgs[$i]} er i IgnorePkg/IgnoreGroup. Installer alligevel?" +msgid "%s is in IgnorePkg/IgnoreGroup. Install anyway?" +msgstr "%s er i IgnorePkg/IgnoreGroup. Installer alligevel?" #: pacaur:169 -msgid "${colorW}${checkaurpkgs[$i]}${reset}: ignoring package upgrade" -msgstr "${colorW}${checkaurpkgs[$i]}${reset}: ignorerer pakke opdatering" +msgid "%s: ignoring package upgrade" +msgstr "%s: ignorerer pakke opdatering" #: pacaur:174 msgid "" -"${colorW}${checkaurpkgs[$i]}${reset}: ignoring package upgrade " -"(${colorR}${checkaurpkgsQver[$i]}${reset} => " -"${colorG}${checkaurpkgsAver[$i]}${reset})" +"$%s: ignoring package upgrade " +"(%s => " +"%s)" msgstr "" -"${colorW}${checkaurpkgs[$i]}${reset}: ignorerer pakke opgradering " -"(${colorR}${checkaurpkgsQver[$i]}${reset} => " -"${colorG}${checkaurpkgsAver[$i]}${reset})" +"%s: ignorerer pakke opgradering " +"(%s => " +"%s)" #: pacaur:188 msgid "resolving dependencies..." msgstr "opklarer afhængigheder..." #: pacaur:212 -msgid "no results found for $i" -msgstr "ingen resultater fundet for $i" +msgid "no results found for %s" +msgstr "ingen resultater fundet for %s" #: pacaur:365 msgid "dependency cycle detected" msgstr "afhængigheds-løkke fundet" #: pacaur:433 pacaur:448 -msgid "${colorW}$i${reset}: ignoring package upgrade" -msgstr "${colorW}$i${reset}: ignorerer pakke opgradering" +msgid "%s: ignoring package upgrade" +msgstr "%s: ignorerer pakke opgradering" #: pacaur:434 pacaur:440 pacaur:445 pacaur:449 -msgid "Unresolved dependency '${colorW}$i${reset}'" -msgstr "Uafklaret afhængighed '${colorW}$i${reset}'" +msgid "Unresolved dependency '%s'" +msgstr "Uafklaret afhængighed '%s'" #: pacaur:444 -msgid "$i dependency is in IgnorePkg/IgnoreGroup. Install anyway?" -msgstr "$i afhængighed er i IgnorePkg/IgnoreGroup. Installer alligevel?" +msgid "%s dependency is in IgnorePkg/IgnoreGroup. Install anyway?" +msgstr "%s afhængighed er i IgnorePkg/IgnoreGroup. Installer alligevel?" #: pacaur:484 msgid "" -"${colorW}There are ${#providers[@]} providers available for " -"${providersdeps[$i]}:${reset}" +"$%sThere are %s providers available for " +"%s:%s" msgstr "" -"${colorW}Der er ${#providers[@]} udbydere tilgængelige for " -"${providersdeps[$i]}:${reset}" +"%sDer er %s udbydere tilgængelige for " +"%s:%s" #: pacaur:491 msgid "Enter a number (default=0):" msgstr "Skriv et nummer (standard=0):" #: pacaur:498 -msgid "invalid value: $nb is not between 0 and $providersnb" -msgstr "ugyldig værdi: $nb er ikke mellem 0 og $providersnb" +msgid "invalid value: %s is not between 0 and %s" +msgstr "ugyldig værdi: %s er ikke mellem 0 og %s" #: pacaur:503 -msgid "invalid number: $nb" -msgstr "ugyldigt nummer: $nb" +msgid "invalid number: %s" +msgstr "ugyldigt nummer: %s" #: pacaur:545 msgid "looking for inter-conflicts..." msgstr "leder efter inter-konflikter..." #: pacaur:581 pacaur:650 -msgid "$j and $k are in conflict ($i). Remove $k?" -msgstr "$j og $k konflikter med hinanden ($i). Fjern $k?" +msgid "%s and %s are in conflict (%s). Remove %s?" +msgstr "%s og %s konflikter med hinanden (%s). Fjern %s?" #: pacaur:595 pacaur:658 msgid "unresolvable package conflicts detected" @@ -103,49 +103,47 @@ msgid "failed to prepare transaction (conflicting dependencies)" msgstr "kunne ikke forberede transaktion (konfliktende afhængigheder)" #: pacaur:597 pacaur:660 -msgid "$j and $k are in conflict" -msgstr "$j og $k konflikter med hindanden" +msgid "%s and %s are in conflict" +msgstr "%s og %s konflikter med hindanden" #: pacaur:678 -msgid "${colorW}${depsAname[$i]}${reset} latest revision -- fetching" -msgstr "${colorW}${depsAname[$i]}${reset} nyeste revision -- henter" +msgid "%s latest revision -- fetching" +msgstr "%s nyeste revision -- henter" #: pacaur:681 msgid "" -"${colorW}${depsAname[$i]}-${depsQver[$i]}${reset} is up to date -- " +"%s-%s is up to date -- " "reinstalling" msgstr "" -"${colorW}${depsAname[$i]}-${depsQver[$i]}${reset} er opdateret -- " +"%s-%s er opdateret -- " "geninstallerer" #: pacaur:683 msgid "" -"${colorW}${depsAname[$i]}-${depsQver[$i]}${reset} is up to date -- skipping" +"%s-%s is up to date -- skipping" msgstr "" -"${colorW}${depsAname[$i]}-${depsQver[$i]}${reset} er opdateret - springer " +"%s-%s er opdateret - springer " "over" #: pacaur:698 msgid "" -"${colorW}${depsAname[$i]}-${depsAver[$i]}${reset} has been flagged ${colorR}" -"out of date${reset} on ${colorY}$(date -d \"@${depsAood[$i]}\" \"+%Y-%m-%d" -"\")${reset}" +"%s-%s has been flagged %s" +"out of date%s on %s" msgstr "" -"${colorW}${depsAname[$i]}-${depsAver[$i]}${reset} er blevet mærket ${colorR}" -"forældet${reset} den ${colorY}$(date -d \"@${depsAood[$i]}\" \"+%Y-%m-%d" -"\")${reset}" +"%s-%s er blevet mærket %s" +"forældet%s den %s" #: pacaur:726 msgid "cached" msgstr "cached" #: pacaur:731 pacaur:764 -msgid "AUR Packages (${#deps[@]})" -msgstr "AUR Pakker (${#deps[@]})" +msgid "AUR Packages " +msgstr "AUR Pakker " #: pacaur:731 pacaur:765 -msgid "Repo Packages (${#repodepspkgs[@]})" -msgstr "Repo Pakker (${#repodepspkgs[@]})" +msgid "Repo Packages " +msgstr "Repo Pakker " #: pacaur:731 msgid "Old Version" @@ -160,8 +158,8 @@ msgid "Download Size" msgstr "Download Str." #: pacaur:753 -msgid "${binarysize[$i]} MiB" -msgstr "${binarysize[$i]} MiB" +msgid " MiB" +msgstr " MiB" #: pacaur:769 msgid "Repo Download Size:" @@ -184,96 +182,92 @@ msgid "download" msgstr "download" #: pacaur:779 pacaur:873 -msgid "Proceed with $action?" -msgstr "Fortsæt med $action?" +msgid "Proceed with installation?" +msgstr "Fortsæt med installation?" + +#: pacaur:779 pacaur:873 +msgid "Proceed with download" +msgstr "Fortsæt med download" #: pacaur:788 -msgid "${colorW}Retrieving package(s)...${reset}" -msgstr "${colorW}Henter Pakke(r)...${reset}" +msgid "%sRetrieving package(s)...%s" +msgstr "%sHenter Pakke(r)...%s" #: pacaur:821 -msgid "View $i build files diff?" -msgstr "Vis $i build files diff?" +msgid "View %s build files diff?" +msgstr "Vis %s build files diff?" #: pacaur:823 -msgid "${colorW}$i${reset} build files diff viewed" -msgstr "${colorW}$i${reset} build files diff vist" +msgid "%s build files diff viewed" +msgstr "%s build files diff vist" #: pacaur:827 -msgid "${colorW}$i${reset} build files are up-to-date -- skipping" -msgstr "${colorW}$i${reset} build filer er opdaterede -- springer over" +msgid "%s build files are up-to-date -- skipping" +msgstr "%s build filer er opdaterede -- springer over" #: pacaur:831 -msgid "View $i PKGBUILD?" -msgstr "Vis $i PKGBUILD?" +msgid "View %s PKGBUILD?" +msgstr "Vis %s PKGBUILD?" #: pacaur:833 pacaur:855 -msgid "${colorW}$i${reset} PKGBUILD viewed" -msgstr "${colorW}$i${reset} PKGBUILD vist" +msgid "%s PKGBUILD viewed" +msgstr "%s PKGBUILD vist" #: pacaur:835 pacaur:857 -msgid "Could not open ${colorW}$i${reset} PKGBUILD" -msgstr "Kunne ikke åbne ${colorW}$i${reset} PKGBUILD" +msgid "Could not open %s PKGBUILD" +msgstr "Kunne ikke åbne %s PKGBUILD" #: pacaur:841 -msgid "View $j script?" -msgstr "Vis $j script?" +msgid "View %s script?" +msgstr "Vis %s script?" #: pacaur:843 pacaur:862 -msgid "${colorW}$j${reset} script viewed" -msgstr "${colorW}$j${reset} script vist" +msgid "%s script viewed" +msgstr "%s script vist" #: pacaur:845 pacaur:864 -msgid "Could not open ${colorW}$j${reset} script" -msgstr "Kunne ikke åbne ${colorW}$j${reset} script" +msgid "Could not open %s script" +msgstr "Kunne ikke åbne %s script" #: pacaur:934 -msgid "Checking ${colorW}${pkgsdeps[$i]}${reset} integrity..." -msgstr "Tjekker ${colorW}${pkgsdeps[$i]}${reset} integritet..." +msgid "Checking %s integrity..." +msgstr "Tjekker %s integritet..." #: pacaur:946 -msgid "failed to verify ${colorW}$i${reset} integrity" -msgstr "kunne ikke verificere ${colorW}$i${reset} integritet" +msgid "failed to verify %s integrity" +msgstr "kunne ikke verificere %s integritet" #: pacaur:951 -msgid "build.lck exists in $tmpdir" -msgstr "build.lck eksisterer i $tmpdir" +msgid "build.lck exists in %s" +msgstr "build.lck eksisterer i %s" #: pacaur:956 msgid "" -"Installing ${colorW}${repoprovidersconflictingpkgs[@]}${reset} " +"Installing %s " "dependencies..." msgstr "" -"Installerer ${colorW}${repoprovidersconflictingpkgs[@]}${reset} " +"Installerer %s " "afhængigheder..." #: pacaur:980 -msgid "${colorW}$j${reset} is up-to-date -- skipping" -msgstr "${colorW}$j${reset} er opdateret -- springer over" +msgid "%s is up-to-date -- skipping" +msgstr "%s er opdateret -- springer over" #: pacaur:1001 -msgid "Installing ${colorW}$j${reset} cached package..." -msgstr "Installerer ${colorW}$j${reset} cached pakke..." +msgid "Installing %s cached package..." +msgstr "Installerer %s cached pakke..." #: pacaur:1005 -msgid "Package ${colorW}$j${reset} already available in cache" -msgstr "Pakken ${colorW}$j${reset} er allerede tilgængelig i cache" +msgid "Package %s already available in cache" +msgstr "Pakken %s er allerede tilgængelig i cache" #: pacaur:1014 -msgid "Building ${colorW}${pkgsdeps[$i]}${reset} package(s)..." -msgstr "Bygger ${colorW}${pkgsdeps[$i]}${reset} pakke(r)..." +msgid "Building %s package(s)..." +msgstr "Bygger %s pakke(r)..." #: pacaur:1050 -msgid "Installing ${colorW}${pkgsdeps[$i]}${reset} package(s)..." -msgstr "Installerer ${colorW}${pkgsdeps[$i]}${reset} pakke(r)..." - -#: pacaur:1052 -msgid "" -"${colorW}${pkgsdeps[$i]}${reset} package(s) failed to install. Check ." -"SRCINFO for mismatching data with PKGBUILD." -msgstr "" -"${colorW}${pkgsdeps[$i]}${reset} pakkep(r) kunne ikke installeres. Tjek ." -"SRCINFO for ikke-matchende data med PKGBUILD." +msgid "Installing %s package(s)..." +msgstr "Installerer %s pakke(r)..." #: pacaur:1070 msgid "Removing installed AUR dependencies..." @@ -284,8 +278,8 @@ msgid "${colorW}$i${reset} is a ${colorY}new orphan${reset} package" msgstr "${colorW}$i${reset} er en ${colorY}ny forældreløs${reset} pakke" #: pacaur:1091 -msgid "failed to build ${colorW}$i${reset} package(s)" -msgstr "kunne ikke bygge ${colorW}$i${reset} pakke(r)" +msgid "failed to build %s package(s)" +msgstr "kunne ikke bygge %s pakke(r)" #: pacaur:1118 pacaur:1159 msgid "[ ignored ]" @@ -357,16 +351,8 @@ msgstr "" "kunne ikke forberede transaktionen (kunne ikke tilfredsstille afhængigheder)" #: pacaur:1293 -msgid "${Qrequires[@]}: requires $@" -msgstr "${Qrequires[@]}: kræver $@" - -#: pacaur:1302 -msgid "$2 [Y/n] " -msgstr "$2 [J/n] " - -#: pacaur:1309 -msgid "$2 [y/N] " -msgstr "$2 [j/N] " +msgid "%s: requires %s" +msgstr "%s: kræver %s" #: pacaur:1340 msgid " there is nothing to do" @@ -392,38 +378,6 @@ msgstr " -S, -Ss, -Si, -Sw, -Su, -Qu, -Sc, -Scc" msgid " extend pacman operations to the AUR" msgstr " udvid pacman handlinger med AUR" -#: pacaur:1365 -msgid " AUR specific" -msgstr " AUR specifikt" - -#: pacaur:1366 -msgid " -s, --search search AUR for matching strings" -msgstr " -s, --search søg AUR for matchende ord" - -#: pacaur:1367 -msgid " -i, --info view package information" -msgstr " -i, --info vis pakke information" - -#: pacaur:1368 -msgid "" -" -d, --download download target(s) -- pass twice to download AUR " -"dependencies" -msgstr "" -" -d, --download download mål -- skriv dobbelt for at downloade AUR " -"afhængigheder" - -#: pacaur:1369 -msgid " -m, --makepkg download and make target(s)" -msgstr " -m, --makepkg download og byg mål" - -#: pacaur:1370 -msgid " -y, --sync download, make and install target(s)" -msgstr " -y, --sync download, byg og installer mål" - -#: pacaur:1371 -msgid " -k, --check check for AUR update(s)" -msgstr " -k, --check tjek for AUR opdateringer" - #: pacaur:1373 pacaur:1381 msgid " general" msgstr "generelt" @@ -510,17 +464,9 @@ msgstr "Du kan ikke gøre denne handling som root" msgid "${colorW}editor${reset} variable unset" msgstr "${colorW}editor${reset} variabel er ikke sat" -#: pacaur:1520 -msgid "" -"${colorW}clonedir${reset} or ${colorW}\\$AURDEST${reset} should be set to a " -"non volatile memory location" -msgstr "" -"${colorW}clonedir${reset} eller ${colorW}\\$AURDEST${reset} burde være sat " -"til en ikke-flygtig hukommelses placering" - #: pacaur:1521 -msgid "${colorW}$clonedir${reset} does not have write permission." -msgstr "${colorW}$clonedir${reset} har ikke skrive tilladelse." +msgid "%s does not have write permission." +msgstr "%s har ikke skrive tilladelse." #: pacaur:1522 pacaur:1523 msgid "no targets specified (use -h for help)" @@ -532,8 +478,8 @@ msgstr "mål ikke fundet" #: pacaur:1565 pacaur:1577 pacaur:1589 msgid "" -"Package(s) ${colorW}${aurpkgs[*]}${reset} not found in repositories, trying " -"${colorM}AUR${reset}..." +"Package(s) %s not found in repositories, trying " +"%sAUR%s..." msgstr "" -"Pakke(r) ${colorW}${aurpkgs[*]}${reset} ikke fundet i repoer, prøver " -"${colorM}AUR${reset}..." +"Pakke(r) %s ikke fundet i repoer, prøver " +"%sAUR%s..." |