#!/bin/bash

ROOT=/srv/chroot

if [ "$1" = "setup" ];then
  SETUP=yes
  shift
  echo "I: Will bootstrap chroots."
fi

if [ "$#" = 0 ];then
  arches=`dpkg --print-installation-architecture`
else
  arches="$@"
fi
echo "I: Running for arches: $arches"

set -e 

function log () {
  case $TERM in
   *term*|rxvt*|screen*)
    echo -en "\033]0;archive-setup@$HOSTNAME: $*\007"
    ;;
   *)
    ;;
  esac
  echo "I: $*"
}

generate_alias() {
  arch="$1"
  dist_in="$2"
  dist_out="$3"
  mirror="$4"
  sources="$5"

  base="$ROOT/base/$arch/$dist_in"
  base_buildd="$ROOT/base/buildd/$arch/$dist_in"
  if [ ! -L $base ];then
    ln -sf "$dist_out" $base
  fi

  multibuild-chroot build-base-type $ROOT $dist_out $arch buildd
  mkdir -p $base_buildd/root/etc/apt/

  cat > $base_buildd/root/etc/apt/sources.list <<EOF
deb $mirror $dist_in $sources
deb-src $mirror $dist_in $sources
EOF
}

generate_alias_security() {
  arch="$1"
  dist_in="$2"
  dist_out="$3"
  mirror="$4"
  sources="$5"

  generate_alias $@

  base_buildd="$ROOT/base/buildd/$arch/$dist_in"
  cat > $base_buildd/root/etc/apt/sources.list <<EOF
deb $mirror $dist_in $sources
deb http://security.debian.org/ ${dist_in}/updates $sources
deb-src http://security.debian.org/ ${dist_in}/updates $sources
EOF
}

multibuild-chroot build-base-type-buildd $ROOT

for arch in $arches;do
  if [ "$arch" = "all" ];then
	  [ -L $ROOT/base/all ]||ln -s `dpkg --print-installation-architecture` $ROOT/base/all
	  continue
  fi
  for dist in debian-sid debian-lenny debian-etch debian-sarge ubuntu-gutsy ubuntu-feisty ubuntu-edgy ubuntu-dapper;do
    log "Creating $arch/$dist..."
    distname=`echo $dist|cut -d- -f2`
    case $dist in
  	  debian-*)
	  if [ "$dist" = "debian-sarge" -a "$arch" = "amd64" ];then
	    mirror="http://ftp.de.debian.org/debian-amd64/debian"
	  else
  	    mirror="http://ftp.de.debian.org/debian"
	  fi
  	  upstream="debian"
  	  sources="main contrib"
  	  ;;
  	  ubuntu-*)
  	  mirror="http://de.archive.ubuntu.com/ubuntu"
  	  upstream="ubuntu"
  	  sources="main universe"
  	  ;;
    esac
    if [ "$upstream" = "ubuntu" ];then
      case $arch in
        i386|amd64|powerpc|sparc|all)
        ;;
        *)
        break
        ;;
      esac
    fi

    base="$ROOT/base/$arch/$dist"
    base_buildd="$ROOT/base/buildd/$arch/$dist"

    if [ "$SETUP" ]; then
      if [ "$upstream" = "ubuntu" ]; then
        multibuild-chroot build-base-dist $ROOT $dist $arch $distname $mirror --include=ubuntu-keyring
        sed -i -e 's#main$#main universe#' $base/root/etc/apt/sources.list
        cat >> $base/root/etc/apt/sources.list <<EOF
deb $mirror ${distname}-updates $sources
deb $mirror ${distname}-security $sources
EOF
      else
        multibuild-chroot build-base-dist $ROOT $dist $arch $distname $mirror
        case $distname in
          sarge|etch|lenny)
          cat >> $base/root/etc/apt/sources.list <<EOF
deb http://security.debian.org/ ${distname}/updates $sources
EOF
          ;;
        esac
      fi

      cat > $base/root/etc/apt/apt.conf <<EOF
