diff options
| -rwxr-xr-x | .local/bin/dotfiles | 34 |
1 files changed, 14 insertions, 20 deletions
diff --git a/.local/bin/dotfiles b/.local/bin/dotfiles index e953cd6..e7a581a 100755 --- a/.local/bin/dotfiles +++ b/.local/bin/dotfiles @@ -15,19 +15,6 @@ clipboard_hint() { echo -e "Copied to clipboard:\n\n$cmd\n" } -# is_sync cmd pack -# e.g.: is_sync pacman python-pipx -# return 0 → package is installed and up-to-date -# return 1 → package is not installed or out-of-date -is_sync() { - local cmd="${1:?cmd argument missing}" - local pack="${2:?pack argument missing}" - if ! "$cmd" --query "$pack" >/dev/null 2>&1 || "$cmd" --query --upgrades "$pack" >/dev/null 2>&1; then - return 1 - fi - return 0 -} - # sync_packs cmd packages [sync-flag…] # cmd → pacman or yay # packages → nameref to an array containing a list of packages to sync @@ -37,13 +24,20 @@ sync_packages() { local -n packages="${2:?packages argument missing}" shift 2 local sync_args=("$@") - local out_of_sync_deps=() - for dep in "${packages[@]}"; do - if ! is_sync "$cmd" "$dep"; then out_of_sync_deps+=("$dep"); fi - done - if ((${#out_of_sync_deps[@]} == 0)); then return; fi - if prompt_for_install "Out-of-sync packages: ${out_of_sync_deps[*]}"; then - sudo "$cmd" --sync "${sync_args[@]}" "${out_of_sync_deps[@]}" + readarray -t packages_to_install < <( + comm -13 \ + <(sort <("$cmd" --query --quiet)) \ + <(sort <(printf '%s\n' "${packages[@]}")) + ) + readarray -t packages_to_upgrade < <( + comm -12 \ + <(sort <("$cmd" --query --upgrades --quiet)) \ + <(sort <(printf '%s\n' "${packages[@]}")) + ) + local packages_to_sync=("${packages_to_install[@]}" "${packages_to_upgrade[@]}") + if ((${#packages_to_sync[@]} == 0)); then return; fi + if prompt_for_install "Out-of-sync packages: ${packages_to_sync[*]}"; then + sudo "$cmd" --sync "${sync_args[@]}" "${packages_to_sync[@]}" fi } |
