diff --git a/src/lib/abs.sh.in b/src/lib/abs.sh.in index 77cf57f..3d871bb 100644 --- a/src/lib/abs.sh.in +++ b/src/lib/abs.sh.in @@ -395,32 +395,59 @@ sync_packages() { fi [[ $1 ]] || return 0 # Install from arguments - declare -A pkgs_search pkgs_found - declare -a repo_pkgs aur_pkgs bin_pkgs + declare -A pkgs_search pkgs_found pkgs_cached repo_pkgs aur_pkgs cached_pkgs + declare -a bin_pkgs local _arg=("$@") _pkg repo pkg target [[ $SP_ARG ]] && _arg=($(pacman_parse -T "${_arg[@]}")) for _pkg in "${_arg[@]}"; do pkgs_search[$_pkg]=1; done + # Search for exact match, pkg which provides it, then in AUR - while read repo pkg target; do - ((pkgs_search[$target])) || continue - unset pkgs_search[$target] - ((pkgs_found[$pkg])) && continue - pkgs_found[$pkg]=1 - if [[ "${repo}" != "aur" ]]; then - repo_pkgs+=("${repo}/${pkg}") - else - ((NEEDED)) && pkgquery -Qqii "$target" && continue - aur_pkgs+=("$pkg") - fi - done < <(pkgquery -f "%r %n %t" -1SAii "${!pkgs_search[@]}") + local tmpfile=$(mktemp --tmpdir="$YAOURTTMPDIR") + + pkgquery -f "%r %n %t %v" -1SAii "${!pkgs_search[@]}" 2>/dev/null >$tmpfile + [[ "$?" != "0" ]] && warning "no network connection" || + while read repo pkg target version; do + ((pkgs_search[$target])) || continue + unset pkgs_search[$target] + ((pkgs_found[$pkg])) && continue + pkgs_found[$pkg]=1 + [[ "$(ls "$CACHE_DIR" | grep "^${pkg}")" ]] && + pkgs_cached["${pkg}"]="${version}" + if [[ "${repo}" != "aur" ]]; then + repo_pkgs[$pkg]="${repo}/${pkg}" + else + ((NEEDED)) && pkgquery -Qqii "$target" && continue + aur_pkgs[$pkg]=1 + fi + done < $tmpfile + # In case there is a double version check, eg. pkg1>0.1 pkg2<0.3 # package-query does only one check, so perform the remaining checks for pkg in "${!pkgs_search[@]}"; do - _pkg=${pkg%%[<>=]*} + local _pkg=${pkg%%[<>=]*} + local _cached="$(ls "$CACHE_DIR" | grep "^$_pkg")" if [[ " ${!pkgs_found[@]} " =~ " $_pkg " ]]; then pkgquery -q -1SAii "$pkg" && unset pkgs_search[$pkg] + elif [[ $_cached ]]; then + cached_pkgs[$_pkg]="$CACHE_DIR/$_cached" && unset pkgs_search[$pkg] fi done + + # Install from cached packages + for _pkg in "${!pkgs_cached[@]}"; do + local _cached="$(ls "$CACHE_DIR" | grep "^$_pkg")" + if [[ $_cached ]]; then + [[ "$_cached" = ${_pkg}-${pkgs_cached["$_pkg"]}* ]] && + cached_pkgs[$_pkg]="$CACHE_DIR/$_cached" + fi + done + (( ! DOWNLOAD_ONLY)) && for _pkg in "${!cached_pkgs[@]}"; do + local _file="${cached_pkgs[$_pkg]}" + su_pacman -U "${PACMAN_S_ARG[@]}" "$_file" && + unset aur_pkgs[$_pkg] && unset repo_pkgs[$_pkg] || + manage_error "$_pkg" || return 1 + done + bin_pkgs=("${!pkgs_search[@]}") for _pkg in "${repo_pkgs[@]}"; do install_from_abs "$_pkg" || return 1 @@ -432,7 +459,7 @@ sync_packages() { su_pacman -S "${PACMAN_S_ARG[@]}" "${bin_pkgs[@]}" || return 1 fi fi - for _pkg in "${aur_pkgs[@]}"; do + for _pkg in "${!aur_pkgs[@]}"; do install_from_aur "$_pkg" || return 1 done return 0 diff --git a/src/lib/pkgbuild.sh.in b/src/lib/pkgbuild.sh.in index c433759..242aafb 100644 --- a/src/lib/pkgbuild.sh.in +++ b/src/lib/pkgbuild.sh.in @@ -282,6 +282,10 @@ build_package() { # Build SRCDEST="$YSRCDEST" PKGDEST="$YPKGDEST" y_makepkg -s -c -f -p ./PKGBUILD + # Cache it + msg $(_gettext 'Caching locally: %s %s-%s' "$pkgbase" "$pkgver" "$pkgrel") + cp -uv "$YPKGDEST/"*.pkg.* "$CACHE_DIR" || failed=1 + if (( $? )); then error $(_gettext 'Makepkg was unable to build %s.' "$pkgbase") return 1 @@ -403,11 +407,12 @@ package_loop() { *) return 99 ;; # should never execute esac done - (( ! ret )) && (( ! failed )) && + (( ! ret )) && (( ! failed )) && (( ! DOWNLOAD_ONLY )) && ( [[ $MAJOR == "pkgbuild" ]] && (( INSTALL_FLAG )) || ! [[ $MAJOR == "pkgbuild" ]] ) && { install_package || failed=1; } - [[ $MAJOR == "pkgbuild" ]] && (( ! INSTALL_FLAG )) && cp -v "$YPKGDEST/"*.pkg.* "$YPKGBUILDDIR" + [[ $MAJOR == "pkgbuild" ]] && (( ! INSTALL_FLAG )) && cp -v "$YPKGDEST/"*.pkg.* $YPKGBUILDDIR + rm -r "$YPKGDEST" return $failed } diff --git a/src/lib/util.sh.in b/src/lib/util.sh.in index 486a8c6..3d4e145 100644 --- a/src/lib/util.sh.in +++ b/src/lib/util.sh.in @@ -168,6 +168,9 @@ init_paths() { YAOURTTMPDIR="$TMPDIR/yaourt-tmp-$(id -un)" mkdir -p "$YAOURTTMPDIR" || check_dir YAOURTTMPDIR || die 1 (( EXPORT )) && [[ $EXPORTDIR ]] && { check_dir EXPORTDIR || die 1; } + [[ ! "$CACHE_DIR" ]] && CACHE_DIR="@cachedir@" && + ! [[ -d "$CACHE_DIR" ]] && { mkdir -p "$CACHE_DIR" || die 1; } + check_dir CACHE_DIR || die 1; parse_pacman_conf } diff --git a/src/man/yaourt.8 b/src/man/yaourt.8 index d9d833f..61ce300 100644 --- a/src/man/yaourt.8 +++ b/src/man/yaourt.8 @@ -262,6 +262,11 @@ Specify a custom AUR url (default to https://aur.archlinux.org)\&. Build from sources, ABS for official packages, or AUR if packages is not found\&. Specify this option twice to build all dependencies\&. .RE .PP +\fB\-\-cachedir