From d8dc8ccdb4c76fb39666c65e7a5ef99adbb5728c Mon Sep 17 00:00:00 2001 From: JosephEarl Date: Sat, 12 Dec 2015 17:11:47 +0000 Subject: [PATCH] Add FindBugs failOnError setting --- readme.md => README.md | 5 +++ build.sbt | 2 +- project/scripted.sbt | 3 ++ scripted.sbt | 7 ++++ .../de/johoop/findbugs4sbt/CommandLine.scala | 2 +- .../de/johoop/findbugs4sbt/FindBugs.scala | 33 +++++++++++++++---- .../de/johoop/findbugs4sbt/Settings.scala | 16 +++++---- src/sbt-test/findbugs/findbugs-fail/build.sbt | 13 ++++++++ .../findbugs-fail/project/plugins.sbt | 7 ++++ .../de/johoop/findbugs4sbt/TestClass.java | 26 +++++++++++++++ src/sbt-test/findbugs/findbugs-fail/test | 3 ++ src/sbt-test/findbugs/findbugs/build.sbt | 11 +++++++ .../findbugs/findbugs/project/plugins.sbt | 7 ++++ .../de/johoop/findbugs4sbt/TestClass.java | 26 +++++++++++++++ src/sbt-test/findbugs/findbugs/test | 3 ++ 15 files changed, 150 insertions(+), 14 deletions(-) rename readme.md => README.md (96%) create mode 100644 project/scripted.sbt create mode 100644 scripted.sbt create mode 100755 src/sbt-test/findbugs/findbugs-fail/build.sbt create mode 100755 src/sbt-test/findbugs/findbugs-fail/project/plugins.sbt create mode 100644 src/sbt-test/findbugs/findbugs-fail/src/main/java/de/johoop/findbugs4sbt/TestClass.java create mode 100755 src/sbt-test/findbugs/findbugs-fail/test create mode 100644 src/sbt-test/findbugs/findbugs/build.sbt create mode 100644 src/sbt-test/findbugs/findbugs/project/plugins.sbt create mode 100644 src/sbt-test/findbugs/findbugs/src/main/java/de/johoop/findbugs4sbt/TestClass.java create mode 100644 src/sbt-test/findbugs/findbugs/test diff --git a/readme.md b/README.md similarity index 96% rename from readme.md rename to README.md index da71f38..b07ea95 100644 --- a/readme.md +++ b/README.md @@ -111,6 +111,11 @@ findbugsIncludeFilters := { * *Accepts:* `true` and `false` * *Default:* `false` +### `findbugsFailOnError` +* *Description:* Whether the build should be failed if there are any reported bug instances. +* *Accepts:* `true` and `false` +* *Default:* `false` + ### `findbugsIncludeFilters` * *Description:* Optional filter file XML content defining which bug instances to include in the static analysis. * *Accepts:* `None` and `Option[Node]` diff --git a/build.sbt b/build.sbt index d0b11b1..6b5f71d 100644 --- a/build.sbt +++ b/build.sbt @@ -4,7 +4,7 @@ name := "findbugs4sbt" organization := "de.johoop" -version := "1.4.0" +version := "1.4.1-SNAPSHOT" scalaVersion := "2.10.3" diff --git a/project/scripted.sbt b/project/scripted.sbt new file mode 100644 index 0000000..ab6e0ec --- /dev/null +++ b/project/scripted.sbt @@ -0,0 +1,3 @@ +libraryDependencies <+= (sbtVersion) { sv => + "org.scala-sbt" % "scripted-plugin" % sv +} diff --git a/scripted.sbt b/scripted.sbt new file mode 100644 index 0000000..729b813 --- /dev/null +++ b/scripted.sbt @@ -0,0 +1,7 @@ +ScriptedPlugin.scriptedSettings + +scriptedLaunchOpts := { scriptedLaunchOpts.value ++ + Seq("-Xmx1024M", "-XX:MaxPermSize=256M", "-Dplugin.version=" + version.value) +} + +scriptedBufferLog := false diff --git a/src/main/scala/de/johoop/findbugs4sbt/CommandLine.scala b/src/main/scala/de/johoop/findbugs4sbt/CommandLine.scala index 2ded8b3..405f16c 100644 --- a/src/main/scala/de/johoop/findbugs4sbt/CommandLine.scala +++ b/src/main/scala/de/johoop/findbugs4sbt/CommandLine.scala @@ -40,7 +40,7 @@ private[findbugs4sbt] trait CommandLine extends Plugin with Filters with Setting def findbugsCallArguments = paths.analyzedPath map (_.getPath) def findbugsCallOptions = { - if (paths.reportPath.isDefined && ! misc.reportType.isDefined) + if (paths.reportPath.isDefined && misc.reportType.isEmpty) sys.error("If a report path is defined, a report type is required!") val auxClasspath = paths.auxPath ++ (findbugsClasspath.files filter (_.getName startsWith "jsr305")) diff --git a/src/main/scala/de/johoop/findbugs4sbt/FindBugs.scala b/src/main/scala/de/johoop/findbugs4sbt/FindBugs.scala index 9603ba6..ab32413 100644 --- a/src/main/scala/de/johoop/findbugs4sbt/FindBugs.scala +++ b/src/main/scala/de/johoop/findbugs4sbt/FindBugs.scala @@ -12,19 +12,40 @@ package de.johoop.findbugs4sbt import sbt._ -import Keys._ +import sbt.Keys._ -object FindBugs extends Plugin +object FindBugs extends Plugin with Settings with CommandLine with CommandLineExecutor { - override def findbugsTask(findbugsClasspath: Classpath, compileClasspath: Classpath, - paths: PathSettings, filters: FilterSettings, misc: MiscSettings, javaHome: Option[File], + override def findbugsTask(findbugsClasspath: Classpath, compileClasspath: Classpath, + paths: PathSettings, filters: FilterSettings, misc: MiscSettings, javaHome: Option[File], streams: TaskStreams): Unit = { + val log = streams.log + IO.withTemporaryDirectory { filterPath => val cmd = commandLine(findbugsClasspath, compileClasspath, paths, filters, filterPath, misc, streams) - streams.log.debug("FindBugs command line to execute: \"%s\"" format (cmd mkString " ")) - executeCommandLine(cmd, javaHome, streams.log) + log.debug("FindBugs command line to execute: \"%s\"" format (cmd mkString " ")) + executeCommandLine(cmd, javaHome, log) } + + paths.reportPath foreach(f => { + val warnings = { + val resultFile = paths.reportPath.get + val results = scala.xml.XML.loadFile(resultFile) + results \\ "BugCollection" \\ "BugInstance" + } + + if (warnings.nonEmpty) { + val message = s"FindBugs found ${warnings.size} issues" + if (misc.failOnError) { + sys.error(message) + } else { + log.info(message) + } + } else { + log.info("No issues from findbugs") + } + }) } } diff --git a/src/main/scala/de/johoop/findbugs4sbt/Settings.scala b/src/main/scala/de/johoop/findbugs4sbt/Settings.scala index a61ad8d..4be3c5a 100644 --- a/src/main/scala/de/johoop/findbugs4sbt/Settings.scala +++ b/src/main/scala/de/johoop/findbugs4sbt/Settings.scala @@ -30,7 +30,7 @@ private[findbugs4sbt] case class MiscSettings( reportType: Option[ReportType], priority: Priority, onlyAnalyze: Option[Seq[String]], maxMemory: Int, analyzeNestedArchives: Boolean, sortReportByClassNames: Boolean, - effort: Effort) + effort: Effort, failOnError: Boolean) private[findbugs4sbt] trait Settings extends Plugin { @@ -71,6 +71,9 @@ private[findbugs4sbt] trait Settings extends Plugin { /** Whether the reported bug instances should be sorted by class name or not. Defaults to false.*/ val findbugsSortReportByClassNames = SettingKey[Boolean]("findbugs-sort-report-by-class-names") + /** Whether to fail the build if errors are found. Defaults to false.*/ + val findbugsFailOnError = SettingKey[Boolean]("findbugs-fail-on-error") + /** Optional filter file XML content defining which bug instances to include in the static analysis. * None by default. */ val findbugsIncludeFilters = TaskKey[Option[Node]]("findbugs-include-filter") @@ -79,7 +82,7 @@ private[findbugs4sbt] trait Settings extends Plugin { * None by default. */ val findbugsExcludeFilters = TaskKey[Option[Node]]("findbugs-exclude-filter") - protected def findbugsTask(findbugsClasspath: Classpath, compileClasspath: Classpath, + protected def findbugsTask(findbugsClasspath: Classpath, compileClasspath: Classpath, paths: PathSettings, filters: FilterSettings, misc: MiscSettings, javaHome: Option[File], streams: TaskStreams): Unit @@ -91,14 +94,14 @@ private[findbugs4sbt] trait Settings extends Plugin { "com.google.code.findbugs" % "findbugs" % "3.0.0" % "findbugs->default", "com.google.code.findbugs" % "jsr305" % "3.0.0" % "findbugs->default" ), - + findbugs <<= (findbugsClasspath, managedClasspath in Compile, findbugsPathSettings, findbugsFilterSettings, findbugsMiscSettings, javaHome, streams) map findbugsTask, - + findbugsPathSettings <<= (findbugsReportPath, findbugsAnalyzedPath, findbugsAuxiliaryPath) map PathSettings dependsOn (compile in Compile), findbugsFilterSettings <<= (findbugsIncludeFilters, findbugsExcludeFilters) map FilterSettings, - findbugsMiscSettings <<= (findbugsReportType, findbugsPriority, findbugsOnlyAnalyze, findbugsMaxMemory, - findbugsAnalyzeNestedArchives, findbugsSortReportByClassNames, findbugsEffort) map MiscSettings, + findbugsMiscSettings <<= (findbugsReportType, findbugsPriority, findbugsOnlyAnalyze, findbugsMaxMemory, + findbugsAnalyzeNestedArchives, findbugsSortReportByClassNames, findbugsEffort, findbugsFailOnError) map MiscSettings, findbugsClasspath := Classpaths managedJars (findbugsConfig, classpathTypes value, update value), @@ -109,6 +112,7 @@ private[findbugs4sbt] trait Settings extends Plugin { findbugsMaxMemory := 1024, findbugsAnalyzeNestedArchives := true, findbugsSortReportByClassNames := false, + findbugsFailOnError := false, findbugsAnalyzedPath := Seq(classDirectory in Compile value), findbugsAuxiliaryPath := (dependencyClasspath in Compile).value.files, findbugsOnlyAnalyze := None, diff --git a/src/sbt-test/findbugs/findbugs-fail/build.sbt b/src/sbt-test/findbugs/findbugs-fail/build.sbt new file mode 100755 index 0000000..a6fdc71 --- /dev/null +++ b/src/sbt-test/findbugs/findbugs-fail/build.sbt @@ -0,0 +1,13 @@ +import de.johoop.findbugs4sbt.FindBugs + +name := "findbugs-fail" + +organization := "de.johoop" + +version := "1.4.1-SNAPSHOT" + +FindBugs.findbugsSettings + +FindBugs.findbugsFailOnError := true + +FindBugs.findbugsReportPath := Some(target.value / "findbugs" / "report.xml") diff --git a/src/sbt-test/findbugs/findbugs-fail/project/plugins.sbt b/src/sbt-test/findbugs/findbugs-fail/project/plugins.sbt new file mode 100755 index 0000000..d870c88 --- /dev/null +++ b/src/sbt-test/findbugs/findbugs-fail/project/plugins.sbt @@ -0,0 +1,7 @@ +{ + val pluginVersion = System.getProperty("plugin.version") + if(pluginVersion == null) + throw new RuntimeException("""|The system property 'plugin.version' is not defined. + |Specify this property using the scriptedLaunchOpts -D.""".stripMargin) + else addSbtPlugin("de.johoop" % "findbugs4sbt" % pluginVersion) +} diff --git a/src/sbt-test/findbugs/findbugs-fail/src/main/java/de/johoop/findbugs4sbt/TestClass.java b/src/sbt-test/findbugs/findbugs-fail/src/main/java/de/johoop/findbugs4sbt/TestClass.java new file mode 100644 index 0000000..b6909b0 --- /dev/null +++ b/src/sbt-test/findbugs/findbugs-fail/src/main/java/de/johoop/findbugs4sbt/TestClass.java @@ -0,0 +1,26 @@ +package de.johoop.findbugs4sbt; + +import java.util.List; + +public class TestClass { + + private List strings; + private int n; + + public TestClass(int n) { + this.n = n; + } + + public static void main(String[] args) { + System.out.println("Hello, world!"); + } + + public List getStrings() { + return strings; + } + + public void setN(int n) { + n = n; + } + +} diff --git a/src/sbt-test/findbugs/findbugs-fail/test b/src/sbt-test/findbugs/findbugs-fail/test new file mode 100755 index 0000000..9c28467 --- /dev/null +++ b/src/sbt-test/findbugs/findbugs-fail/test @@ -0,0 +1,3 @@ +# Check the build fails when running findbugs +-> compile:findbugs +$ exists target/findbugs/report.xml diff --git a/src/sbt-test/findbugs/findbugs/build.sbt b/src/sbt-test/findbugs/findbugs/build.sbt new file mode 100644 index 0000000..a7a9cfc --- /dev/null +++ b/src/sbt-test/findbugs/findbugs/build.sbt @@ -0,0 +1,11 @@ +import de.johoop.findbugs4sbt.FindBugs + +name := "findbugs" + +organization := "de.johoop" + +version := "1.4.1-SNAPSHOT" + +FindBugs.findbugsSettings + +FindBugs.findbugsReportPath := Some(target.value / "findbugs" / "my-findbugs-report.xml") diff --git a/src/sbt-test/findbugs/findbugs/project/plugins.sbt b/src/sbt-test/findbugs/findbugs/project/plugins.sbt new file mode 100644 index 0000000..d870c88 --- /dev/null +++ b/src/sbt-test/findbugs/findbugs/project/plugins.sbt @@ -0,0 +1,7 @@ +{ + val pluginVersion = System.getProperty("plugin.version") + if(pluginVersion == null) + throw new RuntimeException("""|The system property 'plugin.version' is not defined. + |Specify this property using the scriptedLaunchOpts -D.""".stripMargin) + else addSbtPlugin("de.johoop" % "findbugs4sbt" % pluginVersion) +} diff --git a/src/sbt-test/findbugs/findbugs/src/main/java/de/johoop/findbugs4sbt/TestClass.java b/src/sbt-test/findbugs/findbugs/src/main/java/de/johoop/findbugs4sbt/TestClass.java new file mode 100644 index 0000000..b6909b0 --- /dev/null +++ b/src/sbt-test/findbugs/findbugs/src/main/java/de/johoop/findbugs4sbt/TestClass.java @@ -0,0 +1,26 @@ +package de.johoop.findbugs4sbt; + +import java.util.List; + +public class TestClass { + + private List strings; + private int n; + + public TestClass(int n) { + this.n = n; + } + + public static void main(String[] args) { + System.out.println("Hello, world!"); + } + + public List getStrings() { + return strings; + } + + public void setN(int n) { + n = n; + } + +} diff --git a/src/sbt-test/findbugs/findbugs/test b/src/sbt-test/findbugs/findbugs/test new file mode 100644 index 0000000..cab7e50 --- /dev/null +++ b/src/sbt-test/findbugs/findbugs/test @@ -0,0 +1,3 @@ +# Check that the findbugs report is created +> compile:findbugs +$ exists target/findbugs/my-findbugs-report.xml