#!/bin/bash

# -------------------------------------------------------------------
# Copyright (C) 2006,2009,2013 by Intevation GmbH
# Author(s):
# Sascha Wilde <wilde@intevation.de>

# This program is free software under the GNU GPL (>=v2)
# Read the file COPYING coming with the software for details.
# -------------------------------------------------------------------

# How to use:
#
# dpkg -l  | grep '^ii' | gzip >packages.gz
# mkdir sources
# cd sources
# dl-src-for-package-list.sh ../packages.gz 2>&1 | tee ../dl-src.log

packagelist="$1"
exceptionslist="${packagelist%.gz}.exceptions"

[ -f "$exceptionslist" ] && \
  echo "Using exceptions from $exceptionslist" && \
  read -d '' -a excepts <$exceptionslist

getexception() {
  for i in `seq 0 2 ${#excepts[*]}` ; do
    [ "${excepts[$i]}" = "$1" ] && echo ${excepts[$(($i+1))]} && return
  done
}

for pkg in $( zcat "$packagelist" | awk '/^ii/{print $2"="$3}' ) ; do
  echo "$pkg" | ( 
    trap "exit 23" INT
    OLDIFS="$IFS"
    IFS="=" ; read name version
    IFS="$OLDIFS"
    name=$( sed 's/:\(i386\|amd64\)$//' <<<"$name" )
    srcfromshow=$( apt-cache show "$name=$version" | grep '^Source: .*(' )

    if [ "$srcfromshow" ] ; then
      srcname=$( sed 's/Source: \(.*\) (.*/\1/' <<<"$srcfromshow" )
      srcver=$( sed 's/.*(\(.*\)).*/\1/' <<<"$srcfromshow" )
      pkgsrc="$srcname=$srcver"
    else
      srcname=$( apt-cache showsrc $name | awk '/^Package:/{print $2}' | head -1 )
      if [ "${version##*:*}" ] ; then
        epoch=$( apt-cache showsrc $srcname | grep '^Version: ' | head -1 | \
          sed -n 's/^Version: \([0-9]\+:\).*/\1/p')
      else
        epoch=""
      fi
      srcver=${version%+b[0-9]}  # remove binary upload information
      pkgsrc="$srcname=$epoch$srcver"
      exceptpkgsrc=`getexception $pkgsrc`
      pkgsrc=${exceptpkgsrc:-$pkgsrc}
    fi

    echo "Checking $pkgsrc for package $name $version..."

    dscfile="$( echo "$pkgsrc" | sed 's/=\([0-9]:\)\?/_/' ).dsc"
    if [ -f "$dscfile" ] ; then
      md5sum -c \
        <(sed -n 's/ \([0-9a-z]\{32\}\) [0-9]\+ \(.\+\)/\1  \2/p' $dscfile) || \
        echo >&2 "FAILED: Bad sources for $name $version.  Remove files and restart download."
    else
      apt-get source --download-only $pkgsrc || \
        echo >&2 "FAILED: could not fetch $pkgsrc source for $name $version."
    fi
  )
  [ $? -eq 23 ] && exit 1
done
