diff options
author | e5ten <e5ten.arch@gmail.com> | 2019-04-24 18:10:37 -0400 |
---|---|---|
committer | e5ten <e5ten.arch@gmail.com> | 2019-05-03 14:03:18 -0400 |
commit | 4b334a85e61290e8f33b84f21e4ba48c4384cfec (patch) | |
tree | efceafc9c349912e2de58a938bbe51111c21a2d3 | |
parent | 3b1d087991c8453d1ec9cf54b7927040ee8582cc (diff) |
compare arrays in CommArr using comm and sort, switch back to for loop for early opt-parsing, syntax changes
-rwxr-xr-x | pacaur | 255 |
1 files changed, 128 insertions, 127 deletions
@@ -4,7 +4,7 @@ # shopt -s extglob -version="4.8.6" +declare -r version="4.8.6" # # Config @@ -12,13 +12,13 @@ version="4.8.6" # sanitize unset aur asdeps asexplicit checkdeps cleancache ccount dcount devel edit info installpkg needed -unset noconfirm nodeps noedit operation optret pac pacQ pacS pacg pacn pacw quiet readline rebuild -unset refresh repo search upgrade vars vcs +unset noconfirm nodeps noedit operation pac pacQ pacS pacg pacn pacw quiet readline rebuild refresh +unset repo search upgrade var vcs # internationalization -LC_COLLATE=C -TEXTDOMAIN='pacaur' -TEXTDOMAINDIR='/usr/share/locale' +export LC_COLLATE=C +export TEXTDOMAIN='pacaur' +export TEXTDOMAINDIR='/usr/share/locale' # determine config location if [[ "${XDG_CONFIG_DIRS}" ]]; then @@ -33,9 +33,8 @@ usercachedir="${XDG_CACHE_HOME:-${HOME}/.cache}/pacaur" tmpdir="${XDG_RUNTIME_DIR:-/tmp}" # preserve environment variables -vars=('PACMAN' 'PKGDEST' 'SRCDEST' 'SRCPKGDEST' 'LOGDEST' 'BUILDDIR' 'PKGEXT' 'SRCEXT' - 'GPGKEY' 'PACKAGER' 'CARCH') -for i in "${vars[@]}"; do +var=('PACMAN' {'PKG','SRC'}{'DEST','EXT'} {'SRCPKG','LOG'}'DEST' 'BUILDDIR' 'GPGKEY' 'PACKAGER' 'CARCH') +for i in "${var[@]}"; do [[ "${!i}" ]] && declare _"$i"="${!i}" done @@ -57,7 +56,7 @@ for i in "${vars[@]}"; do done # set default config variables -editor="${VISUAL:-${EDITOR:-vi}}" # build files editor +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) @@ -65,30 +64,31 @@ sortorder=ascending # sort order (ascending|descending) sudoloop=true # prevent sudo timeout # set variables -pacmanbin="${PACMAN:-pacman}" # pacman binary +declare -r pacmanbin="${PACMAN:-pacman}" # pacman binary clonedir="${AURDEST:-${usercachedir:?}}" # clone directory # source xdg config [[ -r "$configdir/config" ]] && source "$configdir/config" [[ -r "$userconfigdir/config" ]] && source "$userconfigdir/config" -# set up directories -[[ -d "$clonedir" ]] || install -dm700 "$clonedir" - # source makepkg libraries -source /usr/share/makepkg/util/parseopts.sh -source /usr/share/makepkg/util/option.sh +for i in parseopts util option error; do + source "/usr/share/makepkg/util/$i.sh" +done check_buildoption "check" "y" && checkdeps=1 # determine whether we have gettext; make it a no-op if we do not -if ! type -p gettext >/dev/null; then - gettext() { - printf "%s\n" "$@" - } -fi +type -p gettext >/dev/null || gettext() { printf '%s\n' "$@"; } + +# set up directories +declare -r clonedir="$(canonicalize_path "$clonedir")" +install -dm700 "$clonedir" # define vcs packages -vcs='-(cvs|svn|git|hg|bzr|darcs|daily.*|nightly.*)$' +declare -r vcs='-(cvs|svn|git|hg|bzr|darcs|daily.*|nightly.*)$' + +# set variables to readonly +declare -r configdir userconfigdir userpacmandir usercachedir tmpdir # # Functions @@ -119,7 +119,7 @@ ClassifyPkgs() { [[ " ${noaurpkgs[*]} " =~ [a-zA-Z0-9\.\+-]+\/"$i"[^a-zA-Z0-9\.\+-] ]] || aurpkgs+=("$i") # do not search repo/pkgs in AUR done - repopkgs=($(DiffArr 'aurpkgs' 'noaurpkgs' -v)) + repopkgs=($(CommArr 'aurpkgs' 'noaurpkgs' '-13')) fi } @@ -148,7 +148,7 @@ UpgradeAur() { allaurpkgs=($(GetJson "$json" "Name")) # foreign packages check - aurforeignpkgs=($(DiffArr 'allaurpkgs' 'foreignpkgs' -v)) + aurforeignpkgs=($(CommArr 'allaurpkgs' 'foreignpkgs' '-13')) for i in "${aurforeignpkgs[@]}"; do Note "w" $"${colorW}$i${reset} is ${colorY}not present${reset} in AUR -- skipping" done @@ -164,7 +164,6 @@ UpgradeAur() { fi # avoid possible duplicate - # TODO: unnecessary now that devel packages are only added if they aren't already there? aurpkgs=($(printf '%s\n' "${aurpkgs[@]}" | sort -u)) NothingToDo "${aurpkgs[@]}" @@ -181,8 +180,7 @@ IgnoreChecks() { # check targets SetJson "${aurpkgsnover[@]}" checkaurpkgs=($(GetJson "$json" "Name")) - errdeps+=($(DiffArr 'aurpkgsnover' 'checkaurpkgs' -v)) - errdeps+=($(DiffArr 'checkaurpkgs' 'aurpkgsnover' -v)) + errdeps=($(comm -3 <(printf '%s\n' "${aurpkgs[@]}") <(printf '%s\n' "${checkaurpkgs[@]}"))) unset aurpkgsnover checkaurpkgsAver=($(GetJson "$json" "Version")) @@ -250,13 +248,12 @@ DepsSolver() { aurpkgsconflicts=($(GetJson "$json" "Conflicts")) if [[ "${aurpkgsconflicts[*]}" ]]; then aurpkgsconflicts=("${aurpkgsconflicts[@]%%[><=]*}") - aurpkgsconflicts=($(DiffArr 'aurpkgsproviders' 'aurpkgsconflicts')) - aurpkgsconflicts=($(sort -u <<< "$(printf '%s\n' "${aurpkgsconflicts[@]}")")) + aurpkgsconflicts=($(CommArr 'aurpkgsproviders' 'aurpkgsconflicts' '-12')) for i in "${aurpkgsconflicts[@]}"; do [[ " ${aurpkgsnover[*]} " =~ " $i " ]] || continue [[ " $(GetJson "$json" "Conflicts" "$i") " =~ " $i " ]] && continue Note "f" $"unresolvable package conflicts detected" - Note "e" $"failed to prepare transaction (conflicting dependencies: $i)" + Note "e" $"failed to prepare transaction (conflicting dependencies: $i)" "$E_INSTALL_DEPS_FAILED" done fi @@ -266,13 +263,13 @@ DepsSolver() { FindDepsAur "${aurpkgsnover[@]}" # avoid possible duplicate - deps=($(DiffArr 'aurdepspkgs' 'deps' -v)) + deps=($(CommArr 'aurdepspkgs' 'deps' '-13')) deps+=("${aurdepspkgs[@]}") # ensure correct dependency order SetJson "${deps[@]}" SortDepsAur "${aurpkgs[@]}" - deps=($(tsort <<< "${tsortdeps[@]}")) || Note "e" $"dependency cycle detected" + deps=($(tsort <<< "${tsortdeps[@]}")) || Note "e" $"dependency cycle detected" "$E_INSTALL_DEPS_FAILED" # get AUR packages info depsAname=($(GetJson "$json" "Name")) @@ -307,7 +304,7 @@ DepsSolver() { Note "f" $"no results found for ${errdeps[$i]} (dependency tree: ${errdepslist[*]})" fi done - exit 1 + exit "$E_INSTALL_DEPS_FAILED" fi # return all binary deps @@ -385,25 +382,25 @@ FindDepsAur() { fi # remove deps provided by targets - [[ "${aurpkgsproviders[*]}" ]] && depspkgs=($(DiffArr 'aurpkgsproviders' 'depspkgs' -v)) + [[ "${aurpkgsproviders[*]}" ]] && depspkgs=($(CommArr 'aurpkgsproviders' 'depspkgs' '-13')) # workaround for limited RPC support of architecture dependent fields if [[ "${CARCH}" = 'i686' ]]; then - depspkgstmp=("${depspkgs[@]}") - for i in "${!depspkgstmp[@]}"; do - [[ "${depspkgstmp[$i]}" =~ ^(lib32-|gcc-multilib) ]] && - depspkgs=($(printf '%s\n' "${depspkgs[@]}" | sed "s%^${depspkgstmp[$i]}$%%g")) + for i in "${!depspkgs[@]}"; do + [[ "${depspkgs[$i]}" =~ ^(lib32-|gcc-multilib) ]] && unset depspkgs[$i] done + depspkgs=($(printf '%s\n' "${depspkgs[@]}")) fi + # remove versioning + depspkgs=("${depspkgs[@]%%[><=]*}") # remove installed deps if [[ ! "$devel" ]]; then depspkgs=($("$pacmanbin" -T -- "${depspkgs[@]}" | sort -u)) else - # remove versioning and check providers + # check providers unset vcsdepspkgs for i in "${!depspkgs[@]}"; do - depspkgs[$i]="${depspkgs[$i]%%[><=]*}" unset j && read -rd' ' <<< "$(expac -Qs '%n %P' "^${depspkgs[$i]}$")" j if [[ "$j" ]]; then depspkgs[$i]="$j" @@ -414,11 +411,8 @@ FindDepsAur() { fi done # reorder devel - # TODO: this can probably be replaced by deptesting {,vcs}depspkgs and sorting at once depspkgs=($("$pacmanbin" -T -- "${depspkgs[@]}" | sort -u)) - depspkgstmp=($(DiffArr 'depspkgs' 'vcsdepspkgs' -v)) - depspkgstmp+=($(DiffArr 'vcsdepspkgs' 'depspkgs' -v)) - depspkgs=($(printf '%s\n' "${depspkgstmp[@]}" | sort -u)) + depspkgs=($(CommArr 'depspkgs' 'vcsdepspkgs' '-3')) fi # split repo and AUR depends pkgs @@ -430,36 +424,36 @@ FindDepsAur() { # assume installed deps elif [[ "${assumeinstalled[*]}" ]]; then # remove versioning + assumeinstalled=("${assumeinstalled[@]%%[><=]*}") for i in "${!assumeinstalled[@]}"; do unset assumedepspkgs - assumeinstalled[$i]="${assumeinstalled[$i]%%[><=]*}" for j in "${!depspkgs[@]}"; do assumedepspkgs[$j]="${depspkgs[$j]%%[><=]*}" - [[ " ${assumedepspkgs[*]} " =~ " ${assumeinstalled[$i]} " ]] && depspkgs[$j]="${assumeinstalled[$i]}"; + [[ " ${assumedepspkgs[*]} " =~ " ${assumeinstalled[$i]} " ]] && + depspkgs[$j]="${assumeinstalled[$i]}"; done done - depspkgs=($(DiffArr 'assumeinstalled' 'depspkgs' -v)) + depspkgs=($(CommArr 'assumeinstalled' 'depspkgs' '-13')) fi if [[ "${depspkgs[*]}" ]]; then - mapfile -t depspkgsaur <<< "$(expac -Sv '' -- "${depspkgs[@]}" 2>&1)" && + mapfile -t depspkgsaur <<< "$(expac -Sv '' -- "${depspkgs[@]%%[><=]*}" 2>&1)" && depspkgsaur=("${depspkgsaur[@]#error: package \`}") && depspkgsaur=("${depspkgsaur[@]%\' not found}") - repodeps+=($(DiffArr 'depspkgsaur' 'depspkgs' -v)) + repodeps+=($(CommArr 'depspkgsaur' 'depspkgs' '-13')) fi fi unset depspkgs # remove duplicate - [[ "${depspkgsaur[*]}" ]] && depspkgsaur=($(DiffArr 'aurdepspkgs' 'depspkgsaur' -v)) + [[ "${depspkgsaur[*]}" ]] && depspkgsaur=($(CommArr 'aurdepspkgs' 'depspkgsaur' '-13')) # dependency cycle check [[ "${prevdepspkgsaur[*]}" && "${prevdepspkgsaur[*]}" = "${depspkgsaur[*]}" ]] && - Note "e" $"dependency cycle detected (${depspkgsaur[*]})" + Note "e" $"dependency cycle detected (${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)) fi @@ -486,8 +480,8 @@ SortDepsAur() { errdepsnover=("${errdeps[@]%%[><=]*}") # check AUR deps only - sortdepspkgs=("${sortdepspkgs[@]%%[><=]*}") for j in "${!sortdepspkgs[@]}"; do + sortdepspkgs[$j]="${sortdepspkgs[$j]%%[><=]*}" sortdepspkgsaur+=($(GetJson "$json" "Name" "${sortdepspkgs[$j]}")) # add erroneous AUR deps [[ " ${errdepsnover[*]} " =~ " ${sortdepspkgs[$j]} " ]] && @@ -504,7 +498,7 @@ SortDepsAur() { fi # filter non checked deps - sortdepspkgsaur=($(DiffArr 'allcheckedsortdepspkgsaur' 'sortdepspkgsaur' -v)) + sortdepspkgsaur=($(CommArr 'allcheckedsortdepspkgsaur' 'sortdepspkgsaur' '-13')) if [[ "${sortdepspkgsaur[*]}" ]]; then checkedsortdepspkgsaur+=("${sortdepspkgsaur[@]}") allcheckedsortdepspkgsaur+=("${sortdepspkgsaur[@]}") @@ -573,7 +567,7 @@ FindDepsRepo() { # remove duplicate [[ "${repodepspkgstmp[*]}" ]] && - repodepspkgstmp=($(DiffArr 'repodepspkgs' 'repodepspkgstmp' -v)) + repodepspkgstmp=($(CommArr 'repodepspkgs' 'repodepspkgstmp' '-13')) [[ "${repodepspkgstmp[*]}" ]] && repodepspkgs+=("${repodepspkgstmp[@]}") && repodeps=("${repodepspkgstmp[@]}") && FindDepsRepo "${repodeps[@]}" @@ -597,7 +591,7 @@ FindDepsRepoProvider() { # remove duplicate [[ "${providerrepodepspkgstmp[*]}" ]] && - providerrepodepspkgstmp=($(DiffArr 'repodepspkgs' 'providerrepodepspkgstmp' -v)) + providerrepodepspkgstmp=($(CommArr 'repodepspkgs' 'providerrepodepspkgstmp' '-13')) if [[ "${providerrepodepspkgstmp[*]}" ]]; then repodepspkgs+=("${providerrepodepspkgstmp[@]}") @@ -632,14 +626,14 @@ IgnoreDepsChecks() { if [[ "$isignored" ]]; then [[ ! "$upgrade" ]] && Note "w" $"skipping target: ${colorW}$i${reset}" || Note "w" $"${colorW}$i${reset}: ignoring package upgrade" - Note "e" $"Unresolved dependency '${colorW}$i${reset}'" + Note "e" $"Unresolved dependency '${colorW}$i${reset}'" "$E_INSTALL_DEPS_FAILED" fi done for i in "${aurdepspkgs[@]}"; do # skip already checked dependencies [[ " ${aurpkgs[*]} " =~ " $i " ]] && continue [[ " ${rmaurpkgs[*]} " =~ " $i " ]] && - Note "e" $"Unresolved dependency '${colorW}$i${reset}'" + Note "e" $"Unresolved dependency '${colorW}$i${reset}'" "$E_INSTALL_DEPS_FAILED" unset isignored if [[ " ${ignoredpkgs[*]} " =~ " $i " ]]; then @@ -657,12 +651,12 @@ IgnoreDepsChecks() { if [[ ! "$noconfirm" ]]; then if ! Proceed "y" $"$i dependency is in IgnorePkg/IgnoreGroup. Install anyway?"; then Note "w" $"skipping target: ${colorW}$i${reset}" - Note "e" $"Unresolved dependency '${colorW}$i${reset}'" + Note "e" $"Unresolved dependency '${colorW}$i${reset}'" "$E_INSTALL_DEPS_FAILED" fi else [[ "$upgrade" ]] && Note "w" $"${colorW}$i${reset}: ignoring package upgrade" || Note "w" $"skipping target: ${colorW}$i${reset}" - Note "e" $"Unresolved dependency '${colorW}$i${reset}'" + Note "e" $"Unresolved dependency '${colorW}$i${reset}'" "$E_INSTALL_DEPS_FAILED" fi fi deps+=("$i") @@ -677,7 +671,7 @@ ProviderChecks() { # filter directly provided deps noprovidersdeps=($(expac -S1 '%n' "${repodepspkgs[@]}")) - providersdeps=($(DiffArr 'noprovidersdeps' 'repodepspkgs' -v)) + providersdeps=($(CommArr 'noprovidersdeps' 'repodepspkgs' '-13')) # remove installed providers providersdeps=($("$pacmanbin" -T -- "${providersdeps[@]}" | sort -u)) @@ -715,12 +709,12 @@ ProviderChecks() { providers=($(expac -Ss '%n' "^${providersdeps[$i]}$" | sort -u)) # filter out non matching versioned providers - [[ "${providersdepsnover[*]}" ]] && providers=($(DiffArr 'providersdepsnover' 'providers')) + [[ "${providersdepsnover[*]}" ]] && providers=($(CommArr 'providersdepsnover' 'providers' '-12')) # skip if provided in dependency chain unset repodepspkgsprovided - for j in "${providers[@]}"; do - [[ " ${repodepspkgs[*]} " =~ " $j " ]] && repodepspkgsprovided='true' + for j in "${!providers[@]}"; do + [[ " ${repodepspkgs[*]} " =~ " ${providers[$j]} " ]] && repodepspkgsprovided='true' done [[ "$repodepspkgsprovided" ]] && continue @@ -804,8 +798,8 @@ ConflictChecks() { # remove AUR versioning Aprovides=("${Aprovides[@]%%[><=]*}") Aconflicts=("${Aconflicts[@]%%[><=]*}") - aurconflicts=($(DiffArr 'Aprovides' 'allQconflicts')) - aurconflicts+=($(DiffArr 'Aconflicts' 'allQprovides')) + aurconflicts=($(CommArr 'Aprovides' 'allQconflicts' '-12')) + aurconflicts+=($(CommArr 'Aconflicts' 'allQprovides' '-12')) aurconflicts=($(printf '%s\n' "${aurconflicts[@]}" | sort -u)) for i in "${aurconflicts[@]}"; do @@ -841,9 +835,9 @@ ConflictChecks() { Note "f" $"failed to prepare transaction (conflicting dependencies)" if [[ "$upgrade" ]]; then Qrequires=($(expac -Q '%N' "$i")) - Note "e" $"$j and $k are in conflict (required by ${Qrequires[*]})" + Note "e" $"$j and $k are in conflict (required by ${Qrequires[*]})" "$E_INSTALL_DEPS_FAILED" else - Note "e" $"$j and $k are in conflict" + Note "e" $"$j and $k are in conflict" "$E_INSTALL_DEPS_FAILED" fi fi fi @@ -883,9 +877,9 @@ ConflictChecks() { fi done - repoconflicts+=($(DiffArr 'repodepsprovides' 'allQconflicts')) - repoconflicts+=($(DiffArr 'checkedrepodepsconflicts' 'allQprovides')) - repoconflicts=($(sort -u <<< "$(printf '%s\n' "${repoconflicts[@]}")")) + repoconflicts+=($(CommArr 'repodepsprovides' 'allQconflicts' '-12')) + repoconflicts+=($(CommArr 'checkedrepodepsconflicts' 'allQprovides' '-12')) + repoconflicts=($(printf '%s\n' "${repoconflicts[@]}" | sort -u)) fi for i in "${repoconflicts[@]}"; do @@ -907,9 +901,9 @@ ConflictChecks() { Note "f" $"failed to prepare transaction (conflicting dependencies)" if [[ "$upgrade" ]]; then Qrequires=($(expac -Q '%N' "$i")) - Note "e" $"$j and $k are in conflict (required by ${Qrequires[*]})" + Note "e" $"$j and $k are in conflict (required by ${Qrequires[*]})" "$E_INSTALL_DEPS_FAILED" else - Note "e" $"$j and $k are in conflict" + Note "e" $"$j and $k are in conflict" "$E_INSTALL_DEPS_FAILED" fi fi fi @@ -928,7 +922,7 @@ ReinstallChecks() { [[ " ${aurconflictingpkgs[*]} " =~ " ${depsAname[$i]} " ]] && continue [[ ! "${depsQver[$i]}" || "${depsQver[$i]}" = '#' ]] || [[ "$(vercmp "${depsAver[$i]}" "${depsQver[$i]}")" -gt 0 ]] && continue - [[ ! $installpkg && ! " ${aurdepspkgs[*]} " =~ " ${depsAname[$i]} " ]] && continue + [[ ! "$installpkg" && ! " ${aurdepspkgs[*]} " =~ " ${depsAname[$i]} " ]] && continue if [[ "${depsAname[$i]}" =~ $vcs ]]; then Note "w" $"${colorW}${depsAname[$i]}${reset} latest revision -- fetching" else @@ -936,7 +930,8 @@ ReinstallChecks() { Note "w" $"${colorW}${depsAname[$i]}-${depsQver[$i]}${reset} is up to date -- reinstalling" else Note "w" $"${colorW}${depsAname[$i]}-${depsQver[$i]}${reset} is up to date -- skipping" - deps=($(printf '%s\n' "${deps[@]}" | sed "s/^${depsAname[$i]}$//g")) + 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 fi @@ -1045,9 +1040,9 @@ Prompt() { printf '\n' if [[ "$installpkg" ]]; then - Proceed "y" $"Proceed with installation?" || exit + Proceed "y" $"Proceed with installation?" || exit "$E_FAIL" else - Proceed "y" $"Proceed with download?" || exit + Proceed "y" $"Proceed with download?" || exit "$E_FAIL" fi } @@ -1058,7 +1053,7 @@ DownloadPkgs() { GetPkgbase "$@" # no results check - [[ ! "${basepkgs[*]}" ]] && Note "e" $"no results found" + [[ ! "${basepkgs[*]}" ]] && Note "e" $"no results found" "$E_INSTALL_DEPS_FAILED" # reset for i in "${basepkgs[@]}"; do @@ -1070,7 +1065,8 @@ DownloadPkgs() { done # clone - auracle -C "$clonedir" clone "$@" >/dev/null || Note "e" $"failed to retrieve packages" + auracle -C "$clonedir" clone "$@" >/dev/null || + Note "e" $"failed to retrieve packages" "$E_INSTALL_DEPS_FAILED" } EditPkgs() { @@ -1101,7 +1097,7 @@ EditPkgs() { "$editor" "$clonedir/$i/PKGBUILD" && Note "i" $"${colorW}$i${reset} PKGBUILD viewed" || erreditpkg+=("$i") else - Note "e" $"Could not open ${colorW}$i${reset} PKGBUILD" + Note "e" $"Could not open ${colorW}$i${reset} PKGBUILD" "$E_MISSING_FILE" fi fi # show install script @@ -1113,7 +1109,7 @@ EditPkgs() { Note "i" $"${colorW}$j${reset} script viewed" || erreditpkg+=("$i") else - Note "e" $"Could not open ${colorW}$j${reset} script" + Note "e" $"Could not open ${colorW}$j${reset} script" "$E_MISSING_FILE" fi fi done @@ -1125,7 +1121,7 @@ EditPkgs() { "$editor" "$clonedir/$i/PKGBUILD" && Note "i" $"${colorW}$i${reset} PKGBUILD viewed" || erreditpkg+=("$i") else - Note "e" $"Could not open ${colorW}$i${reset} PKGBUILD" + Note "e" $"Could not open ${colorW}$i${reset} PKGBUILD" "$E_MISSING_FILE" fi if [[ "${installscripts[*]}" ]]; then for j in "${installscripts[@]}"; do @@ -1133,7 +1129,7 @@ EditPkgs() { "$editor" "$clonedir/$i/$j" && Note "i" $"${colorW}$j${reset} script viewed" || erreditpkg+=("$i") else - Note "e" $"Could not open ${colorW}$j${reset} script" + Note "e" $"Could not open ${colorW}$j${reset} script" "$E_MISSING_FILE" fi done fi @@ -1144,7 +1140,7 @@ EditPkgs() { for i in "${erreditpkg[@]}"; do Note "f" $"${colorW}$i${reset} errored on exit" done - exit 1 + exit "$E_FAIL" fi if [[ "$displaybuildfiles" = diff && "$viewed" ]]; then @@ -1170,7 +1166,7 @@ MakePkgs() { # current orphan and optional packages oldorphanpkgs=($("$pacmanbin" -Qdtq)) oldoptionalpkgs=($("$pacmanbin" -Qdttq)) - oldoptionalpkgs=($(DiffArr 'oldorphanpkgs' 'oldoptionalpkgs' -v)) + oldoptionalpkgs=($(CommArr 'oldorphanpkgs' 'oldoptionalpkgs' '-13')) # initialize sudo if sudo -n "$pacmanbin" -V > /dev/null || sudo -v; then @@ -1222,7 +1218,7 @@ MakePkgs() { done if [[ ! "$builtpkg" || "$rebuild" ]]; then - cd "$clonedir/${basepkgs[$i]}" || exit 1 + cd_safe "$clonedir/${basepkgs[$i]}" Note "i" $"Checking ${colorW}${pkgsdeps[$i]}${reset} integrity..." if [[ "$silent" = true ]]; then makepkg -f --verifysource "${makeopts[@]}" &>/dev/null @@ -1240,20 +1236,20 @@ MakePkgs() { (($? > 0)) && errmakepkg+=("${pkgsdeps[$i]}") fi done - if [[ "${errmakepkg[*]}" ]]; then + if [[ "${errmakepkg[*]}" || "${errinstall[*]}" ]]; then for i in "${errmakepkg[@]}"; do Note "f" $"failed to verify integrity or prepare ${colorW}$i${reset} package" done # remove sudo lock rm -f "${tmpdir:?}/pacaur.sudov.lck" - exit 1 + exit "$E_FAIL" fi # check database lock - [[ -e "/var/lib/pacman/db.lck" ]] && Note "e" $"db.lck exists in /var/lib/pacman" && exit 1 + [[ -e "/var/lib/pacman/db.lck" ]] && Note "e" $"db.lck exists in /var/lib/pacman" "$E_FAIL" # set build lock - [[ -e "$tmpdir/pacaur.build.lck" ]] && Note "e" $"pacaur.build.lck exists in $tmpdir" && exit 1 + [[ -e "$tmpdir/pacaur.build.lck" ]] && Note "e" $"pacaur.build.lck exists in $tmpdir" "$E_FAIL" touch "$tmpdir/pacaur.build.lck" # install provider packages and repo conflicting packages that makepkg --noconfirm cannot handle @@ -1267,9 +1263,9 @@ MakePkgs() { # get split packages list pkgsdepslist=($(awk -F "," '{for (k=1;k<=NF;k++) print $k}' <<< "${pkgsdeps[$i]}")) - cd "$clonedir/${basepkgs[$i]}" || exit 1 + cd_safe "$clonedir/${basepkgs[$i]}" # retrieve updated version - mapfile -t -d'-' k <<< "$(makepkg --packagelist)" && aurdevelpkgsAver="${k[1]}-${k[2]}" + mapfile -t -d'-' k <<< "$(makepkg --packagelist)" && aurdevelpkgsAver="${k[-3]}-${k[-2]}" unset k # build devel if necessary only (supported protocols only) if [[ "${basepkgs[$i]}" =~ $vcs ]]; then @@ -1376,24 +1372,25 @@ MakePkgs() { # new orphan and optional packages check orphanpkgs=($("$pacmanbin" -Qdtq)) - neworphanpkgs=($(DiffArr 'oldorphanpkgs' 'orphanpkgs' -v)) + neworphanpkgs=($(CommArr 'oldorphanpkgs' 'orphanpkgs' '-13')) for i in "${neworphanpkgs[@]}"; do Note "w" $"${colorW}$i${reset} is now an ${colorY}orphan${reset} package" done optionalpkgs=($("$pacmanbin" -Qdttq)) - optionalpkgs=($(DiffArr 'orphanpkgs' 'optionalpkgs' -v)) - newoptionalpkgs=($(DiffArr 'oldoptionalpkgs' 'optionalpkgs' -v)) + optionalpkgs=($(CommArr 'orphanpkgs' 'optionalpkgs' '-13')) + newoptionalpkgs=($(CommArr 'oldoptionalpkgs' 'optionalpkgs' '-13')) for i in "${newoptionalpkgs[@]}"; do Note "w" $"${colorW}$i${reset} is now an ${colorY}optional${reset} package" done # makepkg and install failure check - if [[ "${errmakepkg[*]}" || "${errinstall[*]}" ]]; then + if [[ "${errmakepkg[*]}" ]]; then for i in "${errmakepkg[@]}"; do Note "f" $"failed to build ${colorW}$i${reset} package(s)" done - exit 1 + exit "$E_PACKAGE_FAILED" fi + [[ "${errinstall[*]}" ]] && exit "$E_INSTALL_FAILED" } CheckUpdates() { @@ -1432,12 +1429,12 @@ CheckUpdates() { if [[ "${foreignpkgsbase[$i]}" =~ $vcs ]]; then [[ ! -d "$clonedir/${foreignpkgsbase[$i]}" ]] && DownloadPkgs "${foreignpkgsbase[$i]}" &>/dev/null - cd "$clonedir/${foreignpkgsbase[$i]}" || exit 1 + cd_safe "$clonedir/${foreignpkgsbase[$i]}" # silent extraction and pkgver update only makepkg -od --noprepare --skipinteg &>/dev/null # retrieve updated version mapfile -t -d'-' j <<< "$(makepkg --packagelist)" - aurdevelpkgsAver="${j[1]}-${j[2]}" && unset j + aurdevelpkgsAver="${j[-3]}-${j[-2]}" && unset j read -rd' ' <<< "$(expac -Qs '%v' "^${foreignpkgsbase[$i]}$")" aurdevelpkgsQver [[ "$(vercmp "$aurdevelpkgsQver" "$aurdevelpkgsAver")" -ge 0 ]] || aurpkgsQood+=("${foreignpkgsnobase[$i]}") && @@ -1473,7 +1470,7 @@ CheckUpdates() { fi fi # exit code - [[ "$exitrepo" = 0 || "$exitaur" = 0 ]] && exit 0 || exit 1 + [[ "$exitrepo" = 0 || "$exitaur" = 0 ]] && exit "$E_OK" || exit "$E_FAIL" } CleanCache() { @@ -1527,7 +1524,7 @@ CleanCache() { # get target if [[ "${pkgs[*]}" ]]; then pkgsbase=($(expac -Q '%e' "${pkgs[@]}")) - aurpkgsbase=($(DiffArr 'pkgsbase' 'foreignpkgsbase')) + aurpkgsbase=($(CommArr 'pkgsbase' 'foreignpkgsbase' '-12')) if Proceed "y" $"Do you want to remove ${aurpkgsbase[*]} clones from AUR clone directory?"; then printf "%s\n\n" $"removing uninstalled clones from AUR clone cache..." for i in "${aurpkgsbase[@]}"; do @@ -1561,7 +1558,7 @@ CleanCache() { fi fi fi - exit 0 + exit "$E_OK" } GetIgnoredPkgs() { @@ -1626,14 +1623,15 @@ GetJson() { [[ "$pkgname" ]] && filter="select(.Name == \"$pkgname\")" - jq -rM ".results[] | $filter | select(.$field) .$field | if type==\"array\" then .[] else . end" <<< "$json" 2> /dev/null || Note "e" $"Failed to parse JSON" + jq -rM ".results[] | $filter | select(.$field) .$field | if type==\"array\" then .[] else . end" <<< "$json" 2> /dev/null || + Note "e" $"Failed to parse JSON" "$E_FAIL" } CheckRequires() { local Qrequires=($(expac -Q '%N')) if [[ "${Qrequires[*]}" ]]; then Note "f" $"failed to prepare transaction (could not satisfy dependencies)" - Note "e" $"${Qrequires[@]}: requires $@" + Note "e" $"${Qrequires[@]}: requires $@" "$E_INSTALL_DEPS_FAILED" fi } @@ -1681,7 +1679,7 @@ Note() { w) printf '%b\n' "${colorY}warning:${reset} $2" >&2;; # warn f) printf '%b\n' "${colorR}error:${reset} $2" >&2;; # fail e) printf '%b\n' "${colorR}error:${reset} $2" >&2; # error - exit 1;; + exit "$3";; esac } @@ -1695,7 +1693,7 @@ GetLength() { } NothingToDo() { - [[ ! "$*" ]] && printf '%s\n' $" there is nothing to do" && exit || return 0 + [[ ! "$*" ]] && printf '%s\n' $" there is nothing to do" && exit "$E_OK" || return 0 } SudoV() { @@ -1706,10 +1704,10 @@ SudoV() { done } -DiffArr() { +CommArr() { # args are names of 2 arrays and outputs elements that are only in the 2nd local array1="$1[@]" array2="$2[@]" - grep -Fxf <(printf '%s\n' "${!array1}") <(printf '%s\n' "${!array2}") $3 + comm <(printf '%s\n' "${!array1}" | sort -u) <(printf '%s\n' "${!array2}" | sort -u) "$3" } trap Cancel INT @@ -1744,7 +1742,7 @@ Usage() { printf "%s\n" $" --noedit do not prompt to edit files" printf "%s\n" $" --rebuild always rebuild package(s)" printf "%s\n" $" --silent silence output" - exit 0 + exit "$E_OK" } # @@ -1766,15 +1764,17 @@ longopts+=('arch:' 'assume-installed:' 'cachedir:' 'color:' 'config:' 'dbpath:' 'ignore:' 'ignoregroup:' 'logfile:' 'overwrite:' 'print-format:' 'root:' 'sysroot:') longopts_aur=('aur' 'by:' 'devel' 'edit' 'literal' 'noedit' 'rebuild' 'repo' 'rsort:' 'searchby:' 'silent' 'sort:' 'update' 'version') -parseopts "${shortopts}" "${longopts[@]}" "${longopts_aur[@]}" -- "$@" || exit 1 +parseopts "${shortopts}" "${longopts[@]}" "${longopts_aur[@]}" -- "$@" || exit "$E_INVALID_OPTION" set -- "${OPTRET[@]}" -optret="${OPTRET[*]}"; optret="${optret%%--[[:space:]]*}" -[[ " ${optret} " =~ ' '-(S|-sync)' ' ]] && pacS=1 && operation=sync && ((pac++)) -[[ " ${optret} " =~ ' '-(Q|-query)' ' ]] && pacQ=1 && ((pac++)) -[[ " ${optret} " =~ ' '-([DFRTUV]|-database|-files|-remove|-deptest|-upgrade)' ' ]] && ((pac++)) -[[ " ${optret} " =~ ' '-(w|-downloadonly)' ' ]] && pacw=1 -[[ " ${optret} " =~ ' '-([glp]|-groups|-list|-print)' ' ]] && pacg=1 +for i in "${OPTRET[@]}"; do + [[ "$i" =~ ^--$ ]] && break + [[ "$i" =~ ^-(S|-sync)$ ]] && pacS=1 && operation=sync && ((pac++)) + [[ "$i" =~ ^-(Q|-query)$ ]] && pacQ=1 && ((pac++)) + [[ "$i" =~ ^-([DFRTUV]|-database|-files|-remove|-deptest|-upgrade)$ ]] && ((pac++)) + [[ "$i" =~ ^-(w|-downloadonly)$ ]] && pacw=1 + [[ "$i" =~ ^-([glp]|-groups|-list|-print)$ ]] && pacg=1 +done while true; do [[ "$1" = -[cdf-qs-zDFQRSTUV] ]] && pacmanarg+=("$1") @@ -1805,7 +1805,7 @@ while true; do --silent) silent=true; pacopts+=("--quiet"); auropts+=("--quiet") makeopts+=("--log");; -y|--refresh) refresh=1;; -h|--help) unset operation; (("$pac"==0)) && Usage;; - -v|--version) [[ "$pac" -eq 0 || "$1" = --version ]] && printf '%s\n' "pacaur $version" && exit 0;; + -v|--version) [[ "$pac" -eq 0 || "$1" = --version ]] && printf '%s\n' "pacaur $version" && exit "$E_OK";; --) shift; break;; esac shift @@ -1834,20 +1834,21 @@ fi # sanity check [[ "$aur" ]] && unset refresh [[ "$pacS" && "$cleancache" ]] && unset search info upgrade -[[ "$pac" -gt 1 ]] && Note "e" $"only one operation may be used at a time" +[[ "$pac" -gt 1 ]] && Note "e" $"only one operation may be used at a time" "$E_FAIL" [[ "$operation" = sync && ! "$search" && ! "$info" && ! "$cleancache" && "$EUID" -eq 0 ]] && - Note "e" $"you cannot perform this operation as root" + Note "e" $"you cannot perform this operation as root" "$E_ROOT" [[ "$pacS" && "$search" && "$info" ]] && - Note "e" $"invalid option: '--info' and '--search' may not be used together" + Note "e" $"invalid option: '--info' and '--search' may not be used together" "$E_INVALID_OPTION" [[ "$(command -v "${editor%% *}")" ]] || - Note "e" $"${colorW}\$VISUAL${reset} and ${colorW}\$EDITOR${reset} environment variables not set or defined ${colorW}editor${reset} not found" + Note "e" $"${colorW}\$VISUAL${reset} and ${colorW}\$EDITOR${reset} environment variables not set or defined ${colorW}editor${reset} not found" "$E_MISSING_FILE" [[ "$PACMAN" = "${0##*/}" ]] && - Note "e" $"you cannot use ${colorW}pacaur${reset} as PACMAN environment variable" -[[ -w "$clonedir" ]] || Note "e" $"${colorW}$clonedir${reset} does not have write permission" + Note "e" $"you cannot use ${colorW}pacaur${reset} as PACMAN environment variable" "$E_FAIL" +[[ -w "$clonedir" ]] || + Note "e" $"${colorW}$clonedir${reset} does not have write permission" "$E_FS_PERMISSIONS" [[ ! "${pkgs[*]}" && ! "${refresh}${upgrade}${cleancache}" && "$operation" =~ (sync|edit) ]] && - Note "e" $"no targets specified (use -h for help)" + Note "e" $"no targets specified (use -h for help)" "$E_FAIL" [[ ! "${pkgs[*]}" && " ${pacmanarg[*]} " =~ ' '-[RU]' ' && ! " ${pacmanarg[*]} " =~ ' -h ' ]] && - Note "e" $"no targets specified (use -h for help)" + Note "e" $"no targets specified (use -h for help)" "$E_FAIL" [[ "$repo" && "$aur" ]] && unset aur repo && Note "w" $"invalid option: '--repo' and '--aur' may not be used together, disabling both" @@ -1873,7 +1874,7 @@ case "$operation" in exitaur=$? fi # exit code - [[ "$exitrepo" = 0 || "$exitaur" = 0 ]] && exit 0 || exit 1 + [[ "$exitrepo" = 0 || "$exitaur" = 0 ]] && exit "$E_OK" || exit "$E_FAIL" # info (-Si, -i) handling elif [[ "$info" ]]; then if [[ ! "${pkgs[*]}" ]]; then @@ -1902,7 +1903,7 @@ case "$operation" in [[ "${pkgs[*]}" ]] && ClassifyPkgs "${pkgs[@]}" if [[ ! "$aur" ]]; then sudo "$pacmanbin" "${pacmanarg[@]}" "${pacopts[@]}" "${repopkgs[@]}" - (($?>0)) && [[ "$repo" ]] && exit 1 + (($?>0)) && [[ "$repo" ]] && exit "$E_FAIL" fi if [[ "${aurpkgs[*]}" && ! "$aur" ]]; then Note "w" $"Package(s) ${colorW}${aurpkgs[*]}${reset} not found in repositories, trying ${colorM}AUR${reset}..." |