#!/bin/bash dofetch() { COMMAND=${1//'${URI}'/$2} COMMAND=${COMMAND//'${DISTDIR}'/$3} $COMMAND } declare -i lastpatchdistance patchdistance getbestpatchpath() { local i lastpatchpath packagelist filetoobtain lastpatchdistance=1024 filetoobtain=${1%% *} packagelist=$1 # echo "${dtulist[i]}: ${oldlist[i]} > ${newlist[i]}"; for i in $(seq $numallpatches); do if [ "${newlist[i]}" == "$filetoobtain" ] && [ "$packagelist" == "${packagelist%${oldlist[i]}*}" ] then # echo "found update to $filetoobtain" for repo in $PACKAGE_PATH; do # if [ -f "$REPOSITORY/${oldlist[i]}" ]; then if [ -f "$repo/${oldlist[i]}" ]; then patchdistance=1 patchpath=${dtulist[i]} return; fi done getbestpatchpath "${oldlist[i]} $packagelist" #echo "getbestpatchpath $recursiondepth returned: $patchpath $patchdistance" if [ $patchdistance -lt $lastpatchdistance ]; then lastpatchdistance=$patchdistance lastpatchpath="$patchpath ${dtulist[i]}"; fi #echo "$lastpatchpath $lastpatchdistance" #echo fi done patchdistance=$lastpatchdistance+1 patchpath=$lastpatchpath # echo "return $patchdistance $patchpath $recursiondepth" } add_dtu_upgrade () { let "numallpatches+=1" oldlist[numallpatches]=$1 newlist[numallpatches]=$2 dtulist[numallpatches]=$3 } if [ -z "$2" ]; then echo "must pass two options: download link and destination" exit 1; fi REPOSITORY=$2 #local distfiles folder MIRROR=`dirname $1` #download URL NEWFILE=`basename $1` #name of desired package echo "need to obtain $NEWFILE" declare -a oldlist newlist dtulist declare -i numallpatches while read format option1 option2 option3 do case $format in "0") add_dtu_upgrade $option1 $option2 $option3 ;; "1") add_dtu_upgrade $option1 $option2 ${option1%.t*}.fdtu ;; "2") add_dtu_upgrade $option2 $option1 ${option2%.t*}.bdtu ;; esac done if [ ! -z $numallpatches ]; then getbestpatchpath $NEWFILE; fi if [ -z "$patchpath" ]; then echo "Couldn't find old package to update." exit 2; fi echo "will try patch sequence: $patchpath" for patchtotry in $patchpath; do URI=$MIRROR/$patchtotry; DISTDIR=$REPOSITORY if [ -f "$REPOSITORY/$patchtotry" ]; then # retcode=`edelta -pi $REPOSITORY/$patchtotry` # if [ ! "${retcode%truncated}" = "$retcode" ]; then echo "continue download"; dofetch "$PATCH_RESUMECOMMAND" $URI $DISTDIR # else # echo "have patch $patchtotry"; # fi else echo "downloading patch $patchtotry" dofetch "$PATCH_FETCHCOMMAND" $URI $DISTDIR if [ $? -ne 0 ]; then echo "Couldn't find patch for update" exit 3; fi; fi; patchOK=`edelta -pi $REPOSITORY/$patchtotry` if [ -z "$patchOK" ]; then rm $REPOSITORY/$patchtotry echo "Corrupt patch." exit 4; fi done cd $REPOSITORY echo "Apply patch(es)" deltup -prD "$PACKAGE_PATH" $patchpath if [ ! -f $REPOSITORY/$NEWFILE ]; then echo "Patching failed." exit 5; fi rm $patchpath