diff --git a/tools/checkrelease.sh b/tools/checkrelease.sh index 5677836bdc..99e328119f 100755 --- a/tools/checkrelease.sh +++ b/tools/checkrelease.sh @@ -19,114 +19,185 @@ # ############################################################################# -set -e +RETURN_CODE=0 BASE_URL="https://dist.apache.org/repos/dist/dev/incubator/nuttx" -TEMPDIR="dist.apache.org" -ORIGINAL_DIR="$(pwd)" -trap "{ cd $ORIGINAL_DIR; rm -rf $TEMPDIR; }" EXIT +TEMPDIR="/tmp/nuttx-checkrelease" + +function validate_url() { + if [[ `wget -S --spider $1 2>&1 | grep 'HTTP/1.1 200 OK'` ]]; then echo "true"; fi +} function download_release() { - wget -r -np -R "index.html*" -P . --cut-dirs 7 "$URL" - cd "$TEMPDIR" + rm -rf "$TEMPDIR" + mkdir "$TEMPDIR" + cd "$TEMPDIR" + + if [[ -n "$URL" ]]; then + if [[ $(validate_url "$URL") ]]; then + echo "Downloading release files from $URL" + wget -q -r -nd -np "$URL" + else + echo "The $URL given doesn't return HTTP 200 OK return code— exiting." + exit 1 + fi + else + cp -r "$DIRECTORY"/* . + fi } function check_sha512() { - # check release sha512 RELEASE_FILE=$1 echo "Checking $RELEASE_FILE sha512..." - sha512sum -c "$RELEASE_FILE.sha512" + output="$(sha512sum -c $RELEASE_FILE.sha512)" 2>&1 + return_value=$? + if [ $return_value -eq 0 ]; then + echo " OK: $RELEASE_FILE sha512 hash matches." + else + RETURN_CODE=1 + echo "$output" + echo " - $RELEASE_FILE sha512 hash does not match." + fi + echo } function check_gpg() { - # check nuttx sha512 and gpg RELEASE_FILE=$1 echo "Checking $RELEASE_FILE GPG signature:" - gpg --verify "$RELEASE_FILE.asc" "$RELEASE_FILE" + gpg --verify $RELEASE_FILE.asc $RELEASE_FILE + return_value=$? + if [ $return_value -eq 0 ]; then + echo " OK: $RELEASE_FILE gpg signature matches." + else + RETURN_CODE=1 + echo " - Error checking $RELEASE_FILE gpg signature." + fi echo } function check_required_files() { - # check nuttx for required files - RELEASE_FILE=$1 - RELEASE_DIR=$2 - rm -rf "$RELEASE_DIR" - tar xf "$RELEASE_FILE" - ERROR=0 + RELEASE_DIR=$1 + MISSING_FILE=0 + echo "Checking $RELEASE_FILE for required files:" if [ ! -f "$RELEASE_DIR/LICENSE" ]; then - echo "LICENSE file not present." - ERROR=1 + echo " - LICENSE file not present." + MISSING_FILE=1 fi if [ ! -f "$RELEASE_DIR/NOTICE" ]; then - echo "NOTICE file not present." - ERROR=1 + echo " - NOTICE file not present." + MISSING_FILE=1 fi if [ ! -f "$RELEASE_DIR/README.txt" ]; then - echo "README.txt file not present." - ERROR=1 + echo " - README.txt file not present." + MISSING_FILE=1 fi if [ ! -f "$RELEASE_DIR/DISCLAIMER-WIP" ]; then - echo "DISCLAIMER-WIP file not present." - ERROR=1 + echo " - DISCLAIMER-WIP file not present." + MISSING_FILE=1 fi - if [ 0 -eq $ERROR ]; then - echo "OK: All required files exist." + if [ 0 -eq $MISSING_FILE ]; then + echo " OK: all required files exist in $RELEASE_DIR." + else + RETURN_CODE=$MISSING_FILE fi + echo } function check_nuttx() { - # check nuttx sha512 and gpg RELEASE_FILE="$(ls *.tar.gz|head -1)" - check_sha512 "$RELEASE_FILE" + RELEASE_DIR="nuttx" + check_sha512 "$RELEASE_FILE" check_gpg "$RELEASE_FILE" - check_required_files "$RELEASE_FILE" "nuttx" - mv "$RELEASE_FILE" .. + tar xf "$RELEASE_FILE" + check_required_files "$RELEASE_DIR" } function check_nuttx_apps() { - # check nuttx-apps sha512 and gpg RELEASE_FILE="$(ls *.tar.gz|head -2| tail -1)" + RELEASE_DIR="apps" check_sha512 "$RELEASE_FILE" check_gpg "$RELEASE_FILE" - check_required_files "$RELEASE_FILE" "apps" - mv "$RELEASE_FILE" .. + tar xf "$RELEASE_FILE" + check_required_files "$RELEASE_DIR" +} + +function check_sim_nsh_build() { + RELEASE_DIR="nuttx" + echo "Trying to build $RELEASE_DIR sim:nsh..." + cd "$RELEASE_DIR" + output=$(make distclean; ./tools/configure.sh sim:nsh; make) 2>&1 + return_value=$? + if [ $return_value -eq 0 ]; then + echo " OK: we were able to build sim:nsh." + else + RETURN_CODE=1 + echo "$output" + echo " - Error building sim:nsh." + fi + echo } function usage() { - echo "Usage: $0 " - echo " Given release name or release full URL, downloads all files in" - echo " in that directory (which should include nuttx and nuttx-apps" - echo " sha512, asc, and tar.gz files), checks the release SHA512 and GPG " - echo " signatures, and checks the unpacked directories for required " - echo " files. Creates a temporary directory to do its work in." + echo "Usage: $0 [--url ] [--release ] [--tempdir ]" + echo " Given release full URL, release name, or a local directory, downloads or copies" + echo " all files in that directory (which for a release should include nuttx and nuttx-apps, sha512, " + echo " asc, and tar.gz files), checks the release SHA512 and GPG signatures, checks the unpacked " + echo " directories for required files, and tries to build NuttX for sim:nsh." + echo + echo " If tempdir is specified, it will be removed and recreated; if it is not specified, /tmp/nuttx-checkrelease" + echo " is used." echo - echo " nuttx and nuttx-apps tar.gz files are left in the current" - echo " directory." - echo echo "Examples:" echo - echo " $0 9.1.0-RC1" - echo " $0 https://dist.apache.org/repos/dist/dev/incubator/nuttx/9.1.0-RC1/" + echo " $0 --release 9.1.0-RC1" + echo " $0 --url https://dist.apache.org/repos/dist/dev/incubator/nuttx/9.1.0-RC1/" + echo " $0 --dir ./some-dir-that-has-nuttx-and-apps" echo } -if [ "-h" == "$1" ]; then +URL="" +DIRECTORY="" + +while [[ $# -gt 0 ]] +do + case $1 in + -U|--url) + shift + URL="$1/" + ;; + -R|--release) + shift + RELEASE="$1" + URL="$BASE_URL/$RELEASE/" + ;; + -D|--dir) + shift + DIRECTORY="$(readlink -f $1)" + ;; + -T|--tempdir) + shift + TEMPDIR="$(readlink -f $1)" + ;; + -h|--help) usage exit 0 -fi + ;; + *) # unknown option + usage + exit 1 + ;; + esac + shift +done -if [ -z "$1" ]; then - usage - exit 0 -fi - -ARG=$1 -if [[ "$ARG" =~ ^"http".* ]]; then - URL="$1/" -else - URL="$BASE_URL/$1/" +if [[ (-z "$URL") && (-z "$DIRECTORY") ]]; then + usage + exit 1 fi download_release -check_nuttx -check_nuttx_apps +check_nuttx +check_nuttx_apps +check_sim_nsh_build + +exit $RETURN_CODE