hackage.sh 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #!/bin/bash
  2. set -e
  3. function remove_broken() {
  4. interval=$1
  5. interval_file="/tmp/hackage_lastcheck"
  6. now=`date +%s`
  7. if [[ -f ${interval_file} ]]; then
  8. lastcheck=`cat ${interval_file}`
  9. between=$(echo "${now}-${lastcheck}" | bc)
  10. [[ $between -lt $interval ]] && echo "skip checking"; return 0
  11. fi
  12. echo "start checking"
  13. mkdir -p "${TUNASYNC_WORKING_DIR}/package"
  14. cd "${TUNASYNC_WORKING_DIR}/package"
  15. ls | while read line; do
  16. echo -n "$line\t\t"
  17. tar -tzf $line >/dev/null || (echo "FAIL"; rm $line) && echo "OK"
  18. done
  19. echo `date +%s` > $interval_file
  20. }
  21. function must_download() {
  22. src=$1
  23. dst=$2
  24. while true; do
  25. echo "downloading: $name"
  26. wget "$src" -O "$dst" &>/dev/null || true
  27. tar -tzf package/$name >/dev/null || rm package/$name && break
  28. done
  29. }
  30. function hackage_mirror() {
  31. local_pklist="/tmp/hackage_local_pklist_$$.list"
  32. remote_pklist="/tmp/hackage_remote_pklist_$$.list"
  33. cd ${TUNASYNC_WORKING_DIR}
  34. mkdir -p package
  35. echo "Downloading index..."
  36. rm index.tar.gz || true
  37. axel http://hdiff.luite.com/packages/archive/index.tar.gz -o index.tar.gz > /dev/null
  38. echo "building local package list"
  39. ls package | sed "s/\.tar\.gz$//" > $local_pklist
  40. echo "preferred-versions" >> $local_pklist # ignore preferred-versions
  41. echo "building remote package list"
  42. tar ztf index.tar.gz | (cut -d/ -f 1,2 2>/dev/null) | sed 's|/|-|' > $remote_pklist
  43. echo "building download list"
  44. # substract local list from remote list
  45. comm <(sort $remote_pklist) <(sort $local_pklist) -23 | while read pk; do
  46. # limit concurrent level
  47. bgcount=`jobs | wc -l`
  48. while [[ $bgcount -ge 5 ]]; do
  49. sleep 0.5
  50. bgcount=`jobs | wc -l`
  51. done
  52. name="$pk.tar.gz"
  53. if [ ! -a package/$name ]; then
  54. must_download "http://hackage.haskell.org/package/$pk/$name" "package/$name" &
  55. else
  56. echo "skip existed: $name"
  57. fi
  58. done
  59. # delete redundanty files
  60. comm <(sort $remote_pklist) <(sort $local_pklist) -13 | while read pk; do
  61. name="$pk.tar.gz"
  62. echo "deleting ${name}"
  63. rm "package/$name"
  64. done
  65. cp index.tar.gz 00-index.tar.gz
  66. }
  67. function cleanup () {
  68. echo "cleaning up"
  69. [[ ! -z $local_pklist ]] && (rm $local_pklist $remote_pklist ; true)
  70. }
  71. trap cleanup EXIT
  72. remove_broken 86400
  73. hackage_mirror
  74. # vim: ts=4 sts=4 sw=4