diff --git a/releng/scripts/check_code_cleanliness.sh b/releng/scripts/check_code_cleanliness.sh index 58217215cb5..ea2a2025ef7 100755 --- a/releng/scripts/check_code_cleanliness.sh +++ b/releng/scripts/check_code_cleanliness.sh @@ -8,13 +8,145 @@ set -e DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) ${DIR}/check_features.sh -## -# The script is shared by all the CDT projects. When running -# local edits, you can, for example, do: -# SCRIPT_URL=file:///scratch/eclipse/src/cdt/cdt-infra/scripts/check_code_cleanliness.sh ./check_code_cleanliness.sh -## +#!/bin/bash -: ${SCRIPT_URL:=https://raw.githubusercontent.com/eclipse-cdt/cdt-infra/master/scripts/check_code_cleanliness.sh} -export COREPROJECT=core/org.eclipse.cdt.core -echo Obtaining check_code_cleanliness.sh from $SCRIPT_URL -curl -sL $SCRIPT_URL | bash +## +# This script is reused by other projects, if so, COREPROJECT should be set +# to the project to use a basis for project settings +## +: ${COREPROJECT:=core/org.eclipse.cdt.core} + +## +# Format code +## +: ${ECLIPSE:=~/buildtools/eclipse-SDK-4.13/eclipse} +test ! -e check_code_cleanliness_workspace +${ECLIPSE} \ + -consolelog -nosplash -application org.eclipse.jdt.core.JavaCodeFormatter \ + -config $PWD/$COREPROJECT/.settings/org.eclipse.jdt.core.prefs \ + $PWD -data check_code_cleanliness_workspace +rm -rf check_code_cleanliness_workspace + +## +# Remove trailing whitespace. +# The .gitattributes is used as a filter to identify files to check. Patters with +# this "# check trailing whitespace" on the line before are checked +## +awk '/# remove trailing whitespace/{getline; print $1}' .gitattributes | + while read i ; do + echo "Removing trailing whitespace on $i files" + git ls-files -- "$i" | xargs --no-run-if-empty sed -i 's/[ \t]*$//' + done + +## +# Add all file types to .gitattributes +## +git ls-files | sed -E '-es@^.*/([^/]+)$@\1@' '-es@.+\.@\\\*\\.@' | sort -u | while read i ; do + if ! grep "^$i " .gitattributes > /dev/null + then + echo "MISSING $i in .gitattributes, adding as text, check if that is correct" + echo "$i text # automatically added - please verify" >> .gitattributes + fi +done + +## +# Copy JDT/PDE preferences +## +git ls-files -- \*\*/.project ":!$COREPROJECT/.project" | while read i ; do + d=`dirname $i`; + if test ! -e $d/feature.xml; then + mkdir -p $d/.settings + cp $COREPROJECT/.settings/org.eclipse.jdt.* $COREPROJECT/.settings/org.eclipse.pde.* $d/.settings + # For test plug-ins we are more lenient so don't warn on some items + if echo $i | grep '\.tests[/\.]' > /dev/null; then + sed -i \ + '-es@org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning@org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore@' \ + '-es@org.eclipse.jdt.core.compiler.problem.discouragedReference=warning@org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore@' \ + '-es@org.eclipse.jdt.core.compiler.problem.deprecation=warning@org.eclipse.jdt.core.compiler.problem.deprecation=ignore@' \ + '-es@org.eclipse.jdt.core.compiler.problem.discouragedReference=warning@org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore@' \ + '-es@org.eclipse.jdt.core.compiler.problem.emptyStatement=warning@org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore@' \ + '-es@org.eclipse.jdt.core.compiler.problem.fieldHiding=warning@org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore@' \ + '-es@org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning@org.eclipse.jdt.core.compiler.problem.finalParameterBound=ignore@' \ + '-es@org.eclipse.jdt.core.compiler.problem.forbiddenReference=error@org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning@' \ + '-es@org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning@org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore@' \ + '-es@org.eclipse.jdt.core.compiler.problem.unusedLocal=warning@org.eclipse.jdt.core.compiler.problem.unusedLocal=ignore@' \ + '-es@org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning@org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=ignore@' \ + '-es@org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning@org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore@' \ + '-es@org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning@org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore@' \ + '-es@org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning@org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore@' \ + $d/.settings/org.eclipse.jdt.core.prefs + sed -i \ + '-es@compilers.p.not-externalized-att=1@compilers.p.not-externalized-att=2@' \ + $d/.settings/org.eclipse.pde.prefs + fi + if echo $i | grep 'org.eclipse.cdt.examples.dsf' > /dev/null; then + sed -i \ + '-es@org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning@org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore@' \ + $d/.settings/org.eclipse.jdt.core.prefs + fi + fi +done + +## +# Make sure that natives are up to date +## +if test -e native/org.eclipse.cdt.native.serial/jni; then + echo "Rebuilding natives to make sure they match source" + logfile=$(mktemp /tmp/make-natives-log.XXXXXX) + if ! make -C native/org.eclipse.cdt.native.serial/jni rebuild >${logfile} 2>&1; then + echo "Rebuilding of natives failed. The log is part of the artifacts of the build" + cp ${logfile} make-natives.log + exit 1 + fi +fi + +## +# Check that none of the above caused any changes +## +if test -z "$(git status -s)"; then + echo "Tree looks clean!" +else + echo "Tree is dirty - something needs to be cleaned up in your commit" + echo "Result of git status" + git status + echo "Result of git diff" + git diff + echo "Tree is dirty - something needs to be cleaned up in your commit (see above for git status/diff)" + exit 1 +fi + +## +# Make sure all versions have been bumped appropriately compared to the baseline +## +echo "Running 'mvn verify -P baseline-compare-and-replace' to make sure all versions have been appropriately incremented" +logfile=$(mktemp /tmp/baseline-compare-and-replace.XXXXXX) +if ${MVN:-mvn} \ + clean verify -B -V \ + -DskipDoc=true \ + -DskipTests=true \ + -P baseline-compare-and-replace >${logfile} 2>&1; then + echo "Maven check all versions have been bumped appropriately appears to have completed successfully" +else + if grep "Only qualifier changed" ${logfile} > /dev/null; then + bundle=$(grep "Only qualifier changed" ${logfile} | sed -e 's/^.*Only qualifier changed for .//' -e 's@/.*@@') + echo "Bundle '${bundle}' is missing a service segment version bump" + echo "Please bump service segment by 100 if on master branch" + echo "The log of this build is part of the artifacts" + echo "See: https://wiki.eclipse.org/Version_Numbering#When_to_change_the_service_segment" + elif grep "baseline and build artifacts have same version but different contents" ${logfile} > /dev/null; then + bundle=$(grep "baseline and build artifacts have same version but different contents" ${logfile} | sed -e 's/^.* on project //' -e 's@: baseline@@') + echo "Bundle '${bundle}' has same version as baseline, but different contents" + echo "This can happen for a variety of reasons:" + echo " - The comparison filters in the root pom.xml are not working" + echo " - Different versions of Java are being used to compile compared to the baseline" + echo " - A dependency has changed causing the generated classes to be different" + echo "The log of this build is part of the artifacts" + echo "Please bump service segment by 100 if on master branch" + echo "See: https://wiki.eclipse.org/Version_Numbering#When_to_change_the_service_segment" + else + echo "Maven 'check all versions have been bumped appropriately' failed!" + echo "The log of this build is part of the artifacts" + fi + cp ${logfile} baseline-compare-and-replace.log + exit 1 +fi