mirror of
https://github.com/tuna/tunasync.git
synced 2025-06-14 13:32:43 +00:00
update hackage.sh
This commit is contained in:
parent
fb1ef8683a
commit
1c2d8a9d3e
@ -1,38 +1,85 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
function remove_broken() {
|
||||
working_dir=$1
|
||||
cd $working_dir
|
||||
mkdir -p package
|
||||
filelist="/tmp/hackage_filelist_$$.txt"
|
||||
brokenlist="/tmp/hackage_brokenlist_$$.txt"
|
||||
ls > ${filelist}
|
||||
touch $brokenlist
|
||||
while read line; do echo $line ; tar -tzf $line >/dev/null || echo $line >>$brokenlist; done <$filelist
|
||||
cat $brokenlist | xargs rm
|
||||
interval=$1
|
||||
interval_file="/tmp/hackage_lastcheck"
|
||||
now=`date +%s`
|
||||
|
||||
rm $brokenlist
|
||||
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() {
|
||||
working_dir=$1
|
||||
cd $working_dir
|
||||
# echo "Cleaning up..."
|
||||
# rm 00-index.tar.gz
|
||||
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
|
||||
axel http://hdiff.luite.com/packages/archive/index.tar.gz -o index.tar.gz
|
||||
for splitpk in `tar ztf index.tar.gz | cut -d/ -f 1,2 2>/dev/null`; do
|
||||
pk=`echo $splitpk | sed 's|/|-|'`
|
||||
name=$pk.tar.gz
|
||||
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
|
||||
axel http://hackage.haskell.org/package/$pk/$name -o package/$name
|
||||
must_download "http://hackage.haskell.org/package/$pk/$name" "package/$name" &
|
||||
else
|
||||
echo "skip existed: $name"
|
||||
fi
|
||||
done
|
||||
rm package/preferred-versions.tar.gz
|
||||
|
||||
cp index.tar.gz 00-index.tar.gz
|
||||
}
|
||||
|
||||
remove_broken "${TUNASYNC_WORKING_DIR}/"
|
||||
hackage_mirror "${TUNASYNC_WORKING_DIR}/"
|
||||
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
|
||||
|
Loading…
x
Reference in New Issue
Block a user