File update_source of Package obs-service-update_source
#!/bin/bash
# update sources
WGET_TIMEOUT="-T 60"
ADD_URL=""
while test $# -gt 0; do
case $1 in
*-add_url)
ADD_URL="$2"
shift
;;
*-outdir)
MYOUTDIR="$2"
shift
;;
*)
echo Unknown parameter $1.
echo 'this service is not accepting parameters currently'
exit 1
;;
esac
shift
done
if [ ! -d "$MYOUTDIR" ]; then
echo "ERROR: output directory does not exist"
exit 1
fi
function find_new_url() {
local file=$1
local url=$2
local version=$3
urlmatch=${url//$version/[^>]*}
urlmatch=${urlmatch##*/}
local highest_url="$url"
for u in `sed -n -e 's,.* href=.\('$urlmatch'\).>.*,\1,p' $file`; do
if [[ "${highest_url##*/}" < "${u##*/}" ]]; then
highest_url="$u"
fi
done
if [ "$highest_url" != "$url" ]; then
if [ "${highest_url%/.*}" == "$highest_url" ]; then
# not an absolute url
echo "${url%/*}/$highest_url"
else
echo $highest_url
fi
fi
}
for spec in *.spec; do
[ "$spec" == "*.spec" ] && exit 0
NAME=`sed -n 's/^Name:[ ]*\(.*\)/\1/p' "$spec"`
VERSION=`sed -n 's/^Version:[ ]*\(.*\)/\1/p' "$spec"`
NEW_URLS=""
for u in `sed -n 's,^Source[^:]*:[ ]*\(.*://.*\),\1,p' "$spec"` `sed -n 's,^Patch[^:]*:[ ]*\(.*://.*\),\1,p' "$spec"`; do
PROTOCOL="${u%%:*}"
my_new_url=""
if [ "$PROTOCOL" == "http" -o "$PROTOCOL" == "https" -o "$PROTOCOL" == "ftp" ]; then
url="$u"
url="${url//%\{name\}/$NAME}"
url="${url//%name/$NAME}"
url="${url//%\{version\}/$VERSION}"
url="${url//%version/$VERSION}"
# try to list parent
TEMPFILE=`mktemp --tmpdir=$TMPDIR obs-service-source_update-XXXXXXX`
/usr/bin/wget $WGET_TIMEOUT -O "$TEMPFILE" -4 --no-check-certificate -q "${url%/*}"
new_url=`find_new_url $TEMPFILE "$url" "$VERSION"`
rm -f "$TEMPFILE"
if [[ "$url" < "$new_url" ]]; then
# run the update
cd "$MYOUTDIR"
if /usr/bin/wget $WGET_TIMEOUT -4 --no-check-certificate -q "$new_url"; then
# file is downloadable
NEW_VERSION="${new_url##${url%${VERSION}*}}"
NEW_VERSION="${NEW_VERSION%${url##*${VERSION}}}"
[ -f "$spec" ] || cp "$OLDPWD/$spec" "$spec"
sed -i -e "s,^Version:.*,Version: $NEW_VERSION," -e "s,^Release:.*,Release: 0," "$spec"
fi
cd -
fi
fi
done
if [ "$ADD_URL" == "yes" -a "$PROTOCOL" != "http" -a "$PROTOCOL" != "https" -a "$PROTOCOL" != "ftp" ]; then
# ask freshmeat.net. Don't use RPC, so that it works for everybody. results in this wild html parser ...
TEMPFILE=`mktemp --tmpdir=$TMPDIR obs-service-source_update-XXXXXXX`
/usr/bin/wget $WGET_TIMEOUT -O "$TEMPFILE" -4 --no-check-certificate -q "http://freshmeat.net/projects/$NAME"
freshmeat_version=`sed -n 's,.*<a href="/projects/[^/]*/releases/[^"]*">\([^<]*\)</a>.*,\1,p' $TEMPFILE | head -n 1`
if [[ "$freshmeat_version" > "$VERSION" ]] || [ "$freshmeat_version" == "$VERSION" ]; then
freshmeat_url=`sed -n 's,.*<a href="\(/urls/[^"]*\)">Tar/GZ</a>.*,\1,p' $TEMPFILE`
new_url=`curl -s "http://freshmeat.net$freshmeat_url" | sed -n 's,.*<a href="\([^"]*\)">.*,\1,p'`
# run the update
cd "$MYOUTDIR"
SUCCESS=""
if /usr/bin/wget $WGET_TIMEOUT -4 --no-check-certificate -q "$new_url"; then
SUCCESS="yes"
else
# it is maybe just a path to a browsable directory
new_url="$new_url/"`curl -s ftp://ftp.gnu.org/gnu/a2ps/ | awk '{ print $9 }' | grep "^${NAME}-${freshmeat_version}" |head -n 1`
if /usr/bin/wget $WGET_TIMEOUT -4 --no-check-certificate -q "$new_url"; then
SUCCESS="yes"
fi
fi
if [ "$SUCCESS" == "yes" ]; then
# file is downloadable
[ -f "$spec" ] || cp "$OLDPWD/$spec" "$spec"
sed -i -e "s,^Version:.*,Version: $freshmeat_version," -e "s,^Release:.*,Release: 0," -e "s,^Source:.*,Source: $new_url," "$spec"
fi
cd -
fi
rm -f "$TEMPFILE"
fi
# IMPLEMENT ME: try to automatic re-roll the patches
done
exit 0