summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authore5ten <e5ten.arch@gmail.com>2019-04-24 18:10:37 -0400
committere5ten <e5ten.arch@gmail.com>2019-05-03 14:03:18 -0400
commit4b334a85e61290e8f33b84f21e4ba48c4384cfec (patch)
treeefceafc9c349912e2de58a938bbe51111c21a2d3
parent3b1d087991c8453d1ec9cf54b7927040ee8582cc (diff)
compare arrays in CommArr using comm and sort, switch back to for loop for early opt-parsing, syntax changes
-rwxr-xr-xpacaur255
1 files changed, 128 insertions, 127 deletions
diff --git a/pacaur b/pacaur
index 011e379..ecdd0e0 100755
--- a/pacaur
+++ b/pacaur
@@ -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}..."