Skip to content
Draft
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
7 changes: 6 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
target
project/project
project/target
.bsp
.cache
.classpath
.project
.settings
.bsp
# vscode related files
.bloop
.metals
.vscode
project/metals.sbt
9 changes: 6 additions & 3 deletions src/main/paradox/file-formats/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,15 @@ _sbt-dependency-lock_ stores lockfile information in JSON format with a version
top-level object. Details of the file format can be found on these pages, and we encourage other tools to utilise the
output information.

| Version | Added In | Removed In | Description |
| ---------------------: | -------: | ---------: | ---------------- |
| @ref:[1](version-1.md) | 0.1.0 | _current_ | Initial version. |
| Version | Added In | Removed In | Description |
| ---------------------: | ---------: | ---------: | ------------------------- |
| @ref:[1](version-1.md) | 0.1.0 | _current_ | Initial version. |
| @ref:[2](version-2.md) | _proposed_ | _N/A_ | Proposed enhanced format. |


Current default version is: 1

@@@ index
* [Version 1](version-1.md)
* [Version 2](version-2.md)
@@@
209 changes: 209 additions & 0 deletions src/main/paradox/file-formats/version-2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,209 @@
# Version 2

@@@warning
This version of the lockfile is currently a proposal and has not been implemented yet.

Version 2.0.0 should add this version.
@@@

## New Features

- Handles cross-built Scala dependencies.

### Cross-Built Scala Dependencies

There are three types of dependencies that need to be handled:

1. Dependencies that are the same for all scala versions (eg Java libraries).
2. Dependencies that are only used in one scala version (eg `scala-library` or compatibility libraries).
3. Dependencies that are used in multiple scala versions but have different artifacts (eg Scala libraries).

```scala
crossScalaVersions := Seq("2.12.10", "2.13.4")

libraryDependencies ++= Seq(
"org.apache.commons" % "commons-lang3" % "3.9", // scenario 1
"org.scala-lang.modules" %% "scala-xml" % "1.2.0" // scenario 3
)
```

Dependency JSON for scenario 1:
```json
{
"org": "org.apache.commons",
"name": "commons-lang3",
"version": "3.9",
"crossBuilt": false,
"scalaVersions": ["2.12", "2.13"],
"artifacts": [
{
"name": "commons-lang3.jar",
"hash": "sha1:0122c7cee69b53ed4a7681c03d4ee4c0e2765da5"
}
],
"configurations": [
"test",
"compile"
]
}
```

Dependency JSON for scenario 2 (Scala auto-library):
```json
[
{
"org": "org.scala-lang",
"name": "scala-library",
"version": "2.12.10",
"crossBuilt": false,
"scalaVersions": [
"2.12"
],
"artifacts": [
{
"name": "scala-library.jar",
"hash": "sha1:3509860bc2e5b3da001ed45aca94ffbe5694dbda"
}
],
"configurations": [
"test",
"compile"
]
},
{
"org": "org.scala-lang",
"name": "scala-library",
"version": "2.13.4",
"crossBuilt": false,
"scalaVersions": [
"2.13"
],
"artifacts": [
{
"name": "scala-library.jar",
"hash": "sha1:b6781c71dfe4a3d5980a514eec8a513f693ead95"
}
],
"configurations": [
"test",
"compile"
]
}
]
```

Dependency JSON for scenario 3:
```json
{
"org": "org.scala-lang.modules",
"name": "scala-xml",
"version": "1.2.0",
"crossBuilt": true,
"scalaVersions": ["2.12", "2.13"],
"artifacts": [
{
"name": "scala-xml_2.12.jar",
"hash": "sha1:5d38ac30beb8420dd395c0af447ba412158965e6",
"scalaVersion": "2.12"
},
{
"name": "scala-xml_2.13.jar",
"hash": "sha1:f6abd60d28c189f05183b26c5363713d1d126b83",
"scalaVersion": "2.13"
}
],
"configurations": [
"test"
]
}
```

## Example

