diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9935252..09f412a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,14 +12,17 @@ jobs: strategy: matrix: include: - - scala-version: '2.12.20' - sbt-version: '1.5.5' + - scala-version: '2.12.x' java-version: 8 - - scala-version: '2.12.20' - sbt-version: '1.5.5' + - scala-version: '3.x' + java-version: 8 + - scala-version: '2.12.x' + java-version: 11 + - scala-version: '3.x' java-version: 11 - - scala-version: '2.12.20' - sbt-version: '1.5.5' + - scala-version: '2.12.x' + java-version: 17 + - scala-version: '3.x' java-version: 17 steps: @@ -35,4 +38,4 @@ jobs: env: SCALA_VERSION: ${{ matrix.scala-version }} SBT_VERSION: ${{ matrix.sbt-version }} - run: sbt "++${SCALA_VERSION} ; ^^${SBT_VERSION} ; test ; scripted" + run: sbt "++${SCALA_VERSION} ; test ; scripted" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index cc90737..5231e4d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,7 +1,7 @@ name: Release on: push: - tags: ["*"] + tags: ["**"] jobs: publish: runs-on: ubuntu-20.04 diff --git a/build.sbt b/build.sbt index f8d7d63..4819aa0 100644 --- a/build.sbt +++ b/build.sbt @@ -1,4 +1,7 @@ -ThisBuild / scalaVersion := "2.12.20" +lazy val scala212 = "2.12.20" +lazy val scala3 = "3.7.2" +ThisBuild / crossScalaVersions := Seq(scala212, scala3) +ThisBuild / scalaVersion := scala212 ThisBuild / version := { val orig = (ThisBuild / version).value if (orig.endsWith("-SNAPSHOT")) "0.5.0-SNAPSHOT" @@ -11,16 +14,26 @@ lazy val root = (project in file(".")) name := "sbt-unidoc", scriptedLaunchOpts ++= Seq("-Xmx1024M", "-Dplugin.version=" + version.value), scriptedBufferLog := false, - // sbt-unidoc requires sbt 1.5.0 and up - pluginCrossBuild / sbtVersion := "1.5.0", + (pluginCrossBuild / sbtVersion) := { + scalaBinaryVersion.value match { + case "2.12" => "1.5.8" + case _ => "2.0.0-RC3" + } + }, + scriptedSbt := { + scalaBinaryVersion.value match { + case "2.12" => "1.11.4" + case _ => (pluginCrossBuild / sbtVersion).value + } + }, ) Global / onChangedBuildSource := ReloadOnSourceChanges ThisBuild / description := "sbt plugin to create a unified API document across projects" ThisBuild / organization := "com.github.sbt" ThisBuild / homepage := Some(url("https://github.com/sbt/sbt-unidoc")) -ThisBuild / Compile / scalacOptions := Seq("-feature", "-deprecation", "-Xlint") -ThisBuild / licenses := List("Apache License v2" -> url("http://www.apache.org/licenses/LICENSE-2.0.html")) +ThisBuild / Compile / scalacOptions ++= Seq("-feature", "-deprecation", "-Xlint") +ThisBuild / licenses := List(License.Apache2) ThisBuild / developers := List( Developer( "eed3si9n", @@ -29,17 +42,8 @@ ThisBuild / developers := List( url("https://github.com/eed3si9n") ) ) -ThisBuild / pomIncludeRepository := { _ => - false -} -ThisBuild / publishTo := { - val nexus = "https://oss.sonatype.org/" - if (isSnapshot.value) Some("snapshots" at nexus + "content/repositories/snapshots") - else Some("releases" at nexus + "service/local/staging/deploy/maven2") -} -ThisBuild / publishMavenStyle := true ThisBuild / dynverSonatypeSnapshots := true -scalacOptions ++= { +Compile / scalacOptions ++= { // https://github.com/sbt/sbt/issues/8220 if (scalaBinaryVersion.value == "2.12") Seq("-Wconf:cat=unused-nowarn:s") diff --git a/project/build.properties b/project/build.properties index 3aac321..489e0a7 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=2.0.0-RC3 +sbt.version=1.11.4 diff --git a/src/main/scala-2.12/PluginCompat.scala b/src/main/scala-2.12/PluginCompat.scala new file mode 100644 index 0000000..0d78f52 --- /dev/null +++ b/src/main/scala-2.12/PluginCompat.scala @@ -0,0 +1,20 @@ +package sbtunidoc + +import sbt.* +import java.io.File +import java.nio.file.{ Path => NioPath } +import xsbti.{ FileConverter } + +object PluginCompat { + type URI = java.net.URL + type FileRef = java.io.File + def getName(file: FileRef): String = file.getName() + def toFile(file: FileRef): java.io.File = file + def toNioPath(a: Attributed[File])(implicit conv: FileConverter): NioPath = + a.data.toPath() + + // This adds `Def.uncached(...)` + implicit class DefOp(singleton: Def.type) { + def uncached[A1](a: A1): A1 = a + } +} diff --git a/src/main/scala-3/PluginCompat.scala b/src/main/scala-3/PluginCompat.scala new file mode 100644 index 0000000..28b39a6 --- /dev/null +++ b/src/main/scala-3/PluginCompat.scala @@ -0,0 +1,18 @@ +package sbtunidoc + +import sbt.* +import java.io.File +import java.nio.file.{ Path => NioPath } +import xsbti.{ FileConverter, HashedVirtualFileRef } + +object PluginCompat: + type URI = java.net.URI + type FileRef = HashedVirtualFileRef + def getName(file: HashedVirtualFileRef): String = file.name + def toNioPath(a: Attributed[HashedVirtualFileRef])(using conv: FileConverter): NioPath = + conv.toPath(a.data) + def toNioPath(file: HashedVirtualFileRef)(using conv: FileConverter): NioPath = + conv.toPath(file) + inline def toFile(file: HashedVirtualFileRef)(using conv: FileConverter): File = + toNioPath(file).toFile() +end PluginCompat diff --git a/src/main/scala/sbtunidoc/BaseUnidocPlugin.scala b/src/main/scala/sbtunidoc/BaseUnidocPlugin.scala index b8dabec..28d58f8 100644 --- a/src/main/scala/sbtunidoc/BaseUnidocPlugin.scala +++ b/src/main/scala/sbtunidoc/BaseUnidocPlugin.scala @@ -1,8 +1,9 @@ package sbtunidoc -import sbt.Keys._ -import sbt._ +import sbt.Keys.* +import sbt.* import sbt.plugins.JvmPlugin +import PluginCompat.* /** Provides default settings for unidoc plugins. * @@ -13,32 +14,45 @@ object BaseUnidocPlugin extends AutoPlugin { import autoImport._ override def projectSettings = Seq( - Compile / unidoc := Seq.empty, - Test / unidoc := Seq.empty + Compile / unidoc := Def.uncached(Seq.empty), + Test / unidoc := Def.uncached(Seq.empty), ) override def requires = JvmPlugin def baseUnidocSettings(sc: Configuration): Seq[sbt.Def.Setting[?]] = Seq( - doc := Unidoc(streams.value.cacheDirectory, (unidoc / compilers).value, (unidoc / sources).value, (unidoc / fullClasspath).value, - (unidoc / scalacOptions).value, (unidoc / javacOptions).value, (unidoc / apiMappings).value, (unidoc / maxErrors).value, - (unidoc / target).value, configuration.value, streams.value, (unidoc / sourcePositionMappers).value, fileConverter.value), - unidoc / compilers := (sc / compilers).value, - unidoc / sources := (unidoc / unidocAllSources).value.flatten.sortBy { _.getAbsolutePath }, - unidoc / scalacOptions := (sc / doc / scalacOptions).value, - unidoc / javacOptions := (sc / doc / javacOptions).value, - unidoc / fullClasspath := (unidoc / unidocAllClasspaths).value.flatten.distinct.sortBy { _.data.getName }, - unidoc / unidocAllClasspaths := allClasspathsTask.value, - unidoc / apiMappings := { + doc := Def.uncached { + Unidoc( + streams.value.cacheDirectory, + (unidoc / compilers).value, + (unidoc / sources).value, + (unidoc / fullClasspath).value, + (unidoc / scalacOptions).value, + (unidoc / javacOptions).value, + (unidoc / apiMappings).value, + (unidoc / maxErrors).value, + (unidoc / target).value, + configuration.value, + streams.value, + (unidoc / sourcePositionMappers).value, + fileConverter.value) + }, + unidoc / compilers := Def.uncached((sc / compilers).value), + unidoc / sources := Def.uncached((unidoc / unidocAllSources).value.flatten.sortBy { _.getAbsolutePath }), + unidoc / scalacOptions := Def.uncached((sc / doc / scalacOptions).value), + unidoc / javacOptions := Def.uncached((sc / doc / javacOptions).value), + unidoc / fullClasspath := Def.uncached((unidoc / unidocAllClasspaths).value.flatten.distinct.sortBy { x => getName(x.data) }), + unidoc / unidocAllClasspaths := Def.uncached(allClasspathsTask.value), + unidoc / apiMappings := Def.uncached { val all = (unidoc / unidocAllAPIMappings).value val allList = all map { _.toList } allList.flatten.distinct.toMap }, - unidoc / unidocAllAPIMappings := allAPIMappingsTask.value, - unidoc / maxErrors := (sc / doc / maxErrors).value, - unidoc / unidocScopeFilter := ScopeFilter((unidoc / unidocProjectFilter).value, (unidoc / unidocConfigurationFilter).value), - unidoc / unidocProjectFilter := inAnyProject, - unidoc / unidocConfigurationFilter := inConfigurations(sc) + unidoc / unidocAllAPIMappings := Def.uncached(allAPIMappingsTask.value), + unidoc / maxErrors := Def.uncached((sc / doc / maxErrors).value), + unidoc / unidocScopeFilter := Def.uncached(ScopeFilter((unidoc / unidocProjectFilter).value, (unidoc / unidocConfigurationFilter).value)), + unidoc / unidocProjectFilter := Def.uncached(inAnyProject), + unidoc / unidocConfigurationFilter := Def.uncached(inConfigurations(sc)) ) lazy val allClasspathsTask = Def.taskDyn { diff --git a/src/main/scala/sbtunidoc/GenJavadocPlugin.scala b/src/main/scala/sbtunidoc/GenJavadocPlugin.scala index 837bc95..92accc7 100644 --- a/src/main/scala/sbtunidoc/GenJavadocPlugin.scala +++ b/src/main/scala/sbtunidoc/GenJavadocPlugin.scala @@ -1,8 +1,9 @@ package sbtunidoc -import sbt._ -import sbt.Keys._ +import sbt.* +import sbt.Keys.* import sbt.plugins.JvmPlugin +import PluginCompat.* object GenJavadocPlugin extends AutoPlugin { object autoImport extends GenJavadocKeys { @@ -16,5 +17,6 @@ object GenJavadocPlugin extends AutoPlugin { override def projectSettings = Seq( libraryDependencies += compilerPlugin("com.typesafe.genjavadoc" %% "genjavadoc-plugin" % unidocGenjavadocVersion.value cross CrossVersion.full), - scalacOptions += ("-P:genjavadoc:out=" + (target.value / "java"))) + scalacOptions += Def.uncached(("-P:genjavadoc:out=" + (target.value / "java"))), + ) } diff --git a/src/main/scala/sbtunidoc/JavaUnidocPlugin.scala b/src/main/scala/sbtunidoc/JavaUnidocPlugin.scala index debc89a..0a8346a 100644 --- a/src/main/scala/sbtunidoc/JavaUnidocPlugin.scala +++ b/src/main/scala/sbtunidoc/JavaUnidocPlugin.scala @@ -1,8 +1,9 @@ package sbtunidoc -import sbt._ -import Keys._ -import BaseUnidocPlugin.autoImport._ +import sbt.* +import Keys.* +import BaseUnidocPlugin.autoImport.* +import PluginCompat.* /** Generates unified javadoc documentation. * @@ -27,12 +28,12 @@ object JavaUnidocPlugin extends AutoPlugin { def javaUnidocTask(c: Configuration, sc: Configuration): Seq[sbt.Def.Setting[?]] = inConfig(c)(Defaults.configSettings ++ baseJavaUnidocTasks(sc)) ++ Seq( - sc / unidoc ++= Seq((c / doc).value) + sc / unidoc ++= Def.uncached(Seq((c / doc).value)) ) def baseJavaUnidocTasks(sc: Configuration): Seq[sbt.Def.Setting[?]] = BaseUnidocPlugin.baseUnidocSettings(sc) ++ Seq( unidoc / target := target.value / "javaunidoc", - unidoc / unidocAllSources := allJavaSourcesTask.value + unidoc / unidocAllSources := Def.uncached(allJavaSourcesTask.value), ) lazy val javaSources: sbt.Def.Initialize[Task[Seq[File]]] = Def.task { diff --git a/src/main/scala/sbtunidoc/PublishJavadocPlugin.scala b/src/main/scala/sbtunidoc/PublishJavadocPlugin.scala index 55b6a8e..7278973 100644 --- a/src/main/scala/sbtunidoc/PublishJavadocPlugin.scala +++ b/src/main/scala/sbtunidoc/PublishJavadocPlugin.scala @@ -1,7 +1,8 @@ package sbtunidoc -import sbt._ -import sbt.Keys._ +import sbt.* +import sbt.Keys.* +import PluginCompat.* /** Publishes javadoc artifacts rather than scaladoc ones. */ object PublishJavadocPlugin extends AutoPlugin { @@ -11,15 +12,15 @@ object PublishJavadocPlugin extends AutoPlugin { def genjavadocExtraTask(c: Configuration, sc: Configuration): Seq[sbt.Def.Setting[?]] = inConfig(c)(Defaults.configSettings ++ baseGenjavadocExtraTasks(sc)) ++ Seq( - sc / packageDoc := (c / packageDoc).value + sc / packageDoc := Def.uncached((c / packageDoc).value), ) def baseGenjavadocExtraTasks(sc: Configuration): Seq[sbt.Def.Setting[?]] = Seq( packageDoc / artifactName := { (sv, mod, art) => "" + mod.name + "_" + sv.binary + "-" + mod.revision + "-javadoc.jar" }, - sources := { + sources := Def.uncached { (sc / compile).value (target.value / "java" ** "*.java").get() ++ (sc / sources).value.filter(_.getName.endsWith(".java")) }, - doc / javacOptions := (sc / doc / javacOptions).value + doc / javacOptions := Def.uncached((sc / doc / javacOptions).value), ) } diff --git a/src/main/scala/sbtunidoc/ScalaUnidocPlugin.scala b/src/main/scala/sbtunidoc/ScalaUnidocPlugin.scala index 19ea7d1..fd55702 100644 --- a/src/main/scala/sbtunidoc/ScalaUnidocPlugin.scala +++ b/src/main/scala/sbtunidoc/ScalaUnidocPlugin.scala @@ -1,8 +1,9 @@ package sbtunidoc -import sbt._ -import Keys._ -import BaseUnidocPlugin.autoImport._ +import sbt.* +import Keys.* +import BaseUnidocPlugin.autoImport.* +import PluginCompat.* /** Generates unified scaladoc documentation. */ object ScalaUnidocPlugin extends AutoPlugin { @@ -12,7 +13,7 @@ object ScalaUnidocPlugin extends AutoPlugin { lazy val ScalaUnidoc = config("scalaunidoc") extend Compile lazy val TestScalaUnidoc = config("testscalaunidoc") extend Test } - import autoImport._ + import autoImport.* override def projectSettings = scalaUnidocTask(ScalaUnidoc, Compile) ++ @@ -23,12 +24,12 @@ object ScalaUnidocPlugin extends AutoPlugin { def scalaUnidocTask(c: Configuration, sc: Configuration): Seq[sbt.Def.Setting[?]] = inConfig(c)(Defaults.configSettings ++ baseScalaUnidocTasks(sc)) ++ Seq( - sc / unidoc ++= Seq((c / doc).value) + sc / unidoc ++= Def.uncached(Seq((c / doc).value)) ) def baseScalaUnidocTasks(sc: Configuration): Seq[sbt.Def.Setting[?]] = BaseUnidocPlugin.baseUnidocSettings(sc) ++ Seq( unidoc / target := crossTarget.value / "unidoc", - unidoc / unidocAllSources := allScalaSources.value + unidoc / unidocAllSources := Def.uncached(allScalaSources.value) ) lazy val allScalaSources = Def.taskDyn { diff --git a/src/main/scala/sbtunidoc/Unidoc.scala b/src/main/scala/sbtunidoc/Unidoc.scala index 2c29c3e..586aad4 100644 --- a/src/main/scala/sbtunidoc/Unidoc.scala +++ b/src/main/scala/sbtunidoc/Unidoc.scala @@ -1,47 +1,74 @@ package sbtunidoc -import sbt._ -import sbt.Keys._ +import sbt.* +import sbt.Keys.* import sbt.internal.inc.{AnalyzingCompiler, ManagedLoggedReporter} -import sbt.internal.util.Attributed.data +// import sbt.internal.util.Attributed.data +import sbt.internal.inc.{CompilerArguments, CompileOutput} import xsbti.compile.{Compilers, IncToolOptionsUtil} -import xsbti.{FileConverter, Reporter} +import xsbti.{FileConverter, PathBasedFile, VirtualFile} +import PluginCompat.* object Unidoc { import java.io.PrintWriter // This is straight out of docTaskSettings in Defaults.scala. def apply(cache: File, cs: Compilers, srcs: Seq[File], cp: Classpath, - sOpts: Seq[String], jOpts: Seq[String], xapis: Map[File, URL], maxErrors: Int, + sOpts: Seq[String], jOpts: Seq[String], + xapis: Map[FileRef, PluginCompat.URI], + maxErrors: Int, out: File, config: Configuration, s: TaskStreams, spm: Seq[xsbti.Position => Option[xsbti.Position]], converter: FileConverter): File = { + implicit val conv: FileConverter = converter val hasScala = srcs.exists(_.name.endsWith(".scala")) || srcs.exists(_.name.endsWith(".tasty")) || // Condition for Scaladoc 3 sOpts.contains("-siteroot") // Condition for Scaladoc 3 val hasJava = srcs.exists(_.name.endsWith(".java")) - val label = nameForSrc(config.name) + // val label = nameForSrc(config.name) val reporter = new ManagedLoggedReporter( maxErrors, s.log, foldMappers(spm)) (hasScala, hasJava) match { case (true, _) => - val options = sOpts ++ Opts.doc.externalAPI(xapis) - val runDoc = Doc.scaladoc(label, s.cacheStoreFactory sub "scala", cs.scalac match { + val xapisFiles = xapis.toSeq.map { + case (k, v) => toFile(k) -> v + } + val options = sOpts ++ Opts.doc.externalAPI(xapisFiles) + val scalac = cs.scalac match { case ac: AnalyzingCompiler => ac.onArgs(exported(s, "scaladoc")) - }, Nil) - runDoc(srcs, data(cp).toList, out, options, maxErrors, s.log) + } + val scaladocSrcs = srcs + // todo: cache this + if (scaladocSrcs.nonEmpty) { + IO.delete(out) + IO.createDirectory(out) + // use PlainVirtualFile since Scaladoc currently doesn't handle actual VirtualFiles + scalac.doc( + scaladocSrcs.map(_.toPath()).map(new sbt.internal.inc.PlainVirtualFile(_)), + cp.map(toNioPath).map(new sbt.internal.inc.PlainVirtualFile(_)), + converter, + out.toPath(), + options, + maxErrors, + s.log, + ) + } + else () case (_, true) => - val javadoc = - sbt.inc.Doc.cachedJavadoc(label, s.cacheStoreFactory sub "java", cs.javaTools) - javadoc.run( - srcs.toList.map(f => converter.toVirtualFile(f.toPath)), - data(cp).toList.map(f => converter.toVirtualFile(f.toPath)), - converter, - out.toPath, - jOpts.toList, + val javaSourcesOnly: VirtualFile => Boolean = _.id.endsWith(".java") + val classpath = cp.map(toNioPath).map(converter.toVirtualFile) + cs.javaTools.javadoc.run( + srcs.toArray + .map { x => + converter.toVirtualFile(x.toPath) + } + .filter(javaSourcesOnly), + JavaCompilerArguments(Nil, classpath.toList, jOpts.toList).toArray, + CompileOutput(out.toPath), IncToolOptionsUtil.defaultIncToolOptions(), + reporter, s.log, - reporter) + ) case _ => () // do nothing } out @@ -63,4 +90,21 @@ object Unidoc { case "compile"|"javaunidoc"|"scalaunidoc" => "main" case _ => name } + + object JavaCompilerArguments { + def apply( + sources: List[VirtualFile], + classpath: List[VirtualFile], + options: List[String] + ): List[String] = { + val cp = classpath map { + case x: PathBasedFile => x.toPath + } + val sources1 = sources map { + case x: PathBasedFile => x.toPath + } + val classpathOption = List("-classpath", CompilerArguments.absString(cp)) + options ::: classpathOption ::: CompilerArguments.abs(sources1) + } + } } diff --git a/src/main/scala/sbtunidoc/UnidocKeys.scala b/src/main/scala/sbtunidoc/UnidocKeys.scala index 8e5baba..4a68452 100644 --- a/src/main/scala/sbtunidoc/UnidocKeys.scala +++ b/src/main/scala/sbtunidoc/UnidocKeys.scala @@ -2,12 +2,14 @@ package sbtunidoc import sbt.Keys.Classpath import sbt.{File, ScopeFilter, URL, settingKey, taskKey} +import PluginCompat.* trait UnidocKeys { + @transient val unidoc = taskKey[Seq[File]]("Create unified scaladoc for all aggregates.") val unidocAllSources = taskKey[Seq[Seq[File]]]("All sources.") val unidocAllClasspaths = taskKey[Seq[Classpath]]("All classpaths.") - val unidocAllAPIMappings = taskKey[Seq[Map[File, URL]]]("All API mappings.") + val unidocAllAPIMappings = taskKey[Seq[Map[FileRef, PluginCompat.URI]]]("All API mappings.") val unidocScopeFilter = settingKey[ScopeFilter]("Control sources to be included in unidoc.") val unidocProjectFilter = settingKey[ScopeFilter.ProjectFilter]("Control projects to be included in unidoc.") val unidocConfigurationFilter = settingKey[ScopeFilter.ConfigurationFilter]("Control configurations to be included in unidoc.") diff --git a/src/sbt-test/unidoc/java-unidoc/build.sbt b/src/sbt-test/unidoc/java-unidoc/build.sbt index 2bbc565..b380f3c 100644 --- a/src/sbt-test/unidoc/java-unidoc/build.sbt +++ b/src/sbt-test/unidoc/java-unidoc/build.sbt @@ -15,19 +15,20 @@ lazy val c = module("c") lazy val root = project.in(file(".")).settings( commonSettings, - JavaUnidoc / unidoc / unidocProjectFilter := inAnyProject -- inProjects(c) + name := "javaunidoc", + JavaUnidoc / unidoc / unidocProjectFilter := inAnyProject -- inProjects(c), + TaskKey[Unit]("check") := { + if (scala.util.Properties.isJavaAtLeast("17")) { + assert(file("target/javaunidoc/allclasses-index.html").isFile) + } else if (scala.util.Properties.isJavaAtLeast("11")) { + assert(file("target/javaunidoc/allclasses.html").isFile) + } else { + assert(file("target/javaunidoc/allclasses-frame.html").isFile) + } + }, + target := baseDirectory.value / "target", ).enablePlugins( JavaUnidocPlugin ).aggregate( a, b, c ) - -TaskKey[Unit]("check") := { - if (scala.util.Properties.isJavaAtLeast("17")) { - assert(file("target/javaunidoc/allclasses-index.html").isFile) - } else if (scala.util.Properties.isJavaAtLeast("11")) { - assert(file("target/javaunidoc/allclasses.html").isFile) - } else { - assert(file("target/javaunidoc/allclasses-frame.html").isFile) - } -} diff --git a/src/sbt-test/unidoc/java-unidoc/test b/src/sbt-test/unidoc/java-unidoc/test index 144a045..09ba3e8 100644 --- a/src/sbt-test/unidoc/java-unidoc/test +++ b/src/sbt-test/unidoc/java-unidoc/test @@ -1,9 +1,9 @@ > unidoc > check -$ exists target/javaunidoc/example/A.html -$ exists target/javaunidoc/example/B.html --$ exists target/javaunidoc/example/C.html +$ exists target/**/javaunidoc/example/A.html +$ exists target/**/javaunidoc/example/B.html +-$ exists target/**/javaunidoc/example/C.html --$ exists target/scala-2.12/unidoc/example/A.html --$ exists target/scala-2.12/unidoc/example/B.html +-$ exists target/**/unidoc/example/A.html +-$ exists target/**/unidoc/example/B.html diff --git a/src/sbt-test/unidoc/scala-unidoc/test b/src/sbt-test/unidoc/scala-unidoc/test index 200b19c..135f2ce 100644 --- a/src/sbt-test/unidoc/scala-unidoc/test +++ b/src/sbt-test/unidoc/scala-unidoc/test @@ -1,4 +1,4 @@ > unidoc -$ exists target/scala-2.12/unidoc/example/A.html -$ exists target/scala-2.12/unidoc/example/B.html --$ exists target/scala-2.12/unidoc/example/C.html +$ exists target/**/unidoc/example/A.html +$ exists target/**/unidoc/example/B.html +-$ exists target/**/unidoc/example/C.html diff --git a/src/sbt-test/unidoc/scala3-unidoc/test b/src/sbt-test/unidoc/scala3-unidoc/test index bac1664..135f2ce 100644 --- a/src/sbt-test/unidoc/scala3-unidoc/test +++ b/src/sbt-test/unidoc/scala3-unidoc/test @@ -1,4 +1,4 @@ > unidoc -$ exists target/scala-3.3.4/unidoc/example/A.html -$ exists target/scala-3.3.4/unidoc/example/B.html --$ exists target/scala-3.3.4/unidoc/example/C.html +$ exists target/**/unidoc/example/A.html +$ exists target/**/unidoc/example/B.html +-$ exists target/**/unidoc/example/C.html