APT::Cache-Limit "41943040";
Acquire::PDiffs "false";
EOF
      if [ ! -z "$http_proxy" ];then
        cat >> $base/root/etc/apt/apt.conf <<EOF
Acquire::http::Proxy "'$http_proxy'";
EOF
      fi
    fi

    multibuild-chroot build-base-type $ROOT ${dist} $arch buildd

    cat > $base_buildd/root/etc/apt/sources.list <<EOF
deb $mirror ${distname} $sources
EOF
    case $distname in
      sarge|etch|lenny)
      cat >> $base_buildd/root/etc/apt/sources.list <<EOF
deb http://security.debian.org/ ${distname}/updates $sources
EOF
      ;;
    esac

    log "Updating apt cache."
    chroot $base/root apt-get -qq update
    chroot $base/root apt-get clean

    for project in voip-snapshots pkg-voip pkg-gnome pkg-kde-extra;do 
      for flavour in "" "-experimental";do
        log "Adding project $arch/${project}-${dist}${flavour}..."
        base="$ROOT/base/$arch/${project}-${dist}${flavour}"
        base_buildd="$ROOT/base/buildd/$arch/${project}-${dist}${flavour}"
        if [ ! -L $base ];then
      	  ln -sf $dist $base
        fi
        multibuild-chroot build-base-type $ROOT ${project}-${dist}${flavour} $arch buildd

        cat > $base_buildd/root/etc/apt/sources.list <<EOF
deb http://archive.buildserver.net/$project/build/$upstream ${distname}${flavour} main
deb-src http://archive.buildserver.net/$project/build/$upstream ${distname}${flavour} main
deb $mirror ${distname} $sources
EOF

        if [ "$flavour" = "-experimental" ];then
          cat >> $base_buildd/root/etc/apt/sources.list <<EOF
deb http://archive.buildserver.net/$project/build/$upstream ${distname} main
EOF
          [ "$upstream" = "debian" ]&&cat >> $base_buildd/root/etc/apt/sources.list <<EOF
deb $mirror experimental $sources
EOF
        fi

        if [ "$upstream" = "ubuntu" ];then
          cat >> $base_buildd/root/etc/apt/sources.list <<EOF
deb $mirror ${distname}-updates $sources
deb $mirror ${distname}-security $sources
EOF
        fi
        log "Adding archive key for archive.buildserver.net to ${project}-${dist}${flavour}."
        wget -qO $base_buildd/key http://archive.buildserver.net/archive.buildserver.net_key.asc
      done
    done
  done

  for data in \
          oldstable:debian-sarge \
          sarge:debian-sarge \
          stable:debian-etch \
          etch:debian-etch \
          testing:debian-lenny \
          lenny:debian-lenny \
          unstable:debian-sid \
          sid:debian-sid; do
    if [ "$dist_out" = "debian-sarge" -a "$arch" = "amd64" ];then
      mirror="http://ftp.de.debian.org/debian-amd64/debian"
    else
      mirror="http://ftp.de.debian.org/debian"
    fi
    sources="main contrib"
    dist_in=${data%:*}
    dist_out=${data#*:}

    log "Creating $arch/$dist_in..."
    generate_alias $arch $dist_in $dist_out $mirror $sources
    if [ $dist_out != debian-sid ];then
      log "Creating $arch/${dist_in}-security..."
      generate_alias_security $arch ${dist_in}-security $dist_out $mirror $sources
    fi
  done

  log "Creating $arch/debian-scud..."
  base="$ROOT/base/$arch/debian-scud"
  base_buildd="$ROOT/base/buildd/$arch/debian-scud"

  if [ ! -L $base ];then
    ln -sf debian-sid $base
  fi

  multibuild-chroot build-base-type $ROOT debian-scud $arch buildd

  cat > $base_buildd/root/etc/apt/sources.list <<EOF
deb $mirror sid $sources
deb $mirror experimental $sources
EOF
  base="$ROOT/base/$arch/experimental"
  if [ ! -L $base ];then
    ln -sf debian-scud $base
  fi
done

# vim: sw=2 expandtab
