update hackage.sh, fixed bugs mentioned in #1 and tuna/tunasync#11

This commit is contained in:
Justin Wong 2016-05-03 21:38:24 +08:00
parent 5975d7c5d5
commit 2092a9607a

View File

@ -1,5 +1,7 @@
#!/bin/bash #!/bin/bash
# requires: wget, axel
set -e set -e
set -o pipefail
function remove_broken() { function remove_broken() {
interval=$1 interval=$1
@ -8,16 +10,19 @@ function remove_broken() {
if [[ -f ${interval_file} ]]; then if [[ -f ${interval_file} ]]; then
lastcheck=`cat ${interval_file}` lastcheck=`cat ${interval_file}`
between=$(echo "${now}-${lastcheck}" | bc) ((between = now - lastcheck))
[[ $between -lt $interval ]] && echo "skip checking"; return 0 if ((between < interval)); then
echo "skip checking"
return 0
fi
fi fi
echo "start checking" echo "start checking"
mkdir -p "${TUNASYNC_WORKING_DIR}/package" mkdir -p "${TUNASYNC_WORKING_DIR}/package"
cd "${TUNASYNC_WORKING_DIR}/package" cd "${TUNASYNC_WORKING_DIR}/package"
ls | while read line; do for line in *; do
echo -n "$line\t\t" printf '%s\t\t' "$line"
tar -tzf $line >/dev/null || (echo "FAIL"; rm $line) && echo "OK" tar -tzf $line >/dev/null || (echo "FAIL"; rm $line) && echo "OK"
done done
@ -29,28 +34,33 @@ function must_download() {
dst=$2 dst=$2
while true; do while true; do
echo "downloading: $name" echo "downloading: $name"
wget "$src" -O "$dst" &>/dev/null || true wget "$src" -O "$dst" &>/dev/null
tar -tzf package/$name >/dev/null || rm package/$name && break tar -tzf package/$name >/dev/null || rm package/$name && break
done done
return 0
} }
function hackage_mirror() { function hackage_mirror() {
local_pklist="/tmp/hackage_local_pklist_$$.list" local_pklist="/tmp/hackage_local_pklist_$$.list"
remote_pklist="/tmp/hackage_remote_pklist_$$.list" remote_pklist="/tmp/hackage_remote_pklist_$$.list"
base_url="https://hackage.haskell.org"
cd ${TUNASYNC_WORKING_DIR} cd ${TUNASYNC_WORKING_DIR}
mkdir -p package mkdir -p package
echo "Downloading index..." echo "Downloading index..."
rm index.tar.gz || true rm index.tar.gz || true
axel http://hdiff.luite.com/packages/archive/index.tar.gz -o index.tar.gz > /dev/null axel "${base_url}/packages/index.tar.gz" -o index.tar.gz > /dev/null
echo "building local package list" echo "building local package list"
ls package | sed "s/\.tar\.gz$//" > $local_pklist local tmp
tmp=(package/*)
tmp=(${tmp[@]#package/})
printf '%s\n' "${tmp[@]%.tar.gz}" > "${local_pklist}"
echo "preferred-versions" >> $local_pklist # ignore preferred-versions echo "preferred-versions" >> $local_pklist # ignore preferred-versions
echo "building remote package list" echo "building remote package list"
tar ztf index.tar.gz | (cut -d/ -f 1,2 2>/dev/null) | sed 's|/|-|' > $remote_pklist tar -ztf index.tar.gz | (cut -d/ -f 1,2 2>/dev/null) | sed 's|/|-|' > $remote_pklist
echo "building download list" echo "building download list"
# substract local list from remote list # substract local list from remote list
@ -64,7 +74,7 @@ function hackage_mirror() {
name="$pk.tar.gz" name="$pk.tar.gz"
if [ ! -a package/$name ]; then if [ ! -a package/$name ]; then
must_download "http://hackage.haskell.org/package/$pk/$name" "package/$name" & must_download "${base_url}/package/$pk/$name" "package/$name" &
else else
echo "skip existed: $name" echo "skip existed: $name"
fi fi
@ -72,7 +82,10 @@ function hackage_mirror() {
# delete redundanty files # delete redundanty files
comm <(sort $remote_pklist) <(sort $local_pklist) -13 | while read pk; do comm <(sort $remote_pklist) <(sort $local_pklist) -13 | while read pk; do
name="$pk.tar.gz" if [[ $pk == "preferred-versions" ]]; then
continue
fi
name="${pk}.tar.gz"
echo "deleting ${name}" echo "deleting ${name}"
rm "package/$name" rm "package/$name"
done done