forked from phoedos/pmd
Merge branch 'pmd/5.4.x' into pmd/5.5.x
This commit is contained in:
85
.travis.yml
85
.travis.yml
@ -1,20 +1,50 @@
|
||||
sudo: false
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- oracle-java8-installer
|
||||
ssh_known_hosts:
|
||||
- web.sourceforge.net
|
||||
language: java
|
||||
jdk: oraclejdk8
|
||||
before_install:
|
||||
- echo "MAVEN_OPTS='-Xms1g -Xmx1g'" > "$HOME/.mavenrc"
|
||||
- mkdir -p "$HOME/.m2"
|
||||
- cp .travis-toolchains.xml "$HOME/.m2/toolchains.xml"
|
||||
before_script:
|
||||
- SHOULD_DEPLOY=no
|
||||
- '[ "${TRAVIS_SECURE_ENV_VARS}" = "true" ] && [ "${TRAVIS_PULL_REQUEST}" = "false" ] && SHOULD_DEPLOY=yes || ( [ "${SHOULD_DEPLOY}" != "yes" ] && echo "Skipping Deploy" )'
|
||||
- export SHOULD_DEPLOY
|
||||
- bash .travis/install-configure-maven.sh
|
||||
- export M2_HOME=$HOME/apache-maven-3.3.9
|
||||
- export PATH=$HOME/apache-maven-3.3.9/bin:${PATH}
|
||||
- openssl aes-256-cbc -K $encrypted_5630fbebf057_key -iv $encrypted_5630fbebf057_iv -in .travis/secrets.tar.enc -out .travis/secrets.tar -d
|
||||
- pushd .travis && tar xfv secrets.tar && popd
|
||||
- mkdir -p "$HOME/.ssh"
|
||||
- chmod 700 "$HOME/.ssh"
|
||||
- mv .travis/id_rsa "$HOME/.ssh/id_rsa"
|
||||
- chmod 600 "$HOME/.ssh/id_rsa"
|
||||
- mkdir -p "$HOME/.gpg"
|
||||
- gpg --batch --import .travis/release-signing-key-82DE7BE82166E84E.gpg
|
||||
- rm .travis/secrets.tar
|
||||
- rm .travis/release-signing-key-82DE7BE82166E84E.gpg
|
||||
install: mvn install -DskipTests=true -Dmaven.javadoc.skip=true -B -V
|
||||
before_script: true
|
||||
script:
|
||||
- '[ "${SHOULD_DEPLOY}" = "yes" ] && mvn test deploy --settings .travis-settings.xml || ( [ "${SHOULD_DEPLOY}" != "yes" ] && echo "Skipping Deploy" )'
|
||||
- '[ "${SHOULD_DEPLOY}" = "yes" ] || mvn test'
|
||||
- '[ "${SHOULD_DEPLOY}" = "yes" ] && mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent package sonar:sonar -Dsonar.host.url=https://sonarqube.com -Dsonar.login=${SONAR_TOKEN} || ( [ "${SHOULD_DEPLOY}" != "yes" ] && echo "Skipping Sonar" )'
|
||||
branches:
|
||||
except:
|
||||
- /^pmd_releases\/\d/
|
||||
- 'if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then bash .travis/build-pull-request.sh; fi'
|
||||
- 'if [ "$TRAVIS_PULL_REQUEST" = "false" ] && [ "${TRAVIS_SECURE_ENV_VARS}" = "true" ]; then bash .travis/build-push.sh; fi'
|
||||
after_success: true
|
||||
|
||||
|
||||
before_deploy: true
|
||||
deploy:
|
||||
provider: releases
|
||||
api_key: ${GITHUB_OAUTH_TOKEN}
|
||||
file_glob: true
|
||||
file:
|
||||
- pmd-dist/target/pmd-*.zip
|
||||
- target/pmd-doc-*.zip
|
||||
# TODO : This won't copy the changelog to GitHub
|
||||
skip_cleanup: true
|
||||
on:
|
||||
tags: true
|
||||
repo: pmd/pmd
|
||||
condition: "${TRAVIS_SECURE_ENV_VARS} = true"
|
||||
after_deploy: bash .travis/release.sh
|
||||
|
||||
notifications:
|
||||
email:
|
||||
recipients:
|
||||
@ -29,4 +59,33 @@ env:
|
||||
- secure: KBEuB6U1p5RQXSYe157AwydFr/zpXQPA0IChVCgZV+X1mMyy9ZtrjH1J1AXuviseDDXDbaT25sRnsvpl82rfRw2xOkMGXHy4N95/ylTSr8DjHxTao71BhXsvFycNobFva5y2EGNWqDvpS8I2oSZo7Qk4la3yep3rcJQvcy6RDbbhpDTbL1QMFyadunIBm0WtqbunrMqtjSqaoPsXz8TiQuxHvX4vEXzVbaxV1QQt79Vi+daa6wAV3mRQAugnx+UffsC8JqMxgm06usWeJgCJzxgm8E7clZCLmf53B2TL8dK6bIYbqyvOY3uFxitsTG0d8Z0GOJwXBgZNgbniTRO8ZJSty5eZP8LBybbjVLSL25DNTWtCjADUL/uySnXIEidlMt2N/3QmH7zrGAfAk/tIwKpdRca2GLLydeXf6PSkiahnPEkIY/QupcsOLELhdifpdOjb8QW1OenA+vUbNM9dccLwKnX6Fj9cu4VQG601AcYDr2eyhq8WYkr3wYdw/6KdUa3hmplowTBs+qguppP+eOSgGuEsy38KLtqnvm6WlHy6tcLmcVYKG3DmR1b7TWXsOXC6/VMH8BHBkvsF1QdRg9+Cgx07vX3Hw7roPiYzmaO9Ajs20ATsUfRskMuWCTeTSK5pN8X27veRCZlhFjeKQMDdmfVwzpAfRgKsl3TEn1I=
|
||||
- secure: U1DfAv6acUUWe+dao/ZSDUX64JRadNJY16rITsdrM4ZNAJSuXpEY3p/LWcYjN7D49YmyutbXH9+L3KKQUQGrGXj9QTarfYvd8ZsKt4FK8yv7AFy+RQNIbAjNEHBzHx15p+srMheTaetl7aLwY0qhF+D/RtGapxHKyY4dBHrb0lp8VGyiCiL7Aop8GGskosi1mtirPBp/BStPZ2bEyxG0QzU5SsVWkJWwV9aWLPVAR/n7Xgx/6Gjl6Fed2c/WSrWi4vchm3Ny8pfTweOax3PGYYjBVxIfuX0mqmwuJsY7gNfXCfN3dPiPKGJPFy1pC+LGyGkklO5ReKFLd4O1ME6fU0dlIGfD6n+Q4H6/w9FHXegcKTfWIJm/MFa6vA/tJM5R6zJQuiTQJboHm/UmS/iQj76z0p6sK15Xp5vFId+/dHKqa8xY+Bt6HiXy6z401HOc8QcYBAf7TqhqUt/ZE7HN4be46uR90KmzIrWz6wEoDW7HfwQ9ZMbs55zoOXrvekyE9/gXskypO0p2JT3Y0vlvO27KQvIrSwI480kOVOrlyrYA+LZqlcKaayOuCuZh4lITQUYinUoZZict5joYthH+Cyh2zovoBpxsntDJdMnaZNLtSC7hlhpbMBYaT2y1O6vZH5Yix0mxuDvs/x6ogP5CNBeUYlXhaL+g4GnwKyr0ZA0=
|
||||
- secure: "ElWjttpoMwqezP2zyHkx7CiPON/mRLUW7SsSlEqdlTUYRIaSaL7sShUORJUzj58U/Nnfi/eY4Rweo0CtVu20sG16s9B4adnmPS44LAitztybPR/co93gN9qb8jiIl41nVcOJq+Rut2Z4nr8AGRhVCG9Drg4+DreCqQ4DE5ZD6J99GN0IFGrREt59HQUlBlT9jD0AndK/1GQ6kWAenuSREE2P5ih59rf6FrrfddQO5iqyFFoaHek3JiOmpaLK+z7i4EvMKsAJEooFNuGhHVuyaJJRRZHAncGiQ+uW/yL7G5rY51G6YSNJczzEtfrRg+YrIUbokUPmifSIbnXO/AIZRAq1dMhA8exRc5n+75RB1X164qm4a+yggdybFBh0L59xu606PJQJAuWy+x10nled7FAVXiotxbB0r2bhlVmWFEN+FWPqXg2rVkHvw6+5PM67rG5g1LCgjKzb9I6JWPiVI+EMn8Pw8gryL2Sdqtl08Da0Ypbl2ZK/afU4CEPEKnrDc9ecXKjacehTYwGS48V213XvArcmoEpsyZDRSMTrvK3/e29GEaxoK/ZzWJylpeOtsICEEFYEBEiDsiIW4C50MIUPT2xHV6MaPQzhkuwrbQ6QFYzHzihBaiQuMmXUQ4DMb3fOPkNZAQHQo8CgJ78IcbCABAoGv9mu/fo2KoLo11U="
|
||||
- secure: "otZkFNhApMofp2Jl2baZdpNEPcTa79Xc9wyOw1gl1+ubCLtOGr32FDUSr0HQWKrGXcYZR4bc0A80hx0/ykZ/twJaRAabcNYtjwRMDKKrp3plvp8RTZlB1QW85nsdmk3qmHACzc94wKnmcaDohM5FPxnWspZG5Y4ejYX4HEK6r1fwL4FjMPSLd5QW8yCaAc7dpBSm2UyIXuuDjkekXblJFe8ydbf9aF97WKJMCwqIs9Zo5oJa2pnWCw47ixwjVdkaH5x5727I+YmFqn5rjdEideUFEAlggqMaxuOtfYhuG/8k5W3Q/+WX+G7rEPTcemjmaosbbpoOUE0YUHV3Wi3R5D66NuWIpQwX6kw4rTwL0YIh//0aNb8jv4Z8KwkiTMrYuj0we5tXzARp3yYn56P0JBAm6BihNhfEBv06655Tg5LUsWqUTZCl3KJhwtO1N+OuOkE5qoZm59knq6DeZOsYWAVb3MpzklP06kXGYTjb44PVMUc6ynuuZjgPJDv/0906feA3REHBJVxd3PvJp1c8VvQSeW3ndghEz0akJHY/jxV1rJZAZC1ZeshYUpBNmh0sFDty/UE43IvIB4EInypQHyTtQvMc6LuLjTeu2E5ZMsA3udj66EMrYm4Y2eheJycSfttDqzhsKXIVJ4LmA/xtDR01cp1jsqbbZBhVI67rA40="
|
||||
- secure: "mmHRnK/8CHfgtwaTN3MgjFD1R8EVQhIb/a0Aag3gPaHWW52Ex6xWG7GsF4kRcdzHdIdrQxHZTiDa2oVMWbnQ16CAu4dZJadwTxhBW4JmE1tsi2C6i+uwMBPvnKBXHwt+QOAqNB0L/ByYwWLkucSLoyRs6qU0i7sJ3ZC/EPCuLI8VfBlFUVegSbp2WmclmFnxOi5MKr15Zwd8BGgyWUsvd1OHxhvO3Xr/ZPO4R+1kIgyojloTMu6oGM/shYgsrUXgmI/WvZRTq+25SRCjUmATJtuDXXgVeJtYabi/+Zju5Z7K06oaKvFYM+BgZWPmGQkVCxKVjSlug0rx6+qgRKIf/B/cPxmQDS0ZZVDmDcbxeibBL9JhRqIDwDb0XS9t1qBXvIJ5E4ZmdX/XuvLCnC4xJptu/vHyKl1wbRM3dcXEBk8J0knJc4JvY2yupF3LS32sfEHftLwzr63U3/0dOQvsCSJRBy5zgI8ieABUZAeZmmaQ6RCGOTEYrGO2G4CCF2uVq4YdrCOsfmrb0DzH8llNMkXKzXlITRvmkuBlTRRKxGnPzS3vf0iicdAkmTiU5u7lArFFc7IKcW4ypO+RKDTUpq74K+UZBI9eBjV7Po368EO8epJ5aIx32a2kyS/hYWkS/dZh7I0fNZa2qBUceZO/KZGRjH4dQFW9t0J9Q7LLXJY="
|
||||
- secure: "geOU/7VR83KYTOCR5XkgFqnHJEnXeB6hNDE7UFcN4ZsL9uVLhxlDVWV3ujJ87nyBzggG1KfSnUx11UwOQrbBl0K6sEXo/B2q5ytOsWoSLi7+0qm/uhhw/DTBOq57p8TIDKFM7rDhO7uajSn7Y86LeZkh9wIs5265Fh1yhCkiPbczDUMsX4P0GGg2qgkIKSBw4DZf6sPDc4xjJq/4/cLnjXo/K0ZYAIoSLqDfe1gmkzMtQlad+1t8Lwv/gOJ4BNRF4a5aEvGF6kbFovFoeFWCQTKlkn6VJtY+BETGKW2RH9efGeMs7JbBbNm+nnpoNsbJ0gdmGlhSbWT8enIm72/P0ThTBJWVcLJ30tUd0UeYD9C49wbJ3RHSxsoUKP9YhHJ+XKNx+8irkJ8LPCkNMQEFE153gEVvU7tCgah9Uq6laYZv9cQE0dWzNt3//Ymls8BzY38Ha4PbrIIJqEuWwnAX6ZgTgzVtXx1AJjkDFG9KFKPhN7NfNMbh7rn5C84a1h5zrIydm+6RcIBC+xTLDEiN7djiquf3PcNtyGLcO8dNN4Uv8iU0Jw8ch3+w0PJO53v5py+IS1V8pwwYaYF2iVPOoziS0tP8MsgYVGwpTZhvz3v8x0ge8r6KJE4zdvoPtCRNr2Oo3sJGYqkt86Hu6agKFiljP5AgJNx7iQD5GQn6J3w="
|
||||
- secure: "gqyPF3d75JuwZptnQQQKO6rGUILXGO09y9dZhShdX8qq5Mexa2ISk77Y/b0yyAdhJMgEglls5cWlbHkwCAB0i4yL25RE5CtQUe4er+CIKwBIs0M56ghbcOwWAFB/cXeyyWmXDHBVnVUeKm7IJ34txsEclnMzQSR/DInSzsCFMUQok8HEaWZNssMjyRgo6goKGdG5vNWGfLLY7mKGMe/6PpYJD0G8k+Na08aX06ZWph38He8O3imUAngoQrxiSp0UYmnHDkigbV7S2LdZOsj7kMxkiyigzK/P1eygHVbFAhohLroaqS9B4CBK7QeOyup2vxVKqJVzFwOCylD0786CImvaG2ZYMtvJkapvaEE0mdMlyYpHgdIkmHZu28aMW7hXEhxHyBAxKuPcj5eGCGziO+ztCvfYIA9CGs1uA4KLrED7SahvB0oXnt3KTFdRc857cWcpp2NmRKihLzVdgHlmT8zcYaec3zP1VdMoa2bmLHoaZtAwvMTcAG56FcET1p7f9v+uiU88ZeptEjTJfpAWlq34tpwZXNyIQi5IROocSHM+PKTgLAsAMP5klGascr8E0sEzREl7tg8hqEwXKym/sVKyT+HMptA3UZcrZZhm07/cmQ0pUVvbV9QDb0MzU3O2wF7vT3U7R7Fb1u0LxMjblPyEazTp8ldabVRJREwlsDc="
|
||||
- secure: "hFcdJSNyKL32geeIW+EbevwyPh4EK/KpaBIB780G4OPGjPUAe2y1VlvdPmljZM7HMb28l5Xf58LLdZdodtXAQbIvWYuP3A+EBxmIlPibb1D6AZqVYzY4ZB9sJGMDcTwzfIYrNZOBI9v34t8qZxHMfUm3XweHGsDwmyc18PmHAgG8m/0rwlIjtVlmEm+fFrvVHRXP1Jz3aX0RmTvrhc9/koZvpqztylIsqy9rlSX2OxoksDx825QfkE+YfbqS/OmAgqtw55r4H385cQJS97Yzc3X2dA8BKfPus7ng+lRxL9sYxwqjvDJzOeBqhf62BircPeymlWc+Hc53gNirW2MG4vHY/zASvZDjg9Hr2sEUODY8u8i7EvfYfX+hNPXZNtWo8fHO5UviCbc16IMrADN497Y54cKvAtyD/2H3aFWg8ei96GpxOaL6W+l5gtlgNC1b9wPE3+pDloLc4TMbvvlSDPKGWgSgqv4haRJ81oIJK+KEvWhbX5Sn3l5QTM33/rn4KUEFqhGNpUxGrvCQOn5sO7A2wnk8JMlrcRZKBpk+wfEzeTEAqZ6Vt7pmceEpcs/NdJCsRjAOmlCdjLVHtrF9zGpBelAMzbIeKLMsTtR3PbpediWHkNwLaMCAEZPIPKeML6TXoPy/nlBpkK20rTbHRHhumFKACB3F3HCWm8v/SIU="
|
||||
|
||||
|
||||
# Secure Keys, that need to be set for snapshot builds
|
||||
#
|
||||
# CI_DEPLOY_USERNAME - the user which can upload net.sourceforge.pmd:* to https://oss.sonatype.org/
|
||||
# CI_DEPLOY_PASSWORD
|
||||
#
|
||||
# SONAR_TOKEN - the token used to update https://sonarqube.com/dashboard/?id=393826
|
||||
#
|
||||
# PMD_SF_USER - the sourceforge user, which is used to upload created binaries to sf files section. Note: an ssh key is
|
||||
# required. See "before_install".
|
||||
#
|
||||
#
|
||||
# Secure Keys, that need to be set for releases:
|
||||
#
|
||||
# PMD_SF_APIKEY - used to make the new release the default file in the files section. See https://sourceforge.net/auth/preferences/
|
||||
# under "Release API Key"
|
||||
#
|
||||
# CI_SIGN_KEYNAME
|
||||
# CI_SIGN_PASSPHRASE
|
||||
# add the encrypted GPG keyring file to repo (https://docs.travis-ci.com/user/encrypting-files/#Automated-Encryption), decrypt it and install it at the beginning of .travis-deploy.sh
|
||||
#
|
||||
# GITHUB_OAUTH_TOKEN - the token used to upload the binaries to github releases
|
||||
#
|
||||
|
||||
|
3
.travis/build-pull-request.sh
Normal file
3
.travis/build-pull-request.sh
Normal file
@ -0,0 +1,3 @@
|
||||
#!/bin/bash
|
||||
set -ev
|
||||
mvn verify -B -V
|
38
.travis/build-push.sh
Normal file
38
.travis/build-push.sh
Normal file
@ -0,0 +1,38 @@
|
||||
#!/bin/bash
|
||||
set -ev
|
||||
|
||||
VERSION=$(mvn -q -Dexec.executable="echo" -Dexec.args='${project.version}' --non-recursive org.codehaus.mojo:exec-maven-plugin:1.5.0:exec)
|
||||
echo "Building PMD ${VERSION} on branch ${TRAVIS_BRANCH}"
|
||||
|
||||
if [[ "$VERSION" != *-SNAPSHOT && "$TRAVIS_TAG" != "" ]]; then
|
||||
mvn deploy -Possrh,pmd-release -B -V
|
||||
else
|
||||
mvn deploy -Possrh -B -V
|
||||
fi
|
||||
|
||||
bash .travis/build-site.sh
|
||||
|
||||
# create pmd-doc archive
|
||||
(
|
||||
cd target
|
||||
mv staging pmd-doc-${VERSION}
|
||||
zip -qr pmd-doc-${VERSION}.zip pmd-doc-${VERSION}/
|
||||
)
|
||||
|
||||
# Uploading pmd distribution to sourceforge
|
||||
if [ "$TRAVIS_TAG" = "" ]; then
|
||||
rsync -avh pmd-dist/target/pmd-*-${VERSION}.zip target/pmd-doc-${VERSION}.zip ${PMD_SF_USER}@web.sourceforge.net:/home/frs/project/pmd/pmd/${VERSION}/
|
||||
rsync -avh src/site/markdown/overview/changelog.md ${PMD_SF_USER}@web.sourceforge.net:/home/frs/project/pmd/pmd/${VERSION}/ReadMe.md
|
||||
fi
|
||||
|
||||
if [[ "$VERSION" == *-SNAPSHOT && "$TRAVIS_BRANCH" == "master" ]]; then
|
||||
# Uploading snapshot site...
|
||||
rsync -ah --stats --delete target/pmd-doc-${VERSION}/ ${PMD_SF_USER}@web.sourceforge.net:/home/project-web/pmd/htdocs/snapshot/
|
||||
fi
|
||||
|
||||
|
||||
if [[ "$VERSION" == *-SNAPSHOT && "$TRAVIS_BRANCH" == "master" ]]; then
|
||||
# only do a clean build for sonar, if we are executing a snapshot build, otherwise we can't reuse the build from above for the release
|
||||
mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent package sonar:sonar -Dsonar.host.url=https://sonarqube.com -Dsonar.login=${SONAR_TOKEN} -B -V
|
||||
fi
|
||||
|
48
.travis/build-site.sh
Normal file
48
.travis/build-site.sh
Normal file
@ -0,0 +1,48 @@
|
||||
#!/bin/bash
|
||||
set -ev
|
||||
|
||||
# Do not log the output, to avoid the travis log length limit of 4MB
|
||||
# Solution from http://stackoverflow.com/questions/26082444/how-to-work-around-travis-cis-4mb-output-limit/26082445#26082445
|
||||
|
||||
|
||||
|
||||
export PING_SLEEP=30s
|
||||
export BUILD_OUTPUT=/tmp/build-site.out
|
||||
export PING_PID_FILE=/tmp/build-site-ping.pid
|
||||
|
||||
touch $BUILD_OUTPUT
|
||||
|
||||
dump_output() {
|
||||
echo Tailing the last 500 lines of output:
|
||||
tail -500 $BUILD_OUTPUT
|
||||
}
|
||||
kill_ping() {
|
||||
if [ -e $PING_PID_FILE ]; then
|
||||
PING_LOOP_PID=$(cat $PING_PID_FILE)
|
||||
kill $PING_LOOP_PID
|
||||
rm $PING_PID_FILE
|
||||
fi
|
||||
}
|
||||
error_handler() {
|
||||
kill_ping
|
||||
echo ERROR: An error was encountered with the build.
|
||||
dump_output
|
||||
exit 1
|
||||
}
|
||||
# If an error occurs, run our error handler to output a tail of the build
|
||||
trap 'error_handler' ERR
|
||||
|
||||
# Set up a repeating loop to send some output to Travis.
|
||||
bash -c "while true; do echo \$(date) - building ...; sleep $PING_SLEEP; done" &
|
||||
PING_LOOP_PID=$!
|
||||
echo "$PING_LOOP_PID" > $PING_PID_FILE
|
||||
|
||||
# Run the build, redirect output into the file
|
||||
mvn site site:stage -Psite -B -V >> $BUILD_OUTPUT 2>&1
|
||||
|
||||
# The build finished without returning an error so dump a tail of the output
|
||||
dump_output
|
||||
|
||||
# nicely terminate the ping output loop
|
||||
kill_ping
|
||||
|
1
.travis/id_rsa.pub
Normal file
1
.travis/id_rsa.pub
Normal file
@ -0,0 +1 @@
|
||||
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC8yHVLHYDsKui8tYg/sFvkDqcs97pEZz0BzK9HtBF4O+/It1drRYRdUAFfjoImfprpKSxkJCTglHixGRp24eNaZ6woWVJ4/bmiMkEqEZAjr1NZ3qw7zIruMJMSkCV+YTtmL4cYcZlvMRPzzOZOnFbV05oi79oy41MUFHYjolK9QxMFNsVNN5iyzFxM3HqSFozz+ylKbFBtDk6ZHZQNRL/Xl2V9DJ69fVzjG4OZfcWNGmmKHHARmsnJyUOMeeKpLjDOe1M6ZdI8HkXWac8yCr9JTETNZZwemZAcS/RKoKCDqfIUOzkZfIPmyaznfVetTGsMi7yQrJhAyjznuNGF4+3lfgTcmRF8wz5FCeUkdYTmy2wNSFi5HiLPfC5OgRtjKzC6yb8rbRjDx6XQ2ph15PKOaXwzk49TaMc0xJvoiGDMZaTU0iTm3Y1/QUtfLvo3/jGMbtUdV3soWpuBAV2JUI4aB5xdLX9iNmcrVzoUe3y9DWuuTX46eoCvpUNXv/DXKhQw1D7xd7J67db5qUck/Akiqi0JR+e0SoBJvZFtYwVNLGC2bIJ/s8SR8X5Zp+1+ypf3WYjIylxQTkO1r4NfI0Cd9qXg7nmUrHAU7Z6xtJmUK8ZWzSST4wul8WkRJURtODLxt5firtlKhyZ93t9Mjuk6mATIPxr/b3x20T+IH463kw== ssh key for pmd. used for travis accessing sourceforge and github.
|
15
.travis/install-configure-maven.sh
Normal file
15
.travis/install-configure-maven.sh
Normal file
@ -0,0 +1,15 @@
|
||||
#!/bin/bash
|
||||
set -ev
|
||||
|
||||
# remember the current directory
|
||||
SOURCE_HOME=$PWD
|
||||
|
||||
cd $HOME
|
||||
wget -q http://www-us.apache.org/dist/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz
|
||||
tar zxf apache-maven-3.3.9-bin.tar.gz
|
||||
chmod +x apache-maven-3.3.9/bin/mvn
|
||||
|
||||
echo "MAVEN_OPTS='-Xms1g -Xmx1g'" > .mavenrc
|
||||
mkdir -p .m2
|
||||
cp $SOURCE_HOME/.travis/travis-toolchains.xml .m2/toolchains.xml
|
||||
cp $SOURCE_HOME/.travis/travis-settings.xml .m2/settings.xml
|
54
.travis/release.sh
Normal file
54
.travis/release.sh
Normal file
@ -0,0 +1,54 @@
|
||||
#!/bin/bash
|
||||
set -ev
|
||||
|
||||
RELEASE_VERSION=$(mvn -q -Dexec.executable="echo" -Dexec.args='${project.version}' --non-recursive org.codehaus.mojo:exec-maven-plugin:1.5.0:exec)
|
||||
|
||||
# Deploy to ossrh has already been done with the usual build. See build-push.sh
|
||||
|
||||
# The site has been built before, the files have already been uploaded to sourceforge.
|
||||
# Since this is a release, making the binary the new default file...
|
||||
curl -H "Accept: application/json" -X PUT -d "default=windows&default=mac&default=linux&default=bsd&default=solaris&default=others" \
|
||||
-d "api_key=${PMD_SF_APIKEY}" https://sourceforge.net/projects/pmd/files/pmd/${RELEASE_VERSION}/pmd-bin-${RELEASE_VERSION}.zip
|
||||
|
||||
|
||||
# Assumes, the release has already been created by travis github releases provider
|
||||
RELEASE_ID=$(curl -s -H "Authorization: token ${GITHUB_OAUTH_TOKEN}" https://api.github.com/repos/pmd/pmd/releases/tags/pmd_releases/${RELEASE_VERSION}|jq ".id")
|
||||
RELEASE_NAME="PMD ${RELEASE_VERSION} ($(date -u +%d-%B-%Y))"
|
||||
RELEASE_BODY=$(cat src/site/markdown/overview/changelog.md)
|
||||
RELEASE_BODY="${RELEASE_BODY//$'\\'/\\\\}"
|
||||
RELEASE_BODY="${RELEASE_BODY//$'\r'/}"
|
||||
RELEASE_BODY="${RELEASE_BODY//$'\n'/\\r\\n}"
|
||||
RELEASE_BODY="${RELEASE_BODY//$'"'/\\$'"'}"
|
||||
cat > release-edit-request.json <<EOF
|
||||
{
|
||||
"name": "$RELEASE_NAME",
|
||||
"body": "$RELEASE_BODY"
|
||||
}
|
||||
EOF
|
||||
echo "Updating release at https://api.github.com/repos/pmd/pmd/releases/${RELEASE_ID}..."
|
||||
RESPONSE=$(curl -i -s -H "Authorization: token ${GITHUB_OAUTH_TOKEN}" -H "Content-Type: application/json" --data-binary "@release-edit-request.json" -X PATCH https://api.github.com/repos/pmd/pmd/releases/${RELEASE_ID})
|
||||
if [[ "$RESPONSE" != *"HTTP/1.1 200"* ]]; then
|
||||
echo "$RESPONSE"
|
||||
else
|
||||
echo "Update OK"
|
||||
fi
|
||||
|
||||
|
||||
|
||||
echo "Adding the site to pmd.github.io..."
|
||||
# clone pmd.github.io. Note: This uses the ssh key setup earlier
|
||||
git clone --depth 1 git@github.com:pmd/pmd.github.io.git
|
||||
rsync -a target/pmd-doc-${RELEASE_VERSION}/ pmd.github.io/pmd-${RELEASE_VERSION}/
|
||||
(
|
||||
cd pmd.github.io
|
||||
git config user.email "adangel@users.sourceforge.net"
|
||||
git config user.name "Andreas Dangel (PMD Releases)"
|
||||
git add pmd-${RELEASE_VERSION}
|
||||
git commit -m "Added pmd-${RELEASE_VERSION}"
|
||||
git rm -qr latest
|
||||
cp -a pmd-${RELEASE_VERSION} latest
|
||||
git add latest
|
||||
git commit -m "Copying pmd-${RELEASE_VERSION} to latest"
|
||||
git push origin
|
||||
)
|
||||
|
BIN
.travis/secrets.tar.enc
Normal file
BIN
.travis/secrets.tar.enc
Normal file
Binary file not shown.
@ -9,13 +9,21 @@
|
||||
<pluginGroups/>
|
||||
<servers>
|
||||
<server>
|
||||
<id>sonatype-nexus-snapshots</id>
|
||||
<id>ossrh</id>
|
||||
<username>${env.CI_DEPLOY_USERNAME}</username>
|
||||
<password>${env.CI_DEPLOY_PASSWORD}</password>
|
||||
</server>
|
||||
</servers>
|
||||
<mirrors/>
|
||||
<proxies/>
|
||||
<profiles/>
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>ossrh</id>
|
||||
<properties>
|
||||
<gpg.keyname>${env.CI_SIGN_KEYNAME}</gpg.keyname>
|
||||
<gpg.passphrase>${env.CI_SIGN_PASSPHRASE}</gpg.passphrase>
|
||||
</properties>
|
||||
</profile>
|
||||
</profiles>
|
||||
<activeProfiles/>
|
||||
</settings>
|
||||
</settings>
|
34
.travis/travis-toolchains.xml
Normal file
34
.travis/travis-toolchains.xml
Normal file
@ -0,0 +1,34 @@
|
||||
<?xml version="1.0" encoding="UTF8"?>
|
||||
<toolchains>
|
||||
<!-- place this file in ${user.home}/.m2/toolchains.xml -->
|
||||
|
||||
<!-- see: https://github.com/travis-ci/travis-cookbooks/blob/master/cookbooks/travis_java/templates/ubuntu/jdk_switcher.sh.erb -->
|
||||
|
||||
<toolchain>
|
||||
<type>jdk</type>
|
||||
<provides>
|
||||
<version>1.6</version>
|
||||
</provides>
|
||||
<configuration>
|
||||
<jdkHome>/usr/lib/jvm/java-6-openjdk-amd64</jdkHome>
|
||||
</configuration>
|
||||
</toolchain>
|
||||
<toolchain>
|
||||
<type>jdk</type>
|
||||
<provides>
|
||||
<version>1.7</version>
|
||||
</provides>
|
||||
<configuration>
|
||||
<jdkHome>/usr/lib/jvm/java-7-openjdk-amd64</jdkHome>
|
||||
</configuration>
|
||||
</toolchain>
|
||||
<toolchain>
|
||||
<type>jdk</type>
|
||||
<provides>
|
||||
<version>1.8</version>
|
||||
</provides>
|
||||
<configuration>
|
||||
<jdkHome>/usr/lib/jvm/java-8-oracle</jdkHome>
|
||||
</configuration>
|
||||
</toolchain>
|
||||
</toolchains>
|
271
do-release.sh
271
do-release.sh
File diff suppressed because it is too large
Load Diff
@ -55,6 +55,7 @@ public class DBTypeTest {
|
||||
@After
|
||||
public void tearDown() throws Exception {
|
||||
testProperties = null;
|
||||
absoluteFile.delete();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -24,6 +24,9 @@
|
||||
<exclude>**/.pmd</exclude>
|
||||
<exclude>**/.ruleset</exclude>
|
||||
<exclude>**/.git</exclude>
|
||||
<exclude>**/.travis/secrets.tar</exclude>
|
||||
<exclude>**/.travis/id_rsa</exclude>
|
||||
<exclude>**/.travis/*.gpg</exclude>
|
||||
</excludes>
|
||||
<directoryMode>0755</directoryMode>
|
||||
<fileMode>0644</fileMode>
|
||||
|
@ -156,7 +156,7 @@ public class JspDocStyleTest extends AbstractJspNodesTst {
|
||||
}
|
||||
|
||||
/**
|
||||
* Test parsing of HTML <script> element.
|
||||
* Test parsing of HTML <script> element.
|
||||
*/
|
||||
@Test
|
||||
public void testHtmlScript() {
|
||||
@ -167,7 +167,7 @@ public class JspDocStyleTest extends AbstractJspNodesTst {
|
||||
}
|
||||
|
||||
/**
|
||||
* Test parsing of HTML <script src="x"/> element. It might not be valid html
|
||||
* Test parsing of HTML <script src="x"/> element. It might not be valid html
|
||||
* but it is likely to appear in .JSP files.
|
||||
*/
|
||||
@Test
|
||||
@ -180,7 +180,7 @@ public class JspDocStyleTest extends AbstractJspNodesTst {
|
||||
}
|
||||
|
||||
/**
|
||||
* Test parsing of HTML <script> element.
|
||||
* Test parsing of HTML <script> element.
|
||||
*/
|
||||
@Test
|
||||
public void testHtmlScriptWithAttribute() {
|
||||
@ -206,7 +206,7 @@ public class JspDocStyleTest extends AbstractJspNodesTst {
|
||||
}
|
||||
|
||||
/**
|
||||
* Test parsing of HTML <script> element.
|
||||
* Test parsing of HTML <script> element.
|
||||
*/
|
||||
@Test
|
||||
public void testInlineCss() {
|
||||
@ -319,7 +319,7 @@ public class JspDocStyleTest extends AbstractJspNodesTst {
|
||||
|
||||
|
||||
/**
|
||||
* A dangling unopened ( just </closed> ) tag should not influence the parsing.
|
||||
* A dangling unopened ( just </closed> ) tag should not influence the parsing.
|
||||
*/
|
||||
@Test
|
||||
@Ignore // sadly the number of
|
||||
@ -346,7 +346,7 @@ public class JspDocStyleTest extends AbstractJspNodesTst {
|
||||
|
||||
|
||||
/**
|
||||
* Test parsing of HTML <script> element.
|
||||
* Test parsing of HTML <script> element.
|
||||
*/
|
||||
@Test
|
||||
public void textAfterOpenAndClosedTag() {
|
||||
@ -418,7 +418,7 @@ public class JspDocStyleTest extends AbstractJspNodesTst {
|
||||
}
|
||||
|
||||
/**
|
||||
* tests whether parse correctly detects presence of JSP expression <%= %>
|
||||
* tests whether parse correctly detects presence of JSP expression <%= %>
|
||||
* within an non-quoted attribute value
|
||||
*/
|
||||
@Test
|
||||
@ -478,7 +478,7 @@ public class JspDocStyleTest extends AbstractJspNodesTst {
|
||||
}
|
||||
|
||||
/**
|
||||
* tests whether parse does not fail in the presence of unclosed JSP expression <%=
|
||||
* tests whether parse does not fail in the presence of unclosed JSP expression <%=
|
||||
* within an non-quoted attribute value
|
||||
*/
|
||||
@Test
|
||||
@ -490,7 +490,7 @@ public class JspDocStyleTest extends AbstractJspNodesTst {
|
||||
}
|
||||
|
||||
/**
|
||||
* test a no quote attribute value which contains a scriptlet <% %>
|
||||
* test a no quote attribute value which contains a scriptlet <% %>
|
||||
* within its value
|
||||
*/
|
||||
@Test
|
||||
@ -504,7 +504,7 @@ public class JspDocStyleTest extends AbstractJspNodesTst {
|
||||
}
|
||||
|
||||
/**
|
||||
* test a no quote attribute value can contain a tag (e.g. attr=<bean:write property="value" />)
|
||||
* test a no quote attribute value can contain a tag (e.g. attr=<bean:write property="value" />)
|
||||
*
|
||||
*/
|
||||
@Test
|
||||
@ -518,7 +518,7 @@ public class JspDocStyleTest extends AbstractJspNodesTst {
|
||||
}
|
||||
|
||||
/**
|
||||
* test a quote attribute value can contain a tag (e.g. attr="<bean:write property="value" />" )
|
||||
* test a quote attribute value can contain a tag (e.g. attr="<bean:write property="value" />" )
|
||||
* Not sure if it's legal JSP code but most JSP engine accept and properly treat
|
||||
* this value at runtime
|
||||
*/
|
||||
@ -615,7 +615,7 @@ public class JspDocStyleTest extends AbstractJspNodesTst {
|
||||
}
|
||||
|
||||
/**
|
||||
* <html> <a1> <a2/> <b/> </a1> </html>
|
||||
* <html> <a1> <a2/> <b/> </a1> </html>
|
||||
*/
|
||||
@Test
|
||||
public void nestedEmptyTags(){
|
||||
@ -651,7 +651,7 @@ public class JspDocStyleTest extends AbstractJspNodesTst {
|
||||
}
|
||||
|
||||
/**
|
||||
* <html> <a1> <a2> <a3> </a2> </a1> <b/> <a4/> </html>
|
||||
* <html> <a1> <a2> <a3> </a2> </a1> <b/> <a4/> </html>
|
||||
*/
|
||||
@Test
|
||||
public void nestedMultipleTags(){
|
||||
@ -699,8 +699,8 @@ public class JspDocStyleTest extends AbstractJspNodesTst {
|
||||
}
|
||||
|
||||
/**
|
||||
* will test <x> <a> <b> <b> </x> </a> </x> .
|
||||
* Here x is the first tag to be closed thus rendering the next close of a (</a>)
|
||||
* will test <x> <a> <b> <b> </x> </a> </x> .
|
||||
* Here x is the first tag to be closed thus rendering the next close of a (</a>)
|
||||
* to be disregarded.
|
||||
*/
|
||||
@Test
|
||||
@ -737,11 +737,11 @@ public class JspDocStyleTest extends AbstractJspNodesTst {
|
||||
|
||||
|
||||
/**
|
||||
* <x> <a> <b> <b> </z> </a> </x>
|
||||
* <x> <a> <b> <b> </z> </a> </x>
|
||||
* An unmatched closing of 'z' appears randomly in the document. This
|
||||
* should be disregarded and structure of children and parents should not be influenced.
|
||||
* in other words </a> should close the first <a> tag , </x> should close the first
|
||||
* <x>, etc.
|
||||
* in other words </a> should close the first <a> tag , </x> should close the first
|
||||
* <x>, etc.
|
||||
*/
|
||||
@Test
|
||||
public void unmatchedTagDoesNotInfluenceStructure(){
|
||||
@ -776,10 +776,10 @@ public class JspDocStyleTest extends AbstractJspNodesTst {
|
||||
}
|
||||
|
||||
/**
|
||||
* <a> <x> <a> <b> <b> </z> </a> </x>
|
||||
* <a> <x> <a> <b> <b> </z> </a> </x>
|
||||
* An unmatched closing of 'z' appears randomly in the document. This
|
||||
* should be disregarded and structure of children and parents should not be influenced.
|
||||
* Also un unclosed <a> tag appears at the start of the document
|
||||
* Also un unclosed <a> tag appears at the start of the document
|
||||
*/
|
||||
@Test
|
||||
public void unclosedStartTagWithUnmatchedCloseOfDifferentTag(){
|
||||
@ -821,7 +821,7 @@ public class JspDocStyleTest extends AbstractJspNodesTst {
|
||||
|
||||
/**
|
||||
* {@link #TEST_UNCLOSED_END_OF_DOC}
|
||||
* <tag:x> <tag:y>
|
||||
* <tag:x> <tag:y>
|
||||
* Tests whether parser breaks on no closed tags at all
|
||||
*/
|
||||
//This is yet to be improved. If a closing tag does not
|
||||
@ -1036,21 +1036,21 @@ public class JspDocStyleTest extends AbstractJspNodesTst {
|
||||
"<html> <a1> <a2> <a3> </a2> </a1> <b/> <a4/> </html>";
|
||||
|
||||
/**
|
||||
* </x> will close before </a>, thus leaving <a> to remain unclosed
|
||||
* </x> will close before </a>, thus leaving <a> to remain unclosed
|
||||
*/
|
||||
private static final String TEST_UNCLOSED_END_AFTER_PARENT_CLOSE =
|
||||
"<x> <a> <b> <b> </x> </a> aa </x> bb </x>";
|
||||
|
||||
/**
|
||||
* </z> is just a dangling closing tag not matching any parent. The parser should
|
||||
* </z> is just a dangling closing tag not matching any parent. The parser should
|
||||
* disregard it
|
||||
*/
|
||||
private static final String TEST_UNCLOSED_UNMATCHED_CLOSING_TAG =
|
||||
"<x> <a> <b> <b> </z> </a> </x>";
|
||||
|
||||
/**
|
||||
* First <a> tag does not close. The first closing of </a> will match the
|
||||
* second opening of a. Another rogue </z> is there for testing compliance
|
||||
* First <a> tag does not close. The first closing of </a> will match the
|
||||
* second opening of a. Another rogue </z> is there for testing compliance
|
||||
*/
|
||||
private static final String TEST_UNCLOSED_START_TAG_WITH_UNMATCHED_CLOSE =
|
||||
"<a> <x> <a> <b> <b> </z> </a> </x>";
|
||||
|
52
pom.xml
52
pom.xml
@ -7,13 +7,6 @@
|
||||
<packaging>pom</packaging>
|
||||
<name>PMD</name>
|
||||
|
||||
<parent>
|
||||
<groupId>org.sonatype.oss</groupId>
|
||||
<artifactId>oss-parent</artifactId>
|
||||
<version>7</version>
|
||||
<relativePath />
|
||||
</parent>
|
||||
|
||||
<description>
|
||||
PMD is a source code analyzer. It finds common programming flaws like unused variables, empty catch blocks, unnecessary object creation, and so forth. It supports Java, JavaScript, Salesforce.com Apex, PLSQL, Apache Velocity, XML, XSL.
|
||||
|
||||
@ -244,6 +237,14 @@ Additionally it includes CPD, the copy-paste-detector. CPD finds duplicated code
|
||||
<tag>HEAD</tag>
|
||||
</scm>
|
||||
<distributionManagement>
|
||||
<snapshotRepository>
|
||||
<id>ossrh</id>
|
||||
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
|
||||
</snapshotRepository>
|
||||
<repository>
|
||||
<id>ossrh</id>
|
||||
<url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
|
||||
</repository>
|
||||
<site>
|
||||
<id>local</id>
|
||||
<url>file:///tmp/pmd-site</url>
|
||||
@ -336,7 +337,7 @@ Additionally it includes CPD, the copy-paste-detector. CPD finds duplicated code
|
||||
<version>2.5.2</version>
|
||||
<configuration>
|
||||
<releaseProfiles>pmd-release</releaseProfiles>
|
||||
<pushChanges>false</pushChanges>
|
||||
<pushChanges>true</pushChanges>
|
||||
<localCheckout>true</localCheckout>
|
||||
<autoVersionSubmodules>true</autoVersionSubmodules>
|
||||
<tagNameFormat>pmd_releases/@{project.version}</tagNameFormat>
|
||||
@ -476,6 +477,11 @@ Additionally it includes CPD, the copy-paste-detector. CPD finds duplicated code
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.sonatype.plugins</groupId>
|
||||
<artifactId>nexus-staging-maven-plugin</artifactId>
|
||||
<version>1.6.8</version>
|
||||
</plugin>
|
||||
<!--This plugin's configuration is used to store Eclipse
|
||||
m2e settings only. It has no influence on the Maven build itself. -->
|
||||
<plugin>
|
||||
@ -625,6 +631,18 @@ Additionally it includes CPD, the copy-paste-detector. CPD finds duplicated code
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.sonatype.plugins</groupId>
|
||||
<artifactId>nexus-staging-maven-plugin</artifactId>
|
||||
<extensions>true</extensions>
|
||||
<configuration>
|
||||
<serverId>ossrh</serverId>
|
||||
<nexusUrl>https://oss.sonatype.org/</nexusUrl>
|
||||
<!-- if autoReleaseAfterClose is true, then the artifacts will be
|
||||
automatically promoted to maven central -->
|
||||
<autoReleaseAfterClose>true</autoReleaseAfterClose>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
@ -916,6 +934,24 @@ Additionally it includes CPD, the copy-paste-detector. CPD finds duplicated code
|
||||
<properties>
|
||||
<pmd.website.baseurl>https://pmd.github.io/pmd-${project.version}/${project.artifactId}</pmd.website.baseurl>
|
||||
</properties>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-gpg-plugin</artifactId>
|
||||
<version>1.6</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>sign-artifacts</id>
|
||||
<phase>verify</phase>
|
||||
<goals>
|
||||
<goal>sign</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
|
||||
<profile>
|
||||
|
@ -524,6 +524,56 @@ you'll need a java8 runtime environment.
|
||||
* [#1492](https://sourceforge.net/p/pmd/bugs/1492/): \[core] PMD CLI: IncompatibleClassChangeError when running PMD
|
||||
|
||||
|
||||
## 25-Februar-2017 - 5.4.5
|
||||
|
||||
The PMD team is pleased to announce PMD 5.4.5
|
||||
|
||||
This is a bug fixing release.
|
||||
|
||||
### Table Of Contents
|
||||
|
||||
* [New and noteworthy](#New_and_noteworthy)
|
||||
* [Modified Rules](#Modified_Rules)
|
||||
* [Fixed Issues](#Fixed_Issues)
|
||||
* [External Contributions](#External_Contributions)
|
||||
|
||||
### New and noteworthy
|
||||
|
||||
#### Modified Rules
|
||||
|
||||
* The Java rule `UnusedModifier` (ruleset java-unusedcode) has been expanded to consider more redundant modifiers.
|
||||
* Annotations marked as `abstract`.
|
||||
* Nested annotations marked as `static`.
|
||||
* Nested annotations within another interface or annotation marked as `public`.
|
||||
* Classes, interfaces or annotations nested within an annotation marked as `public` or `static`.
|
||||
* Nested enums marked as `static`.
|
||||
|
||||
### Fixed Issues
|
||||
|
||||
* general
|
||||
* [#234](https://github.com/pmd/pmd/issues/234): \[core] Zip file stream closes spuriously when loading rulesets
|
||||
* [#256](https://github.com/pmd/pmd/issues/256): \[core] shortnames option is broken with relative paths
|
||||
* java-basic
|
||||
* [#232](https://github.com/pmd/pmd/issues/232): \[java] SimplifiedTernary: Incorrect ternary operation can be simplified.
|
||||
* java-coupling
|
||||
* [#270](https://github.com/pmd/pmd/issues/270): \[java] LoD false positive
|
||||
* java-design
|
||||
* [#216](https://github.com/pmd/pmd/issues/216): \[java] \[doc] NonThreadSafeSingleton: Be more explicit as to why double checked locking is not recommended
|
||||
* [#219](https://github.com/pmd/pmd/issues/219): \[java] UnnecessaryLocalBeforeReturn: ClassCastException in switch case with local variable returned
|
||||
* java-optimizations
|
||||
* [#215](https://github.com/pmd/pmd/issues/215): \[java] RedundantFieldInitializer report for annotation field not explicitly marked as final
|
||||
* java-unusedcode
|
||||
* [#246](https://github.com/pmd/pmd/issues/246): \[java] UnusedModifier doesn't check annotations
|
||||
* [#247](https://github.com/pmd/pmd/issues/247): \[java] UnusedModifier doesn't check annotations inner classes
|
||||
* [#248](https://github.com/pmd/pmd/issues/248): \[java] UnusedModifier doesn't check static keyword on nested enum declaration
|
||||
* [#257](https://github.com/pmd/pmd/issues/257): \[java] UnusedLocalVariable false positive
|
||||
|
||||
|
||||
### External Contributions
|
||||
|
||||
* [#266](https://github.com/pmd/pmd/pull/266): \[java] corrected invalid reporting of LoD violation
|
||||
|
||||
|
||||
## 28-January-2017 - 5.4.4
|
||||
|
||||
The PMD team is pleased to announce PMD 5.4.4
|
||||
|
Reference in New Issue
Block a user