Fix order of PrelRule
[ghc.git] / mk / get-win32-tarballs.sh
index a481062..7f3b544 100755 (executable)
@@ -11,15 +11,21 @@ fail() {
 
 download_file() {
     local file_url="$1"
-    local file_md5="$2"
-    local dest_file="$3"
-    local description="$4"
-    local extra_curl_opts="$5"
+    local dest_file="$2"
+    local description="$3"
+    local extra_curl_opts="$4"
+    local backup_url="$5"
     local dest_dir="$(dirname $dest_file)"
 
     if ! test -f "${dest_file}"
     then
         local curl_cmd="curl -L ${file_url} -o ${dest_file} --create-dirs -# ${extra_curl_opts}"
+        if test -n "${backup_url}"; then
+            local curl_cmd_bnk="curl -L ${backup_url} -o ${dest_file} --create-dirs -# ${extra_curl_opts}"
+        else
+            local curl_cmd_bnk="echo 1"
+        fi
+
         if test "$download" = "0"
         then
             echo "ERROR: Missing ${description}" >&2
@@ -28,17 +34,18 @@ download_file() {
             return
         else
             echo "Downloading ${description} to ${dest_dir}..."
-            $curl_cmd || {
+            $curl_cmd || $curl_cmd_bnk || {
                 rm -f "${dest_file}"
                 fail "ERROR: Download failed."
             }
         fi
     fi
 
-    if test "$sigs" = "1"
+    local sig_file="${dest_file}.sig"
+    if test "$sigs" = "1" -a ! -f "$sig_file"
     then
         echo "Downloading ${description} (signature) to ${dest_dir}..."
-        local curl_cmd="curl -L ${file_url}.sig -o ${dest_file}.sig --create-dirs -# ${extra_curl_opts}"
+        local curl_cmd="curl -L ${file_url}.sig -o ${sig_file} --create-dirs -# ${extra_curl_opts}"
         $curl_cmd || {
                 rm -f "${dest_file}.sig"
                 fail "ERROR: Download failed."
@@ -47,37 +54,30 @@ download_file() {
 
     if test "$verify" = "1"
     then
-        echo "${file_md5} *${dest_file}" | md5sum --quiet -c - ||
+        grep "${dest_file}$" mk/win32-tarballs.md5sum | md5sum --quiet -c - ||
             fail "ERROR: ${description} appears to be corrupted, please delete it and try again."
     fi
 }
 
 download_mingw() {
+    local mingw_base_url_primary="https://downloads.haskell.org/~ghc/mingw"
+    local mingw_base_url_secondary="http://repo.msys2.org/mingw"
+
     if test "$mingw_arch" = "sources"
     then
-        local mingw_url=`echo "$1" | sed -e 's/-any\.pkg\.tar\.xz/\.src\.tar\.gz/' \
-                                         -e 's/-sources-/-/' \
-                                         -e 's/-libwinpthread-git-/-winpthreads-git-/' `
+        mingw_url_tmp=`echo "$1" | sed -e 's/-any\.pkg\.tar\.xz/\.src\.tar\.gz/' \
+                                       -e 's/-sources-/-/' \
+                                       -e 's/-libwinpthread-git-/-winpthreads-git-/' `
+        local mingw_url="${mingw_base_url_primary}/${mingw_url_tmp}"
     else
-        local mingw_url="$1"
-    fi
-    local file_md5sum_x86="$2"
-    local file_md5sum_x64="$3"
-
-    if ! test "$mingw_arch" = "sources"
-    then
-        if test "$mingw_arch" = "i686"
-        then
-            local file_md5sum="${file_md5sum_x86}"
-        else
-            local file_md5sum="${file_md5sum_x64}"
-        fi
+        local mingw_url="${mingw_base_url_primary}/$1"
+        local mingw_url_backup="${mingw_base_url_secondary}/$1"
     fi
 
     local mingw_toolchain="$(basename $mingw_url)"
     local mingw_w64="${tarball_dir}/${tarball_dest_dir}/${mingw_toolchain}"
 
-    download_file "${mingw_url}" "${file_md5sum}" "${mingw_w64}" "${mingw_toolchain}"
+    download_file "${mingw_url}" "${mingw_w64}" "${mingw_toolchain}" "" "${mingw_url_backup}"
 
     # Mark the tree as needing updates by deleting the folder
     if test -d inplace/mingw && test inplace/mingw -ot "$mingw_w64" ; then
@@ -87,25 +87,32 @@ download_mingw() {
 }
 
 download_tarballs() {
-    local mingw_base_url="http://repo.msys2.org/mingw"
     local package_prefix="mingw-w64"
-    local format_url="${mingw_base_url}/${mingw_arch}/${package_prefix}-${mingw_arch}"
-
-    download_mingw "${format_url}-crt-git-5.0.0.4795.e3d96cb1-1-any.pkg.tar.xz"          "534bb4756482f3271308576cdadfe5dc" "3780a25a6f20eef9b143f47f4b615e39"
-    download_mingw "${format_url}-winpthreads-git-5.0.0.4741.2c8939a-1-any.pkg.tar.xz"   "155845f8c897f0c70adee83cfa9ec30c" "ba417ad9fb7cd3ee56e713b2b070adb9"
-    download_mingw "${format_url}-headers-git-5.0.0.4747.0f8f626-1-any.pkg.tar.xz"       "b724d1aaae73c329022ad22374481817" "e8065928b81c9b379286515913eccd68"
-    download_mingw "${format_url}-libwinpthread-git-5.0.0.4741.2c8939a-1-any.pkg.tar.xz" "65b18b67eef3c3d5e5707577dfa8f831" "c280f60a4b80ed6722ce4d9b4f6c550e"
-    download_mingw "${format_url}-zlib-1.2.8-9-any.pkg.tar.xz"                           "87c65e9b2930436a75dfd7d459ae98cb" "60c3a388478f411b7a0908441ebeb537"
-    download_mingw "${format_url}-isl-0.17.1-1-any.pkg.tar.xz"                           "9fce16db004f00e967eb15efe0cdf86b" "39c8b3b8e56b3b0bdef86cf32f1e09ba"
-    download_mingw "${format_url}-mpc-1.0.3-2-any.pkg.tar.xz"                            "719e76fa7a54a8676d2e60af3bb13c45" "df1a7d4050568d83c265ae78c32ef30b"
-    download_mingw "${format_url}-mpfr-3.1.4.p3-4-any.pkg.tar.xz"                        "6fdad8f6a522c779932ca4e54e4d7977" "de629f78e908274086a272196c14d37c"
-    download_mingw "${format_url}-gmp-6.1.1-1-any.pkg.tar.xz"                            "e8cc05fc566ddc6c16266da9aec2ddd3" "0faa10641da9266ef4cb39a8f6a4fa19"
-    download_mingw "${format_url}-gcc-libs-6.2.0-2-any.pkg.tar.xz"                       "e6f74da9dcb856cfe9e1da0ed45732e0" "f523d52a6ad940e1cda2bf3065927bd4"
-    download_mingw "${format_url}-binutils-2.27-2-any.pkg.tar.xz"                        "d263d1362dee0c24df80b461eb2ec489" "b1f21340136b75f1660d6ad36bd0768a"
-    download_mingw "${format_url}-libidn-1.32-3-any.pkg.tar.xz"                          "9ecd264a3da0f0f6af8b392c1b183a7b" "6f68259e17b68bbf19efc7b4fb5c1968"
-    download_mingw "${format_url}-gcc-6.2.0-2-any.pkg.tar.xz"                            "095dc33fb7a1cab5dab982aa57713a96" "303bf95f8e6ac5bc068b2ab95749b8f3"
-
-    download_file "https://github.com/ghc/ghc-tarballs/blob/master/perl/ghc-perl-1.tar.gz?raw=true" "b21d1681b61cf7a024e854096285b02e" "ghc-tarballs/perl/ghc-perl-1.tar.gz" "Windows Perl binary distributions" "--insecure"
+    local format_url="/${mingw_arch}/${package_prefix}-${mingw_arch}"
+
+    download_mingw "${format_url}-crt-git-5.0.0.4795.e3d96cb1-1-any.pkg.tar.xz"
+    download_mingw "${format_url}-winpthreads-git-5.0.0.4761.02bea78-1-any.pkg.tar.xz"
+    download_mingw "${format_url}-headers-git-5.0.0.4797.31e66d7e-1-any.pkg.tar.xz"
+    download_mingw "${format_url}-libwinpthread-git-5.0.0.4761.02bea78-1-any.pkg.tar.xz"
+    download_mingw "${format_url}-zlib-1.2.11-1-any.pkg.tar.xz"
+    download_mingw "${format_url}-isl-0.17.1-1-any.pkg.tar.xz"
+    download_mingw "${format_url}-mpfr-3.1.5.p1-1-any.pkg.tar.xz"
+    download_mingw "${format_url}-gmp-6.1.2-1-any.pkg.tar.xz"
+    download_mingw "${format_url}-binutils-2.28-1-any.pkg.tar.xz"
+    download_mingw "${format_url}-libidn-1.33-1-any.pkg.tar.xz"
+    download_mingw "${format_url}-gcc-6.3.0-2-any.pkg.tar.xz"
+
+    # Upstream is unfortunately quite inconsistent in naming
+    if test "$mingw_arch" != "sources"; then
+        download_mingw "${format_url}-mpc-1.0.3-2-any.pkg.tar.xz"
+        download_mingw "${format_url}-gcc-libs-6.3.0-2-any.pkg.tar.xz"
+    else
+        local format_url="${mingw_base_url}/${mingw_arch}/${package_prefix}"
+        download_mingw "${format_url}-i686-mpc-1.0.3-2.src.tar.gz"
+        download_mingw "${format_url}-x86_64-mpc-1.0.3-2.src.tar.gz"
+    fi
+
+    download_file "https://downloads.haskell.org/~ghc/mingw/ghc-perl-1.tar.gz" "ghc-tarballs/perl/ghc-perl-1.tar.gz" "Windows Perl binary distributions"
 
     if ! test "$missing_files" = "0"
     then
@@ -131,15 +138,42 @@ download_sources() {
     download_tarballs
 }
 
+sync_binaries_and_sources() {
+    gpg --recv-key  5F92EFC1A47D45A1
+
+    # ensure sources are downloaded
+    sigs=1
+    download_i386
+    download_x86_64
+    verify=0
+    download_sources
+
+    for f in $(find ghc-tarballs/mingw-w64 -iname '*.sig'); do
+        echo "Verifying $f"
+        gpg --verify $f
+    done
+
+    md5sum `find ghc-tarballs -type f -a -not -iname '*.sig'` >| mk/win32-tarballs.md5sum
+    chmod -R ugo+rX ghc-tarballs
+
+    rsync -av ghc-tarballs/mingw-w64/* downloads.haskell.org:public_html/mingw
+    for f in $(find ghc-tarballs/mingw-w64); do
+        curl -XPURGE http://downloads.haskell.org/~ghc/mingw/$f
+    done
+}
+
 usage() {
     echo "$0 - Download GHC mingw toolchain tarballs"
     echo
-    echo "Usage: $0 <action> <arch>"
+    echo "Usage: $0 <action> [<arch>]"
     echo
     echo "Where <action> is one of,"
+    echo ""
     echo "    download     download the necessary tarballs for the given architecture"
-    echo "    fetch        download the necessary tarballs for the given architecture but doesn't verify their md5."d
+    echo "    fetch        download the necessary tarballs for the given architecture but doesn't verify their md5."
     echo "    verify       verify the existence and correctness of the necessary tarballs"
+    echo "    sync         upload packages downloaded with 'fetch mirror' to haskell.org"
+    echo ""
     echo "and <arch> is one of i386, x86_64,all or mirror (which includes sources)"
 }
 
@@ -157,6 +191,11 @@ case $1 in
         download=0
         verify=1
         ;;
+    sync)
+        download=1
+        verify=0
+        sync=1
+        ;;
     *)
         usage
         exit 1
@@ -182,7 +221,11 @@ case $2 in
         download_sources
         ;;
     *)
-        usage
-        exit 1
+        if test "$sync" = "1"; then
+            sync_binaries_and_sources
+        else
+            usage
+            exit 1
+        fi
         ;;
 esac