Skip to content

Commit 080f660

Browse files
authored
Merge pull request #333 from bplommer/expose-versioning-info
Expose versioning info in version plugin
2 parents e2df0e2 + 91d747d commit 080f660

File tree

3 files changed

+44
-33
lines changed

3 files changed

+44
-33
lines changed

kernel/src/main/scala/org/typelevel/sbt/TypelevelKernelPlugin.scala

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package org.typelevel.sbt
1818

19+
import org.typelevel.sbt.kernel.GitHelper
20+
import org.typelevel.sbt.kernel.V
1921
import sbt._
2022
import sbt.plugins.JvmPlugin
2123

@@ -37,6 +39,7 @@ object TypelevelKernelPlugin extends AutoPlugin {
3739
BasicCommands.addAlias(BasicCommands.removeAlias(s, name), name, contents)
3840
}
3941
})
42+
4043
}
4144

4245
import autoImport._
@@ -83,4 +86,34 @@ object TypelevelKernelPlugin extends AutoPlugin {
8386
}
8487
}
8588

89+
private[sbt] lazy val currentRelease: Def.Initialize[Option[String]] = Def.setting {
90+
// some tricky logic here ...
91+
// if the latest release is a pre-release (e.g., M or RC)
92+
// and there are no stable releases it is bincompatible with,
93+
// then for all effective purposes it is the current release
94+
95+
val release = previousReleases.value match {
96+
case head :: tail if head.isPrerelease =>
97+
tail
98+
.filterNot(_.isPrerelease)
99+
.find(head.copy(prerelease = None).mustBeBinCompatWith(_))
100+
.orElse(Some(head))
101+
case releases => releases.headOption
102+
}
103+
104+
release.map(_.toString)
105+
}
106+
107+
// latest tagged release, including pre-releases
108+
private[sbt] lazy val currentPreRelease: Def.Initialize[Option[String]] = Def.setting {
109+
previousReleases.value.headOption.map(_.toString)
110+
}
111+
112+
private[this] lazy val previousReleases: Def.Initialize[List[V]] = Def.setting {
113+
val currentVersion = V(version.value).map(_.copy(prerelease = None))
114+
GitHelper.previousReleases(fromHead = true, strict = false).filter { v =>
115+
currentVersion.forall(v.copy(prerelease = None) <= _)
116+
}
117+
}
118+
86119
}

site/src/main/scala/org/typelevel/sbt/TypelevelSitePlugin.scala

Lines changed: 1 addition & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@ import laika.helium.config.ImageLink
2626
import laika.sbt.LaikaPlugin
2727
import laika.theme.ThemeProvider
2828
import mdoc.MdocPlugin
29-
import org.typelevel.sbt.kernel.GitHelper
30-
import org.typelevel.sbt.kernel.V
3129
import org.typelevel.sbt.site._
3230
import sbt._
3331

@@ -38,6 +36,7 @@ import MdocPlugin.autoImport._
3836
import LaikaPlugin.autoImport._
3937
import gha.GenerativePlugin
4038
import GenerativePlugin.autoImport._
39+
import TypelevelKernelPlugin._
4140
import TypelevelKernelPlugin.autoImport._
4241

4342
object TypelevelSitePlugin extends AutoPlugin {
@@ -251,36 +250,6 @@ object TypelevelSitePlugin extends AutoPlugin {
251250
)
252251
)
253252

254-
private lazy val currentRelease = Def.setting {
255-
// some tricky logic here ...
256-
// if the latest release is a pre-release (e.g., M or RC)
257-
// and there are no stable releases it is bincompatible with,
258-
// then for all effective purposes it is the current release
259-
260-
val release = previousReleases.value match {
261-
case head :: tail if head.isPrerelease =>
262-
tail
263-
.filterNot(_.isPrerelease)
264-
.find(head.copy(prerelease = None).mustBeBinCompatWith(_))
265-
.orElse(Some(head))
266-
case releases => releases.headOption
267-
}
268-
269-
release.map(_.toString)
270-
}
271-
272-
// latest tagged release, including pre-releases
273-
private lazy val currentPreRelease = Def.setting {
274-
previousReleases.value.headOption.map(_.toString)
275-
}
276-
277-
private lazy val previousReleases = Def.setting {
278-
val currentVersion = V(version.value).map(_.copy(prerelease = None))
279-
GitHelper.previousReleases(fromHead = true, strict = false).filter { v =>
280-
currentVersion.forall(v.copy(prerelease = None) <= _)
281-
}
282-
}
283-
284253
private def previewTask = Def
285254
.taskDyn {
286255
// inlined from https://github.com/planet42/Laika/blob/9022f6f37c9017f7612fa59398f246c8e8c42c3e/sbt/src/main/scala/laika/sbt/Tasks.scala#L192

versioning/src/main/scala/org/typelevel/sbt/TypelevelVersioningPlugin.scala

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package org.typelevel.sbt
1818

1919
import com.typesafe.sbt.GitPlugin
2020
import com.typesafe.sbt.SbtGit.git
21+
import org.typelevel.sbt.TypelevelKernelPlugin._
2122
import org.typelevel.sbt.kernel.GitHelper
2223
import org.typelevel.sbt.kernel.V
2324
import sbt._
@@ -37,6 +38,12 @@ object TypelevelVersioningPlugin extends AutoPlugin {
3738
lazy val tlUntaggedAreSnapshots =
3839
settingKey[Boolean](
3940
"If true, an untagged commit is given a snapshot version, e.g. 0.4-00218f9-SNAPSHOT. If false, it is given a release version, e.g. 0.4-00218f9. (default: true)")
41+
42+
lazy val tlLatestVersion = settingKey[Option[String]](
43+
"The latest tagged version on this branch. Priority is given to the latest stable version, but if you have tagged a binary-breaking prelease version (such as a milestone or release candidate), that will be selected instead. If applicable, this will be the current tagged version.")
44+
45+
lazy val tlLatestPreReleaseVersion = settingKey[Option[String]](
46+
"The latest tagged version on this branch, including milestones and release candidates. If applicable, this will be the current tagged version.")
4047
}
4148

4249
import autoImport._
@@ -123,7 +130,9 @@ object TypelevelVersioningPlugin extends AutoPlugin {
123130
if (isSnapshot.value) version += "-SNAPSHOT"
124131

125132
version
126-
}
133+
},
134+
tlLatestVersion := currentRelease.value,
135+
tlLatestPreReleaseVersion := currentPreRelease.value
127136
)
128137

129138
private val Description = """^.*-(\d+)-[a-zA-Z0-9]+$""".r

0 commit comments

Comments
 (0)