Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
89 changes: 62 additions & 27 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,20 @@ jobs:
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
scala: [2.12.21]
java: [temurin@8, temurin@11, temurin@17, temurin@21]
scala: [2.12.21, 3.8.3]
java:
- temurin@17
- temurin@25
- temurin@21
- temurin@8
- temurin@11
exclude:
- java: temurin@8
os: macos-latest
- java: temurin@8
scala: 3.8.3
- java: temurin@11
scala: 3.8.3
runs-on: ${{ matrix.os }}
steps:
- name: Ignore line ending differences in git
Expand All @@ -48,36 +57,44 @@ jobs:
with:
fetch-depth: 0

- name: Setup Java (temurin@8)
if: matrix.java == 'temurin@8'
- name: Setup Java (temurin@17)
if: matrix.java == 'temurin@17'
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: 8
java-version: 17
cache: sbt

- name: Setup Java (temurin@11)
if: matrix.java == 'temurin@11'
- name: Setup Java (temurin@25)
if: matrix.java == 'temurin@25'
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: 11
java-version: 25
cache: sbt

- name: Setup Java (temurin@17)
if: matrix.java == 'temurin@17'
- name: Setup Java (temurin@21)
if: matrix.java == 'temurin@21'
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: 17
java-version: 21
cache: sbt

- name: Setup Java (temurin@21)
if: matrix.java == 'temurin@21'
- name: Setup Java (temurin@8)
if: matrix.java == 'temurin@8'
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: 21
java-version: 8
cache: sbt

- name: Setup Java (temurin@11)
if: matrix.java == 'temurin@11'
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: 11
cache: sbt

- name: Setup sbt
Expand Down Expand Up @@ -108,7 +125,7 @@ jobs:
matrix:
os: [ubuntu-latest]
scala: [2.12.21]
java: [temurin@8]
java: [temurin@17]
runs-on: ${{ matrix.os }}
steps:
- name: Ignore line ending differences in git
Expand All @@ -128,36 +145,44 @@ jobs:
with:
fetch-depth: 0

- name: Setup Java (temurin@8)
if: matrix.java == 'temurin@8'
- name: Setup Java (temurin@17)
if: matrix.java == 'temurin@17'
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: 8
java-version: 17
cache: sbt

- name: Setup Java (temurin@11)
if: matrix.java == 'temurin@11'
- name: Setup Java (temurin@25)
if: matrix.java == 'temurin@25'
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: 11
java-version: 25
cache: sbt

- name: Setup Java (temurin@17)
if: matrix.java == 'temurin@17'
- name: Setup Java (temurin@21)
if: matrix.java == 'temurin@21'
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: 17
java-version: 21
cache: sbt

- name: Setup Java (temurin@21)
if: matrix.java == 'temurin@21'
- name: Setup Java (temurin@8)
if: matrix.java == 'temurin@8'
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: 21
java-version: 8
cache: sbt

- name: Setup Java (temurin@11)
if: matrix.java == 'temurin@11'
uses: actions/setup-java@v5
with:
distribution: temurin
java-version: 11
cache: sbt

- name: Setup sbt
Expand All @@ -173,6 +198,16 @@ jobs:
tar xf targets.tar
rm targets.tar

- name: Download target directories (3.8.3)
uses: actions/download-artifact@v8
with:
name: target-${{ matrix.os }}-3.8.3-${{ matrix.java }}

- name: Inflate target directories (3.8.3)
run: |
tar xf targets.tar
rm targets.tar

- name: Publish project
env:
PGP_PASSPHRASE: ${{ secrets.PGP_PASSPHRASE }}
Expand Down
27 changes: 20 additions & 7 deletions build.sbt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
lazy val scala212 = "2.12.21"
ThisBuild / crossScalaVersions := Seq(scala212)
lazy val scala3 = "3.8.3"
ThisBuild / crossScalaVersions := Seq(scala212, scala3)
ThisBuild / scalaVersion := scala212

// So that publishLocal doesn't continuously create new versions
Expand Down Expand Up @@ -42,27 +43,39 @@ ThisBuild / githubWorkflowPublish := Seq(
ThisBuild / githubWorkflowOSes := Seq("ubuntu-latest", "macos-latest", "windows-latest")

ThisBuild / githubWorkflowJavaVersions := Seq(
JavaSpec.temurin("8"),
JavaSpec.temurin("11"),
JavaSpec.temurin("17"),
JavaSpec.temurin("21")
JavaSpec.temurin("25"),
JavaSpec.temurin("21"),
JavaSpec.temurin("8"),
JavaSpec.temurin("11")
)

ThisBuild / githubWorkflowBuildMatrixExclusions += MatrixExclude(Map("java" -> "temurin@8", "os" -> "macos-latest"))
ThisBuild / githubWorkflowBuildMatrixExclusions += MatrixExclude(Map("java" -> "temurin@8", "scala" -> scala3))
ThisBuild / githubWorkflowBuildMatrixExclusions += MatrixExclude(Map("java" -> "temurin@11", "scala" -> scala3))

name := "sbt-osgi"
enablePlugins(SbtPlugin)
addSbtPlugin("com.github.sbt" % "sbt2-compat" % "0.1.0")
pluginCrossBuild / sbtVersion := {
scalaBinaryVersion.value match {
case "2.12" => "1.12.11"
case _ => "2.0.0-RC12"
}
}
libraryDependencies ++= Dependencies.sbtOsgi
scalacOptions ++= Seq(
"-unchecked",
"-deprecation",
"-Xlint",
"-encoding",
"UTF-8"
)
) ++ (CrossVersion.partialVersion(scalaVersion.value) match {
case Some((2, 12)) => Seq("-Xlint", "-Xsource:3", "-release:8")
case _ => Nil
})

