/* * Copyright (C) 2009-2019 Lightbend Inc. */ package akka import sbt._ import sbtunidoc.BaseUnidocPlugin.autoImport.{unidoc, unidocProjectFilter} import sbtunidoc.JavaUnidocPlugin.autoImport.JavaUnidoc import sbtunidoc.ScalaUnidocPlugin.autoImport.ScalaUnidoc import sbtunidoc.GenJavadocPlugin.autoImport._ import sbt.Keys._ import sbt.File import scala.annotation.tailrec import sbt.ScopeFilter.ProjectFilter object Scaladoc extends AutoPlugin { object CliOptions { val scaladocDiagramsEnabled = CliOption("akka.scaladoc.diagrams", true) val scaladocAutoAPI = CliOption("akka.scaladoc.autoapi", true) } override def trigger = allRequirements override def requires = plugins.JvmPlugin val validateDiagrams = settingKey[Boolean]("Validate generated scaladoc diagrams") override lazy val projectSettings = { inTask(doc)(Seq( scalacOptions in Compile ++= scaladocOptions(version.value, (baseDirectory in ThisBuild).value), // -release caused build failures when generating javadoc: scalacOptions in Compile --= Seq("-release", "8"), autoAPIMappings := CliOptions.scaladocAutoAPI.get)) ++ Seq(validateDiagrams in Compile := true) ++ CliOptions.scaladocDiagramsEnabled.ifTrue(doc in Compile := { val docs = (doc in Compile).value if ((validateDiagrams in Compile).value) scaladocVerifier(docs) docs }) } def scaladocOptions(ver: String, base: File): List[String] = { val urlString = GitHub.url(ver) + "/€{FILE_PATH}.scala" val opts = List("-implicits", "-groups", "-doc-source-url", urlString, "-sourcepath", base.getAbsolutePath) CliOptions.scaladocDiagramsEnabled.ifTrue("-diagrams").toList ::: opts } def scaladocVerifier(file: File): File = { @tailrec def findHTMLFileWithDiagram(dirs: Seq[File]): Boolean = { if (dirs.isEmpty) false else { val curr = dirs.head val (newDirs, files) = curr.listFiles.partition(_.isDirectory) val rest = dirs.tail ++ newDirs val hasDiagram = files exists { f ⇒ val name = f.getName if (name.endsWith(".html") && !name.startsWith("index-") && !name.equals("index.html") && !name.equals("package.html")) { val source = scala.io.Source.fromFile(f)(scala.io.Codec.UTF8) val hd = try source.getLines().exists(lines => lines.contains("
") || lines.contains("