From 1a3803a2f5600abd548aeecd3adb4124e6060129 Mon Sep 17 00:00:00 2001 From: Fun Date: Mon, 8 Jan 2018 01:59:04 +0200 Subject: [PATCH 2/3] pkgmk: refactor download_file() This makes the function much more clear while giving the user more flexibility with downloads from mirrors. The download_url_from_any_mirror() function can be redefined in /etc/pkgmk.conf to: - download the original URL first and than from mirrors (see FS#1385) - use different mirrors for a specific repository or port - shuffle the mirrors ( printf '%s\n' "${PKGMK_SOURCE_MIRRORS[@]}" | shuf ) --- pkgmk.in | 56 +++++++++++++++++++++++--------------------------------- 1 file changed, 23 insertions(+), 33 deletions(-) diff --git a/pkgmk.in b/pkgmk.in index 416358a..5c0bb3c 100755 --- a/pkgmk.in +++ b/pkgmk.in @@ -64,11 +64,6 @@ get_filename() { fi } -get_basename() { - local FILE="`echo $1 | sed 's|^.*://.*/||g'`" - echo $FILE -} - check_pkgfile() { if [ ! "$name" ]; then error "Variable 'name' not specified in $PKGMK_PKGFILE." @@ -114,10 +109,31 @@ download_url() { ${RESUME/1/-c} "--directory-prefix=${DEST%/*}" "--output-document=$DEST" "$URL" } +download_url_from_any_mirror() { + local URL=$1 + local BASENAME=$2 + local DEST=$3 + local RESUME=$4 + + local REPO + for REPO in ${PKGMK_SOURCE_MIRRORS[@]%/}; do + download_url "$REPO/$BASENAME" "$DEST" $RESUME && return 0 + done + + download_url "$URL" "$DEST" $RESUME && return 0 + + if [ "$RESUME" ]; then + info "Partial download failed, restarting" + rm -f "$DEST" + download_url "$URL" "$DEST" && return 0 + fi + + return 1 +} + download_file() { info "Downloading '$1'." - LOCAL_FILENAME=`get_filename $1` LOCAL_FILENAME_PARTIAL="$LOCAL_FILENAME.partial" local RESUME_OPTS= @@ -126,33 +142,7 @@ download_file() { RESUME_OPTS=1 fi - error=1 - - BASENAME=`get_basename $1` - for REPO in ${PKGMK_SOURCE_MIRRORS[@]}; do - REPO="`echo $REPO | sed 's|/$||'`" - download_url "$REPO/$BASENAME" "$LOCAL_FILENAME_PARTIAL" $RESUME_OPTS - error=$? - if [ $error == 0 ]; then - break - fi - done - - if [ $error != 0 ]; then - while true; do - download_url "$1" "$LOCAL_FILENAME_PARTIAL" $RESUME_OPTS - error=$? - if [ $error != 0 ] && [ "$RESUME_OPTS" ]; then - info "Partial download failed, restarting" - rm -f "$LOCAL_FILENAME_PARTIAL" - RESUME_OPTS="" - else - break - fi - done - fi - - if [ $error != 0 -o ! -f "$LOCAL_FILENAME_PARTIAL" ]; then + if ! download_url_from_any_mirror "$1" "${LOCAL_FILENAME##*/}" "$LOCAL_FILENAME_PARTIAL" $RESUME_OPTS; then error "Downloading '$1' failed." exit $E_DOWNLOAD fi -- 2.17.0