```json
{
"lockVersion": 2,
"timestamp": "2021-05-11T12:00:00.000Z",
"configurations": [
"compile",
"test"
],
"scalaVersions": ["2.12", "2.13"],
"dependencies": [
{
"org": "org.apache.commons",
"name": "commons-lang3",
"version": "3.9",
"crossBuilt": false,
"scalaVersions": ["2.12", "2.13"],
"artifacts": [
{
"name": "commons-lang3.jar",
"hash": "sha1:0122c7cee69b53ed4a7681c03d4ee4c0e2765da5"
}
],
"configurations": [
"test",
"compile"
]
},
{
"org": "org.scala-lang",
"name": "scala-library",
"version": "2.12.10",
"crossBuilt": false,
"scalaVersions": ["2.12"],
"artifacts": [
{
"name": "scala-library.jar",
"hash": "sha1:3509860bc2e5b3da001ed45aca94ffbe5694dbda"
}
],
"configurations": [
"test",
"compile"
]
},
{
"org": "org.scala-lang",
"name": "scala-library",
"version": "2.13.4",
"crossBuilt": false,
"scalaVersions": ["2.13"],
"artifacts": [
{
"name": "scala-library.jar",
"hash": "sha1:b6781c71dfe4a3d5980a514eec8a513f693ead95"
}
],
"configurations": [
"test",
"compile"
]
},
{
"org": "org.scala-lang.modules",
"name": "scala-xml",
"version": "1.2.0",
"crossBuilt": true,
"scalaVersions": ["2.12", "2.13"],
"artifacts": [
{
"name": "scala-xml_2.12.jar",
"hash": "sha1:5d38ac30beb8420dd395c0af447ba412158965e6",
"scalaVersion": "2.12"
},
{
"name": "scala-xml_2.13.jar",
"hash": "sha1:f6abd60d28c189f05183b26c5363713d1d126b83",
"scalaVersion": "2.13"
}
],
"configurations": [
"test"
]
}
]

}
```
9 changes: 6 additions & 3 deletions src/main/resources/messages.properties
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ lock.status.artifacts.changed.singular=\ \ 1 dependency artifacts changed
lock.status.artifacts.changed.multiple=\ \ {0} dependency artifacts changed

# lockfile full status - configurations =======================================

lock.status.full.configs.added.none=
lock.status.full.configs.added.singular=\ \ 1 config added: {1}
lock.status.full.configs.added.multiple=\ \ {0} configs added: {1}
Expand All @@ -36,7 +35,6 @@ lock.status.full.configs.removed.singular=\ \ 1 config removed: {1}
lock.status.full.configs.removed.multiple=\ \ {0} configs removed: {1}

# lockfile full status - dependencies =========================================

lock.status.full.dependencies.added.none=
lock.status.full.dependencies.added.singular=\ \ 1 dependency added:\n{1}
lock.status.full.dependencies.added.multiple=\ \ {0} dependencies added:\n{1}
Expand All @@ -52,4 +50,9 @@ lock.status.full.dependencies.changed.multiple=\ \ {0} dependencies changed:\n{1
# lockfile full status - artifacts ============================================
lock.status.full.artifacts.changed.none=
lock.status.full.artifacts.changed.singular=\ \ 1 dependency artifacts changed
lock.status.full.artifacts.changed.multiple=\ \ {0} dependency artifacts changed
lock.status.full.artifacts.changed.multiple=\ \ {0} dependency artifacts changed

# error messages ==============================================================
error.lockfile.missing=no lockfile found - please run dependencyLockWrite
error.lockfile.invalid=invalid lockfile - please run dependencyLockWrite
error.lockfile.version=unsupported lockfile version {0}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,20 @@ import sbt.Keys._
import sbt._
import sbt.internal.util.ManagedLogger
import software.purpledragon.sbt.lock.DependencyLockUpdateMode._
import software.purpledragon.sbt.lock.model.{DependencyLockFile, LockFileMatches}
import software.purpledragon.sbt.lock.io.{DependencyLockIO, LockfileException}
import software.purpledragon.sbt.lock.model.LockFileMatches
import software.purpledragon.sbt.lock.model.lockfile.v1.DependencyLockFile
import software.purpledragon.sbt.lock.util.MessageUtil

import scala.util.{Failure, Success, Try}

object DependencyLockPlugin extends AutoPlugin {
override def trigger: PluginTrigger = allRequirements

object autoImport {
val dependencyLockFile = settingKey[File]("lockfile to generate")
val dependencyLockWrite = taskKey[File]("write dependencies to lockfile")
val dependencyLockRead = taskKey[Option[DependencyLockFile]]("read dependencies from lockfile")
val dependencyLockRead = taskKey[Try[DependencyLockFile]]("read dependencies from lockfile")

val dependencyLockCheck = taskKey[Unit]("check if dependency lock is up to date")

Expand Down Expand Up @@ -87,7 +91,7 @@ object DependencyLockPlugin extends AutoPlugin {
logger.debug("Automatically checking lockfile")

dependencyLockRead.value match {
case Some(currentFile) =>
case Success(currentFile) =>
val updatedFile = DependencyUtils.resolve(report, thisProject.value.configurations.map(_.toConfigRef))

val changes = currentFile.findChanges(updatedFile)
Expand All @@ -105,8 +109,12 @@ object DependencyLockPlugin extends AutoPlugin {
// scenario shouldn't happen - failed check, but we're not checking...
}

case None =>
logger.warn("no lockfile found - please run dependencyLockWrite")
case Failure(error: LockfileException) =>
logger.warn(error.getMessage)

case Failure(error) =>
logger.error("Unexpected error while parsing lockfile")
throw error
}
}

Expand Down
Loading