12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- #!/bin/bash
- set -e
- function remove_broken() {
- interval=$1
- interval_file="/tmp/hackage_lastcheck"
- now=`date +%s`
- if [[ -f ${interval_file} ]]; then
- lastcheck=`cat ${interval_file}`
- between=$(echo "${now}-${lastcheck}" | bc)
- [[ $between -lt $interval ]] && echo "skip checking"; return 0
- fi
- echo "start checking"
- mkdir -p "${TUNASYNC_WORKING_DIR}/package"
- cd "${TUNASYNC_WORKING_DIR}/package"
- ls | while read line; do
- echo -n "$line\t\t"
- tar -tzf $line >/dev/null || (echo "FAIL"; rm $line) && echo "OK"
- done
-
- echo `date +%s` > $interval_file
- }
- function must_download() {
- src=$1
- dst=$2
- while true; do
- echo "downloading: $name"
- wget "$src" -O "$dst" &>/dev/null || true
- tar -tzf package/$name >/dev/null || rm package/$name && break
- done
- }
- function hackage_mirror() {
- local_pklist="/tmp/hackage_local_pklist_$$.list"
- remote_pklist="/tmp/hackage_remote_pklist_$$.list"
-
- cd ${TUNASYNC_WORKING_DIR}
- mkdir -p package
- echo "Downloading index..."
- rm index.tar.gz || true
- axel http://hdiff.luite.com/packages/archive/index.tar.gz -o index.tar.gz > /dev/null
-
- echo "building local package list"
- ls package | sed "s/\.tar\.gz$//" > $local_pklist
- echo "preferred-versions" >> $local_pklist # ignore preferred-versions
-
- echo "building remote package list"
- tar ztf index.tar.gz | (cut -d/ -f 1,2 2>/dev/null) | sed 's|/|-|' > $remote_pklist
-
- echo "building download list"
- # substract local list from remote list
- comm <(sort $remote_pklist) <(sort $local_pklist) -3 | while read pk; do
- # limit concurrent level
- bgcount=`jobs | wc -l`
- while [[ $bgcount -ge 5 ]]; do
- sleep 0.5
- bgcount=`jobs | wc -l`
- done
-
- name="$pk.tar.gz"
- if [[ ! -a package/$name ]]; then
- must_download "http://hackage.haskell.org/package/$pk/$name" "package/$name" &
- else
- echo "skip existed: $name"
- fi
- done
- cp index.tar.gz 00-index.tar.gz
- }
- function cleanup () {
- echo "cleaning up"
- [[ ! -z $local_pklist ]] && (rm $local_pklist $remote_pklist ; true)
- }
- trap cleanup EXIT
- remove_broken 86400
- hackage_mirror
- # vim: ts=4 sts=4 sw=4
|