--- getdelta.sh +++ getdelta.sh @@ -25,6 +25,9 @@ VERSION="0.7" # Changelog +# version 0.7.9 2008/10/08 +# - add second parameter for destination name (EAPI=2) +# - quote more carefully # version 0.7.8 2007/07/13 # - added option -O to call of emerge when finding mirrors # - replaced some calls of coreutils with bash-internals @@ -326,13 +329,13 @@ remove() { output "${GREEN}You have chosen to remove ${CYAN}$1\n" - pushd ${DISTDIR} >/dev/null 2>&1 + pushd -- "${DISTDIR}" >/dev/null 2>&1 removeme=true for n in $(grep -v "^#" ${DO_NOT_REMOVE}) do grep -q $n <<< "$1" && removeme=false && output "${CYAN}${1}${RED} is not deleted, since it matches ${n} in ${DO_NOT_REMOVE}" done - $removeme && rm -f $1 + $removeme && rm -f -- "$1" popd >/dev/null 2>&1 } @@ -349,7 +352,7 @@ -e "s/src4/srcDDD/g" \ -e "s/src5/srcEEE/g" \ -e "s/src6/srcFFF/g" \ - -e "s/src7/srcGGG/g" <<< $MASK_FILENAME) + -e "s/src7/srcGGG/g" <<< "$MASK_FILENAME") fi # ignore PR for src-files of firefox @@ -375,7 +378,7 @@ -e "s/rc//g" \ -e "s/[\._-]//g" \ -e "s/\+//g" \ - -e "s/ //g" <<< $MASK_FILENAME) + -e "s/ //g" <<< "$MASK_FILENAME") } # create or update a config-file @@ -384,6 +387,7 @@ add_to_configfile LOCAL_MIRROR "" "set this to one or more (space separated) URI ending with '/' if you want to check one or more local mirror(s) first\n# most people just leave it empty." add_to_configfile DELTUP_SERVER "http://linux01.gwdg.de/~nlissne/deltup.php" "deltup-server to use" add_to_configfile FETCH "/usr/bin/wget -t 1 --passive-ftp" "command to use for downloading" +add_to_configfile FETCHNAME "$FETCH -O" "command to use for downloading; first parameter is the filename, second the url" add_to_configfile QUEUERETRY 15 "number of seconds to wait before a queued request is retried" add_to_configfile MAXIMUM_ACCEPTABLE_QUEUEPOS "15" "the maximum queuepos you would accept (if higher download full archive instead)" add_to_configfile QUEUETIMEOUT 900 "when a dtu-request is queued - how long should we wait max. before downloading the original archive instead (in seconds)" @@ -424,14 +428,14 @@ add_to_donotremove "^rp-pppoe" -if [ -z $1 ] +if [ -z "$1" ] then COLOR=true echo -e "${YELLOW}getdelta.sh version ${VERSION}" echo "This script has to be called like this:" echo -e "${CYAN}$0 " echo -e "\n${YELLOW}To use it, you should just put the following line into your /etc/make.conf" - echo -e "${GREEN}FETCHCOMMAND=\"$0 \\\${URI}\"" + echo -e "${GREEN}FETCHCOMMAND=\"$0 \\\"\\\${URI}\\\" \\\"\\\${FILE}\\\"\"" echo -e "\n${YELLOW}There is a config-file ${CYAN}${GETDELTA_CONFIGFILE}${YELLOW} with some variables to control the behaviour of this script." echo -e "Edit it to your needs.${NORMAL}" exit 1 @@ -464,9 +468,10 @@ output "use getdelta.sh for your FETCHCOMMAND, only." && sleep 5 && exit 1 -pushd $DISTDIR >/dev/null 2>/dev/null +pushd -- "$DISTDIR" >/dev/null 2>/dev/null ORIG_URI=$1 -NEW_FILE=$(basename $ORIG_URI) +NEW_FILE=$2 +[ -z "${NEW_FILE}" ] && NEW_FILE=${ORIG_URI##*/} # repoman downloads metadata.dtd with FETCHCOMMAND # this should not be done with getdelta - so just fetch the file and exit @@ -475,7 +480,7 @@ # dtu files. if [ "${NEW_FILE}" = "metadata.dtd" ] || [ "$GETDELTA" = "0" ] then - $FETCH $@ + $FETCHNAME "$NEW_FILE" "$ORIG_URI" exit $? fi @@ -516,7 +521,7 @@ # output "${GREEN}Searching for a previously downloaded file in ${YELLOW}${DISTDIR}\n" -first_chars=$(sed 's/[[:digit:]][[:print:]]*$//' <<< $NEW_FILE) +first_chars=$(sed 's/[[:digit:]][[:print:]]*$//' <<< "$NEW_FILE") length_first_chars=${#first_chars} [ $length_first_chars -lt 3 ] && first_chars="${NEW_FILE:0:2}" @@ -527,7 +532,7 @@ let len1=${#mask} filelist="" -for name in $( ls ${first_chars}* 2>/dev/null ) +for name in $( ls -- "${first_chars}"* 2>/dev/null ) do mask2=$(mask_name "${name}") # add any file, that results in the same mask or differ not more than two letters @@ -582,7 +587,7 @@ # find matching part of filename - first: frontmatch x=0; - a=($NEW_FILE $filelist) + a=("$NEW_FILE" $filelist) match="" while [ -z "$match" ] do @@ -657,7 +662,7 @@ FILE_IS_CORRUPT=false if $CHECK_OLD_FILE then - file_digest=$(grep -h ${best_candidate} ${FILESDIR}/digest-* | sed -n 1p) + file_digest=$(grep -h ${best_candidate} "${FILESDIR}"/digest-* | sed -n 1p) if [ "$file_digest" ] then file_md5=$(cut -d ' ' -f2 <<< "$file_digest") @@ -669,7 +674,7 @@ FILE_IS_CORRUPT=true fi else - if [ $(rev <<< ${best_candidate} | cut -d. -f2 | rev) = "tar" ] + if [ $(rev <<< "${best_candidate}" | cut -d. -f2 | rev) = "tar" ] then output "${YELLOW}Could not find a digest-file for ${CYAN}${best_candidate}${YELLOW}. Testing file integrity with tar.\n" if ! tar -tf ${best_candidate} >/dev/null @@ -698,10 +703,10 @@ # Remember where we are, and go to a new dir there we can work tmp_dwn_dest="${DISTDIR}/.getdelta-`date +%N`-tmp" - mkdir ${tmp_dwn_dest} + mkdir -- "${tmp_dwn_dest}" # If user abort Ctrl+C (signal 2), remove tmp-dir; enabable trap again and send it again to stop wget - trap "rm -r ${tmp_dwn_dest}; trap 2; kill -2 $$" 2 - pushd ${tmp_dwn_dest} >/dev/null 2>&1 + trap 'rm -r -- "${tmp_dwn_dest}"; trap 2; kill -2 '$$ 2 + pushd -- "${tmp_dwn_dest}" >/dev/null 2>&1 # thanks to MATSUI Fe2+ Tetsushi for idea and patch FILESIZE=$(stat -c %s "${DISTDIR}/${best_candidate}") @@ -761,20 +766,20 @@ done fi - if [ -f ${best_candidate}-${NEW_FILE}.failed ] + if [ -f "${best_candidate}-${NEW_FILE}.failed" ] then output "\n${RED}The server could not build the dtu-file for ${NEW_FILE}\n" output "${YELLOW}reason:\n${RED}$(cat ${best_candidate}-${NEW_FILE}.failed)\n" - rm -rf ${best_candidate}-${NEW_FILE}.failed + rm -rf -- "${best_candidate}-${NEW_FILE}.failed" fi - if [ -f ${best_candidate}-${NEW_FILE}.dtu ] + if [ -f "${best_candidate}-${NEW_FILE}.dtu" ] then output "${GREEN}Successfully fetched the dtu-file - let's build ${NEW_FILE}...\n" - downloadsize=$(stat -c %s ${best_candidate}-${NEW_FILE}.dtu) - if deltup -p -v -D ${DISTDIR} ${best_candidate}-${NEW_FILE}.dtu + downloadsize=$(stat -c %s "${best_candidate}-${NEW_FILE}.dtu") + if deltup -p -v -D "${DISTDIR}" "${best_candidate}-${NEW_FILE}.dtu" then - newsize=$(stat -c %s ${NEW_FILE}) + newsize=$(stat -c %s "${NEW_FILE}") let savedsize=${newsize}-${downloadsize} let percent=${savedsize}*100/${newsize} unit="bytes" @@ -791,8 +796,8 @@ esac output "${YELLOW}This dtu-file saved ${UCOLOR}${savedsize} ${unit} (${percent}%)${YELLOW} download size.\n" fi - mv -f ${NEW_FILE} ${DISTDIR} && - ${REMOVE_OLD} && remove "${best_candidate}" + mv -f -- "${NEW_FILE}" "${DISTDIR}" && + ${REMOVE_OLD} && remove ${best_candidate} fi fi # if $FETCH "${DELTUP_SERVER}${query}" @@ -812,7 +817,7 @@ read fi popd >/dev/null 2>&1 - rm -rf ${tmp_dwn_dest} + rm -rf -- "${tmp_dwn_dest}" #stop respond to trap2 trap 2 fi # if ! FILE_IS_CORRUPT @@ -824,10 +829,10 @@ # Ok, once we are here, we should have got the delta (and used it) # or we still have to download the full file -if ! [ -f ${DISTDIR}/${NEW_FILE} ] +if ! [ -f "${DISTDIR}/${NEW_FILE}" ] then output "${RED}The dtu could not be fetched,${YELLOW} downloading full file from original URL\n" - $FETCH $ORIG_URI + $FETCHNAME "$NEW_FILE" "$ORIG_URI" # remember we had a fallback to use correct exitcode for portage FALLBACK=$? fi