scalacOptions ++= {
if (insideCI.value) {
if (insideCI.value && scalaBinaryVersion.value == "2.12") {
val log = sLog.value
log.info("Running in CI, enabling Scala2 optimizer")
Seq(
Expand Down
9 changes: 9 additions & 0 deletions src/main/scala-2.12/com/github/sbt/osgi/PluginCompat.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.github.sbt.osgi

import java.net.URL

private[osgi] object PluginCompat {
def licenses(v: Seq[(String, URL)]): Seq[(String, URL)] = v
def apiUrl(v: Option[URL]): Option[URL] = v
type ManifestAttributes = sbt.Package.ManifestAttributes
}
13 changes: 13 additions & 0 deletions src/main/scala-3/com/github/sbt/osgi/PluginCompat.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.github.sbt.osgi

import java.net.{ URI, URL }

import sbt.librarymanagement.License

private[osgi] object PluginCompat {
def licenses(v: Seq[License]): Seq[(String, URL)] =
v.map(l => l.spdxId -> new URL(l.uri.toString))
def apiUrl(v: Option[URI]): Option[URL] =
v.map(u => new URI(u.toString).toURL)
type ManifestAttributes = sbt.PackageOption.ManifestAttributes
}
19 changes: 10 additions & 9 deletions src/main/scala/com/github/sbt/osgi/Osgi.scala
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,10 @@ import java.util.stream.Collectors

import sbt._
import sbt.Keys._
import sbt.Package.ManifestAttributes

import scala.collection.JavaConverters._
import PluginCompat.ManifestAttributes

import scala.jdk.CollectionConverters._
import scala.language.implicitConversions

private object Osgi {
Expand Down Expand Up @@ -186,15 +187,15 @@ private object Osgi {

def content = {
import _root_.java.nio.file._
import _root_.scala.collection.JavaConverters._
import _root_.scala.jdk.CollectionConverters._
val path = tmpArtifactDirectoryPath.toPath
Files
.walk(path)
.iterator
.asScala
.map(f => f.toFile -> path.relativize(f))
.collect { case (f, p) if p != (file("META-INF") / "MANIFEST.MF").toPath => (f, p.toString) }
.toTraversable
.toList
}

IO.jar(content, tmpArtifactPath, manifest)
Expand All @@ -207,9 +208,9 @@ private object Osgi {

private def addPackageOptions(props: Properties, packageOptions: Seq[PackageOption]) = {
packageOptions
.collect({ case attr: ManifestAttributes attr.attributes })
.collect({ case attr: ManifestAttributes => attr.attributes })
.flatten
.foreach { case (name, value) props.put(name.toString, value) }
.foreach { case (name, value) => props.put(name.toString, value) }
props
}

Expand All @@ -234,7 +235,7 @@ private object Osgi {
})
.collect(Collectors.toSet())

import scala.collection.JavaConverters._
import scala.jdk.CollectionConverters._
packages.asScala
}
}.toSet
Expand Down Expand Up @@ -307,7 +308,7 @@ private object Osgi {
def seqToStrOpt[A](seq: Seq[A])(f: A => String): Option[String] =
if (seq.isEmpty) None else Some(seq map f mkString ",")

def strToStrOpt(s: String): Option[String] = Option(s).filter(_.trim nonEmpty)
def strToStrOpt(s: String): Option[String] = Option(s).filter(_.trim.nonEmpty)

def includeResourceProperty(resourceDirectories: Seq[File], embeddedJars: Seq[File], explodedJars: Seq[File]) = {
val paths: Seq[String] =
Expand All @@ -330,7 +331,7 @@ private object Osgi {

def id(s: String) = s

def parts(s: String) = s split "[.-]" filterNot (_.isEmpty)
def parts(s: String) = s.split("[.-]").filterNot(_.isEmpty)

// ------------ Poor Man's Java 8 make-it-look-nice inter-op ----------------
implicit def asPredicate[T](f: T => Boolean): Predicate[T] =
Expand Down
8 changes: 6 additions & 2 deletions src/main/scala/com/github/sbt/osgi/OsgiKeys.scala
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,15 @@
package com.github.sbt.osgi

import sbt._
import sbtcompat.PluginCompat.FileRef

trait OsgiKeys {

lazy val bundle: TaskKey[File] =
TaskKey[File](prefix("Bundle"), "Create an OSGi bundle.")
lazy val bundle: TaskKey[FileRef] =
TaskKey[FileRef](prefix("Bundle"), "Create an OSGi bundle.")

lazy val bundleFile: TaskKey[File] =
TaskKey[File](prefix("BundleFile"), "The OSGi bundle as a java.io.File.")

lazy val manifestHeaders: TaskKey[OsgiManifestHeaders] =
TaskKey[OsgiManifestHeaders](prefix("ManifestHeaders"), "The aggregated manifest headers.")
Expand Down
Loading
Loading