https://github.com/JuliaLang/julia
Raw File
Tip revision: d299e0ce350cc9c6e960f222aca19a2596d51d96 authored by Prem Chintalapudi on 06 July 2023, 19:55:25 UTC
Hoist pointer_from_objref unconditionally
Tip revision: d299e0c
jlchecksum
#!/bin/sh
#
# usage: jlchecksum <filename>
#

if [ -z "$1" ]; then
    echo "Usage: ./jlchecksum <filename>" >&2
    exit 1
fi

set -eu

# Get the deps directory, one level up from this script
DEPSDIR="$( cd "$( dirname "$0" )"/.. && pwd )"

# Get the basename of the file we're trying to checksum
ARG1=$1
BASENAME=$(basename $1)

# Print out a hash, and wrap around if we're longer than 64 characters
print_hash()
{
    if [ ${#1} -gt 64 ]; then
        NUM_LINES=$(( (${#1} + 63) / 64))
        for i in `seq 0 1 $((NUM_LINES - 1))`; do
            str_piece=$(echo "$1" | awk "{ string=substr(\$0, $((i*64 + 1)), 64); print string; }")
            echo "      $str_piece"
        done
    else
        echo "      $1" >&2
    fi
}

abspath()
{
    echo $(cd $(dirname "$1"); pwd)/$BASENAME;
}

checksum_error()
{
    ARG1=$(realpath "$ARG1" 2>/dev/null || echo $(abspath "$ARG1"))
    echo "===============================================================================" >&2
    echo "  ERROR: $CHECKSUM_TYPE checksum failure on $BASENAME, should be:" >&2
    print_hash "$TRUE_CHECKSUM"
    echo "  But \`$CHECKSUM_PROG\` results in:" >&2
    print_hash "$CURR_CHECKSUM"
    echo "  This can happen due to bad downloads or network proxies, please check your" >&2
    echo "  network proxy/firewall settings and delete" >&2
    echo "  $ARG1" >&2
    echo "  to force a redownload when you are ready" >&2
    echo "===============================================================================" >&2
    exit 2
}

find_checksum()
{
    for pack in "$DEPSDIR"/checksums/*; do
        if [ -f "$pack" ]; then
            TRUE_CHECKSUM=$(awk -F / "{ if (\$1 == \"$BASENAME\" && \$2 == \"$CHECKSUM_TYPE\") print \$3 }" "$pack")
            if [ $TRUE_CHECKSUM ]; then
                return
            fi
        fi
    done
    if [ ! -f "$DEPSDIR/checksums/$BASENAME/$CHECKSUM_TYPE" ]; then
        if [ ${TAGGED_RELEASE_BANNER:-} ]; then
            echo "WARNING: $CHECKSUM_TYPE checksum for $BASENAME not found in deps/checksums/, failing release build." >&2
            exit 3
        fi
        echo "WARNING: $CHECKSUM_TYPE checksum for $BASENAME not found in deps/checksums/, autogenerating..." >&2

        # Generate as many checksum types as we can
        mkdir -p "$DEPSDIR/checksums/$BASENAME"
        if [ ! -z "$MD5_PROG" ]; then
            echo $(eval $MD5_PROG) > "$DEPSDIR/checksums/$BASENAME/md5"
        fi
        if [ ! -z "$SHA512_PROG" ]; then
            echo $(eval $SHA512_PROG) > "$DEPSDIR/checksums/$BASENAME/sha512"
        fi
    fi

    TRUE_CHECKSUM=$(cat "$DEPSDIR/checksums/$BASENAME/$CHECKSUM_TYPE")
}

# These are the programs we run to hash a file
SHA512_PROG=""
MD5_PROG=""
find_checksum_progs()
{
    if [ ! -z $(which sha512sum) ]; then
        SHA512_PROG="sha512sum $ARG1 | awk '{ print \$1; }'"
    elif [ ! -z $(which shasum) ]; then
        SHA512_PROG="shasum -a 512 $ARG1 | awk '{ print \$1; }'"
    fi

    if [ ! -z $(which md5sum) ]; then
        MD5_PROG="md5sum $ARG1 | awk '{ print \$1; }'"
    elif [ ! -z $(which md5) ]; then
        MD5_PROG="md5 -q $ARG1"
    fi
}


# Search for checksum programs and store them into SHA512_PROG, MD5_PROG, etc...
find_checksum_progs

# Choose final checksumming program, preferring SHA512 over MD5
if [ ! -z "$SHA512_PROG" ]; then
    CHECKSUM_TYPE="sha512"
    CHECKSUM_PROG=$SHA512_PROG
elif [ ! -z "$MD5_PROG" ]; then
    CHECKSUM_TYPE="md5"
    CHECKSUM_PROG=$MD5_PROG
else
    echo "WARNING: No checksumming programs found, cannot verify downloads" >&2
    exit 0
fi

# Find true checksum
find_checksum "$CHECKSUM_TYPE"

# Calculate actual checksum
CURR_CHECKSUM=$(eval $CHECKSUM_PROG)

# Make sure they're the same.  If not, error out!
if [ "$TRUE_CHECKSUM" != "$CURR_CHECKSUM" ]; then
    checksum_error
fi
back to top