summaryrefslogtreecommitdiff
path: root/scripts/pr-scala-common
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/pr-scala-common')
-rwxr-xr-xscripts/pr-scala-common260
1 files changed, 260 insertions, 0 deletions
diff --git a/scripts/pr-scala-common b/scripts/pr-scala-common
new file mode 100755
index 0000000000..01112588f7
--- /dev/null
+++ b/scripts/pr-scala-common
@@ -0,0 +1,260 @@
+# This is for forcibly stopping the job from a subshell (see test
+# below).
+trap "exit 1" TERM
+export TOP_PID=$$
+set -e
+
+# Known problems : does not fare well with interrupted, partial
+# compilations. We should perhaps have a multi-dependency version
+# of do_i_have below
+
+BASEDIR="$(pwd)"
+
+LOGGINGDIR="$BASEDIR/logs"
+mkdir -p $LOGGINGDIR
+
+unset SBT_HOME
+SBT_HOME="$BASEDIR/.sbt"
+mkdir -p $SBT_HOME
+IVY_CACHE="$BASEDIR/.ivy2"
+mkdir -p $IVY_CACHE
+rm -rf $IVY_CACHE/cache/org.scala-lang
+
+# temp dir where all 'non-build' operation are performed
+TMP_ROOT_DIR=$(mktemp -d -t pr-scala.XXXX)
+TMP_DIR="${TMP_ROOT_DIR}/tmp"
+mkdir "${TMP_DIR}"
+
+
+# detect sed version and how to enable extended regexes
+SEDARGS="-n$(if (echo "a" | sed -nE "s/a/b/" &> /dev/null); then echo E; else echo r; fi)"
+
+
+# :docstring getOrUpdate:
+# Usage : getOrUpdate <directory> <url> <reference> <n>
+#
+# Updates or clones the checkout of <reference> taken from the
+# git repo at <url> into the local directory
+# <directory> and cleans the checkout.
+#
+# :end docstring:
+
+function getOrUpdate(){
+ if [ ! -d $1 ]; then
+ git clone --depth 1 $2
+ fi
+ pushd $1
+
+ git fetch $2 $3
+
+ git checkout -q FETCH_HEAD
+
+ git reset --hard FETCH_HEAD
+
+ git clean -fxd
+
+ git log --oneline -1
+
+ git status
+
+ popd
+}
+
+
+# :docstring parse_properties:
+# Usage: parse_properties javaPropertyFile
+# Exports variables set in property file under $BASEDIR, mangling names by replacing dots with _
+# :end docstring:
+
+function parse_properties(){
+ propFile="$BASEDIR/$1"
+ if [ ! -f $propFile ]; then
+ say "Property file $propFile not found."
+ exit 1
+ else
+ awk -f "$scriptsDir/readproperties.awk" "$propFile" > "$propFile.sh"
+ . "$propFile.sh" # yeah yeah, not that secure, improvements welcome (I tried, but bash made me cry again)
+ fi
+}
+
+
+# :docstring test:
+# Usage: test <argument ..>
+# Executes <argument ..>, logging the launch of the command to the
+# main log file, and kills global script execution with the TERM
+# signal if the commands ends up failing.
+# DO NOT USE ON FUNCTIONS THAT DECLARE VARIABLES,
+# AS YOU'LL BE RUNNING IN A SUBSHELL AND VARIABLE DECLARATIONS WILL BE LOST
+# :end docstring:
+
+function test() {
+ echo "### $@"
+ "$@"
+ status=$?
+ if [ $status -ne 0 ]; then
+ say "### ERROR with $1"
+ kill -s TERM $TOP_PID
+ fi
+}
+
+# :docstring say:
+# Usage: say <argument ..>
+# Prints <argument ..> to both console and the main log file.
+# :end docstring:
+
+function say(){
+ (echo "$@") | tee -a $LOGGINGDIR/compilation-$SCALADATE-$SCALAHASH.log
+}
+
+# General debug logging
+# $* - message
+function debug () {
+ echo "----- $*"
+}
+
+
+## TAKEN FROM UBER-BUILD, except that it "returns" (via $RES) true/false
+# Check if an artifact is available
+# $1 - groupId
+# $2 - artifacId
+# $3 - version
+# $4 - extra repository to look in (optional)
+# return value in $RES
+function checkAvailability () {
+ cd "${TMP_DIR}"
+ rm -rf *
+
+# pom file for the test project
+ cat > pom.xml << EOF
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>com.typesafe</groupId>
+ <artifactId>typesafeDummy</artifactId>
+ <packaging>war</packaging>
+ <version>1.0-SNAPSHOT</version>
+ <name>Dummy</name>
+ <url>http://127.0.0.1</url>
+ <dependencies>
+ <dependency>
+ <groupId>$1</groupId>
+ <artifactId>$2</artifactId>
+ <version>$3</version>
+ </dependency>
+ </dependencies>
+ <repositories>
+ <repository>
+ <id>sonatype.snapshot</id>
+ <name>Sonatype maven snapshot repository</name>
+ <url>https://oss.sonatype.org/content/repositories/snapshots</url>
+ <snapshots>
+ <updatePolicy>daily</updatePolicy>
+ </snapshots>
+ </repository>
+EOF
+
+ if [ -n "$4" ]
+ then
+# adds the extra repository
+ cat >> pom.xml << EOF
+ <repository>
+ <id>extrarepo</id>
+ <name>extra repository</name>
+ <url>$4</url>
+ </repository>
+EOF
+ fi
+
+ cat >> pom.xml << EOF
+ </repositories>
+</project>
+EOF
+
+ set +e
+ mvn "${MAVEN_ARGS[@]}" compile &> "${TMP_DIR}/mvn.log"
+ RES=$?
+ # Quiet the maven, but allow diagnosing problems.
+ grep -i downloading "${TMP_DIR}/mvn.log"
+ grep -i exception "${TMP_DIR}/mvn.log"
+ grep -i error "${TMP_DIR}/mvn.log"
+ set -e
+
+# log the result
+ if [ ${RES} == 0 ]
+ then
+ debug "$1:$2:jar:$3 found !"
+ RES=true
+ else
+ debug "$1:$2:jar:$3 not found !"
+ RES=false
+ fi
+}
+
+
+# :docstring preparesbt:
+# Usage: preparesbt
+# This lets sbt know to look for the local maven repository.
+# :end docstring:
+
+# don't share any caches, sbt dirs, repos,... to avoid concurrent writes
+# keep them local to the workspace also lets us diagnose problems more easily
+# Make sure this is an absolute path with preceding '/'
+LOCAL_M2_REPO="$BASEDIR/m2repo"
+GENMVNOPTS="-e -B -X -Dmaven.repo.local=${LOCAL_M2_REPO}"
+# otherwise this just keeps growing and growing due to the -$sha-SNAPSHOT approach
+[[ -d "$LOCAL_M2_REPO"/org/scala-lang ]] && rm -rf "$LOCAL_M2_REPO"/org/scala-lang
+
+function preparesbt(){
+ # Am I using sbt-extras? I.e., do we need to use -sbt-dir?
+ set +e
+ sbt -h 2>&1 | grep -qe "-sbt-dir"
+ sbt_extraed=$?
+ set -e
+ export DEST_REPO_FILE=$SBT_HOME/repositories
+ if [ $sbt_extraed -eq 0 ]; then
+ # sbt-extras does not honor an explicit -Dsbt.global.base
+ export SBT_ARGS="-verbose -debug -no-colors -sbt-dir $SBT_HOME -ivy $IVY_CACHE"
+ say "### sbt-extras detected, using args $SBT_ARGS"
+ else
+ # don't pass -verbose or -debug, they tend to break sbt...
+ export SBT_ARGS="-Dsbt.global.base=$SBT_HOME -Dsbt.ivy.home=$IVY_CACHE"
+ say "### vanilla sbt detected, using args $SBT_ARGS"
+ fi
+
+ if [ -f $DEST_REPO_FILE ]; then
+ export OLD_SBT_REPO_FILE=$(mktemp -t sbtreposXXX)
+ cat $DEST_REPO_FILE > $OLD_SBT_REPO_FILE
+ fi
+ cat > $DEST_REPO_FILE <<EOF
+[repositories]
+ maven-central
+ local
+ typesafe-ivy-releases: http://repo.typesafe.com/typesafe/ivy-releases/, [organization]/[module]/[revision]/[type]s/[artifact](-[classifier]).[ext]
+ sonatype-snapshots: https://oss.sonatype.org/content/repositories/snapshots
+ sonatype-releases: https://oss.sonatype.org/content/repositories/releases
+ mavenLocal: file://$LOCAL_M2_REPO
+ prRepo: $prRepoUrl
+EOF
+}
+
+# :docstring cleanupsbt:
+# Usage: cleanupsbt
+# This reestablishes the previous .sbt/repositories.
+# :end docstring:
+
+function cleanupsbt(){
+ say "### cleaning up $DEST_REPO_FILE"
+ if [[ ! -z $OLD_SBT_REPO_FILE ]]; then
+ mv $OLD_SBT_REPO_FILE $DEST_REPO_FILE
+ else
+ rm $DEST_REPO_FILE
+ fi
+}
+
+function main() {
+ SCALAHASH=$sha # passed in by jenkins
+ SCALADIR="$BASEDIR/scala/"
+ if [[ -z $SCALAHASH ]]; then
+ echo "No Scala sha provided!"
+ exit 1
+ fi
+}