#!/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

