diff --git a/circle.yml b/circle.yml index 5977d59a63..1f6682064d 100644 --- a/circle.yml +++ b/circle.yml @@ -7,11 +7,10 @@ dependencies: test: override: - make -f posix.mak style + - ./circleci.sh setup-repos - ./circleci.sh coverage: parallel: true timeout: 1200 post: - # CodeCov gets confused by stored .lst files - - rm -rf test/coverage/generated - - bash <(curl -s https://codecov.io/bash) + - ./circleci.sh codecov diff --git a/circleci.sh b/circleci.sh index ca85a114ce..d20cad3df8 100755 --- a/circleci.sh +++ b/circleci.sh @@ -2,32 +2,41 @@ set -uexo pipefail -HOST_DMD_VER=2.068.2 # same as in dmd/src/posix.mak +HOST_DMD_VER=2.072.2 # same as in dmd/src/posix.mak CURL_USER_AGENT="CirleCI $(curl --version | head -n 1)" N=2 CIRCLE_NODE_INDEX=${CIRCLE_NODE_INDEX:-0} +CIRCLE_PROJECT_REPONAME=${CIRCLE_PROJECT_REPONAME:-druntime} case $CIRCLE_NODE_INDEX in 0) MODEL=64 ;; 1) MODEL=32 ;; esac -install_deps() { - if [ $MODEL -eq 32 ]; then - sudo apt-get update - sudo apt-get install g++-multilib - fi - +download() { + local url="$1" + local fallbackurl="$2" + local outputfile="$3" for i in {0..4}; do - if curl -fsS -A "$CURL_USER_AGENT" --max-time 5 https://dlang.org/install.sh -O; then + if curl -fsS -A "$CURL_USER_AGENT" --max-time 5 "$url" -o "$outputfile" || + curl -fsS -A "$CURL_USER_AGENT" --max-time 5 "$fallbackurl" -o "$outputfile" ; then break elif [ $i -ge 4 ]; then sleep $((1 << $i)) else - echo 'Failed to download install script' 1>&2 + echo "Failed to download script ${outputfile}" 1>&2 exit 1 fi done +} + +install_deps() { + if [ $MODEL -eq 32 ]; then + sudo apt-get update + sudo apt-get install g++-multilib + fi + + download "https://dlang.org/install.sh" "https://nightlies.dlang.org/install.sh" "install.sh" source "$(CURL_USER_AGENT=\"$CURL_USER_AGENT\" bash install.sh dmd-$HOST_DMD_VER --activate)" $DC --version @@ -51,27 +60,39 @@ clone() { done } -coverage() { +setup_repos() { + # set a default in case we run into rate limit restrictions + local base_branch="" if [ -n "${CIRCLE_PR_NUMBER:-}" ]; then - local base_branch=$(curl -fsSL https://api.github.com/repos/dlang/$CIRCLE_PROJECT_REPONAME/pulls/$CIRCLE_PR_NUMBER | jq -r '.base.ref') + base_branch=$((curl -fsSL https://api.github.com/repos/dlang/$CIRCLE_PROJECT_REPONAME/pulls/$CIRCLE_PR_NUMBER || echo) | jq -r '.base.ref') else - local base_branch=$CIRCLE_BRANCH + base_branch=$CIRCLE_BRANCH fi + base_branch=${base_branch:-"master"} # merge upstream branch with changes, s.t. we check with the latest changes if [ -n "${CIRCLE_PR_NUMBER:-}" ]; then - local current_branch=$(git rev-parse --abbrev-ref HEAD) - git config user.name dummyuser - git config user.email dummyuser@dummyserver.com - git remote add upstream https://github.com/dlang/druntime.git - git fetch upstream - git checkout -f upstream/$base_branch - git merge -m "Automatic merge" $current_branch + local head=$(git rev-parse HEAD) + git fetch https://github.com/dlang/$CIRCLE_PROJECT_REPONAME.git $base_branch + git checkout -f FETCH_HEAD + local base=$(git rev-parse HEAD) + git config user.name 'CI' + git config user.email '<>' + git merge -m "Merge $head into $base" $head fi + for proj in dmd ; do + if [ $base_branch != master ] && [ $base_branch != stable ] && + ! git ls-remote --exit-code --heads https://github.com/dlang/$proj.git $base_branch > /dev/null; then + # use master as fallback for other repos to test feature branches + clone https://github.com/dlang/$proj.git ../$proj master --depth 1 + else + clone https://github.com/dlang/$proj.git ../$proj $base_branch --depth 1 + fi + done +} - clone https://github.com/dlang/dmd.git ../dmd $base_branch --depth 1 - +coverage() { # load environment for bootstrap compiler source "$(CURL_USER_AGENT=\"$CURL_USER_AGENT\" bash ~/dlang/install.sh dmd-$HOST_DMD_VER --activate)" @@ -81,7 +102,17 @@ coverage() { TEST_COVERAGE="1" make -j$N -C . -f posix.mak MODEL=$MODEL unittest-debug } +codecov() +{ + # CodeCov gets confused by lst files which it can't matched + rm -rf test/runnable/extra-files + download "https://codecov.io/bash" "https://raw.githubusercontent.com/codecov/codecov-bash/master/codecov" "codecov.sh" + bash codecov.sh +} + case $1 in install-deps) install_deps ;; + setup-repos) setup_repos ;; coverage) coverage ;; + codecov) codecov ;; esac