#!/usr/bin/env bash # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # this work for additional information regarding copyright ownership. # The ASF licenses this file to You under the Apache License, Version 2.0 # (the "License"); you may not use this file except in compliance with # the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # # This script follows the base format for testing pull requests against # another branch and returning results to be published. More details can be # found at dev/run-tests-jenkins. # # Arg1: The Github Pull Request Actual Commit #+ known as `ghprbActualCommit` in `run-tests-jenkins` # Arg2: The SHA1 hash #+ known as `sha1` in `run-tests-jenkins` # Arg3: Current PR Commit Hash #+ the PR hash for the current commit # ghprbActualCommit="$1" sha1="$2" current_pr_head="$3" MVN_BIN="build/mvn" CURR_CP_FILE="my-classpath.txt" MASTER_CP_FILE="master-classpath.txt" # First switch over to the master branch git checkout -f master # Find and copy all pom.xml files into a *.gate file that we can check # against through various `git` changes find -name "pom.xml" -exec cp {} {}.gate \; # Switch back to the current PR git checkout -f "${current_pr_head}" # Check if any *.pom files from the current branch are different from the master difference_q="" for p in $(find -name "pom.xml"); do [[ -f "${p}" && -f "${p}.gate" ]] && \ difference_q="${difference_q}$(diff $p.gate $p)" done # If no pom files were changed we can easily say no new dependencies were added if [ -z "${difference_q}" ]; then echo " * This patch does not change any dependencies." else # Else we need to manually build spark to determine what, if any, dependencies # were added into the Spark assembly jar ${MVN_BIN} clean package dependency:build-classpath -DskipTests 2>/dev/null | \ sed -n -e '/Building Spark Project Assembly/,$p' | \ grep --context=1 -m 2 "Dependencies classpath:" | \ head -n 3 | \ tail -n 1 | \ tr ":" "\n" | \ rev | \ cut -d "/" -f 1 | \ rev | \ sort > ${CURR_CP_FILE} # Checkout the master branch to compare against git checkout -f master ${MVN_BIN} clean package dependency:build-classpath -DskipTests 2>/dev/null | \ sed -n -e '/Building Spark Project Assembly/,$p' | \ grep --context=1 -m 2 "Dependencies classpath:" | \ head -n 3 | \ tail -n 1 | \ tr ":" "\n" | \ rev | \ cut -d "/" -f 1 | \ rev | \ sort > ${MASTER_CP_FILE} DIFF_RESULTS="`diff ${CURR_CP_FILE} ${MASTER_CP_FILE}`" if [ -z "${DIFF_RESULTS}" ]; then echo " * This patch does not change any dependencies." else # Pretty print the new dependencies added_deps=$(echo "${DIFF_RESULTS}" | grep "<" | cut -d' ' -f2 | awk '{printf " * \`"$1"\`\\n"}') removed_deps=$(echo "${DIFF_RESULTS}" | grep ">" | cut -d' ' -f2 | awk '{printf " * \`"$1"\`\\n"}') added_deps_text=" * This patch **adds the following new dependencies:**\n${added_deps}" removed_deps_text=" * This patch **removes the following dependencies:**\n${removed_deps}" # Construct the final returned message with proper return_mssg="" [ -n "${added_deps}" ] && return_mssg="${added_deps_text}" if [ -n "${removed_deps}" ]; then if [ -n "${return_mssg}" ]; then return_mssg="${return_mssg}\n${removed_deps_text}" else return_mssg="${removed_deps_text}" fi fi echo "${return_mssg}" fi # Remove the files we've left over [ -f "${CURR_CP_FILE}" ] && rm -f "${CURR_CP_FILE}" [ -f "${MASTER_CP_FILE}" ] && rm -f "${MASTER_CP_FILE}" # Clean up our mess from the Maven builds just in case ${MVN_BIN} clean &>/dev/null fi