mkdir -p $MIRROR

generate_distributions(){
    updates="default default-base default-udebs"
    if [ -n "$security_mirror" ]; then
        updates="$updates default-security"
    fi
    if [ -n "$debian_mirror_extra" ]; then
        updates="$updates default-extra"
    fi
    cat << EOF > $conf/distributions
Codename: $CODENAME
Architectures: $ARCHES
UDebComponents: main
Components: $mirror_components
Description: mirror for $CODENAME
Update: $updates
Suite: ${SUITE:-"stable"}
EOF
}

generate_updates(){
    cat << EOF > $conf/updates
Name: default
Suite: *
UDebComponents: none
Method: $debian_mirror
FilterList: deinstall package-list

Name: default-base
Suite: *
UDebComponents: none
Method: $debian_mirror
FilterFormula: priority (== required) | priority (== important) | priority (== standard)

Name: default-udebs
Suite: *
Components: none
Method: $debian_mirror

EOF

    if [ -n "$security_mirror" ]; then
        cat << EOF >> $conf/updates
Name: default-security
Suite: */updates
UDebComponents: none
Method: $security_mirror
FilterList: deinstall package-list

EOF
    fi
    if [ -n "$debian_mirror_extra" ]; then
        cat << EOF >> $conf/updates
Name: default-extra
Suite: *
UDebComponents: none
Components: $mirror_components_extra
Method: $debian_mirror_extra
FilterList: deinstall package-list

EOF
    fi
}

export REPREPRO_BASE_DIR=$MIRROR
mkdir -p $MIRROR/conf
conf=$MIRROR/conf

generate_distributions
generate_updates

touch $conf/package-list

test -z "$reprepro_opts" && reprepro_opts="-V"

# include local packages into the mirror
if [ -n "$local_packages" ]; then
    for p in $(find $local_packages -type f); do
        case $p in
            *.deb) 
                reprepro $reprepro_opts --ignore=wrongdistribution includedeb $CODENAME $p
                ;;
            *.udeb) 
                reprepro $reprepro_opts --ignore=wrongdistribution includeudeb $CODENAME $p
                ;;
            *)
                echo "unknown package type: $p"
                ;;
        esac
    done
fi

reprepro $reprepro_opts --noskipold update 

# attempt to resolve dependencies
test -z "$reprepro_retries" && reprepro_retries="20"
package_lists=""
for a in $ARCHES ; do
    for component in $mirror_components ; do
        package_lists="$package_lists $MIRROR/dists/$CODENAME/$component/binary-$a/Packages"
    done
done
for i in $(seq $reprepro_retries); do
    cp $conf/package-list $conf/package-list.old

    dependencies="$(awk -F Depends: '/Depends:/{print $2}' $package_lists | tr '|,' '\n' | awk '{print $1}' | sort -u)"

    for p in $dependencies $all_packages ; do
        echo $p install 
    done | sort -u > $conf/package-list

    if diff -q $conf/package-list $conf/package-list.old ; then
        echo "no new dependencies, finished in $i attempts."
        break
    else
        echo "getting missing dependencies... attempt $i"
        reprepro $reprepro_opts --nolistsdownload --noskipold update
    fi
done
