Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Updating to sbt 1.x #11

Merged
merged 17 commits into from
Oct 10, 2017
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
4 changes: 2 additions & 2 deletions build.sbt
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
lazy val `sbt-release-early` = project
.in(file("."))
.settings(ScriptedPlugin.scriptedSettings)
.settings(
sbtPlugin := true,
pgpPublicRing := file("/drone/.gnupg/pubring.asc"),
pgpSecretRing := file("/drone/.gnupg/secring.asc"),
scalaVersion := "2.10.6",
scalaVersion := "2.12.3",
sbtVersion in Global := "1.0.2",
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If the plan is to cross publish for both sbt 0.13 and sbt 1.0 I suggest to replacing these with

    crossSbtVersions := List("0.13.16", "1.0.2"),
    scalaVersion := {
      (sbtBinaryVersion in pluginCrossBuild).value match {
        case "0.13" => "2.10.6"
        case _ => "2.12.3"
      }
    },

Copy link
Collaborator Author

@laughedelic laughedelic Oct 3, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't know what's @jvican's plan, but I actually don't see any point in cross publishing for 0.13 and 1.0 (now that 1.0 has been released). Especially if the code needs to be altered, it only makes it harder to maintain.
And if some users are "stuck" on sbt 0.13, they can happily use previous version of the plugin until they are ready to upgrade.

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, let's not cross-build. If this really becomes a problem for users, we can rethink it in the future. Those stuck in 0.13.x can use 1.2.

This decision will obviously require a 2.0 release.

addSbtPlugin("org.foundweekends" % "sbt-bintray" % "0.5.1"),
addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.1.0"),
addSbtPlugin("com.dwijnand" % "sbt-dynver" % "2.0.0"),
Expand Down
6 changes: 4 additions & 2 deletions project/BuildPlugin.scala
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ object BuildPlugin extends AutoPlugin {
}

object BuildDefaults {
import sbt.{url, file, richFile}
import sbt.url
import sbt.io.syntax.fileToRichFile
import sbt.{ScmInfo, Developer, Resolver, ThisBuild, Watched, Compile, Test}

// This should be added to upstream sbt.
Expand Down Expand Up @@ -55,7 +56,8 @@ object BuildDefaults {
Keys.organization := "ch.epfl.scala",
Keys.resolvers += Resolver.jcenterRepo,
Keys.resolvers += Resolver.bintrayIvyRepo("scalacenter", "sbt-releases"),
Keys.updateOptions := Keys.updateOptions.value.withCachedResolution(true)
Keys.updateOptions := Keys.updateOptions.value.withCachedResolution(true),
Keys.publishArtifact in (Compile, Keys.packageDoc) := false
)

final val projectSettings: Seq[Def.Setting[_]] = Seq(
Expand Down
2 changes: 1 addition & 1 deletion project/build.properties
Original file line number Diff line number Diff line change
@@ -1 +1 @@
sbt.version = 0.13.16
sbt.version = 1.0.2
2 changes: 1 addition & 1 deletion project/plugins.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ logLevel := Level.Warn
resolvers += Classpaths.sbtPluginReleases
resolvers += Resolver.bintrayIvyRepo("scalaplatform", "tools")

libraryDependencies += "org.scala-sbt" % "scripted-plugin" % sbtVersion.value
libraryDependencies += "org.scala-sbt" %% "scripted-plugin" % sbtVersion.value

// This project is its own plugin :)
unmanagedSourceDirectories in Compile +=
Expand Down
119 changes: 53 additions & 66 deletions src/main/scala/ch/epfl/scala/sbt/release/ReleaseEarlyPlugin.scala
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ object ReleaseEarly {

/* Sbt bug: `Def.sequential` here produces 'Illegal dynamic reference' when
* used inside `Def.taskDyn`. This is reported upstream, unclear if it can be fixed. */
private val StableDef = new sbt.TaskSequential {}
private val StableDef = new sbt.internal.TaskSequential {}
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that the part where this is used could be simplified:

https://github.com/scalacenter/sbt-release-early/blob/a76ab921a6523f834dbbfc33a6a0659856c954b7/src/main/scala/ch/epfl/scala/sbt/release/ReleaseEarlyPlugin.scala#L294-L302

Could you explain the logic behind this code? You want to run all tasks from the releaseEarlyProcess sequence and return a unit, right?

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This code gets a sequence of tasks that may or may not have been modified by users and execute them inside a dynamic task via sequential. The return type is always ()

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I simplified it just a bit: 7af1257. Couldn't do anything about that strange StableDef thing, but I found the issue you mention in the comment.


// See https://github.com/dwijnand/sbt-dynver/issues/23.
val isSnapshot: Def.Initialize[Boolean] = Def.setting {
Expand All @@ -144,18 +144,18 @@ object ReleaseEarly {
} else currentPassword
}

val releaseEarlyPublishTo: Def.Initialize[Option[sbt.Resolver]] = {
Def.setting {
val releaseEarlyPublishTo: Def.Initialize[Task[Option[sbt.Resolver]]] = {
Def.taskDyn {
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this a task instead of a dynamic setting?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Because in sbt-1.0 publisTo became a task.

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I really wonder why. I just went throught the code in sbt-bintray and sbt-sonatype and they don't seem to need this to be a task. The default code in sbt defaults to None. @dwijnand Sorry for bothering, but do you know anything about the reason for this signature change?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Alright, makes sense. @dwijnand No need for you to intervene!

// It is not necessary to use a dynamic setting here.
val logger = Keys.sLog.value
if (PrivateKeys.releaseEarlyIsSonatype.value) {
if (PrivateKeys.releaseEarlyIsSonatype.value) Def.task {
// Sonatype requires instrumentation of publishTo to work.
// Reference: https://github.com/xerial/sbt-sonatype#buildsbt
val projectVersion = Keys.version.value
if (isOldSnapshot(projectVersion))
logger.error(Feedback.UnrecognisedPublisher)
Some(sbt.Opts.resolver.sonatypeStaging)
} else (Keys.publishTo in Bintray.bintray).value
} else (Keys.publishTo in Bintray.bintray)
}
}

Expand Down Expand Up @@ -229,7 +229,7 @@ object ReleaseEarly {
Pgp.PgpKeys.publishSigned
// Else, use the normal hijacked bintray publish task
else Keys.publish
} dependsOn (Bintray.bintrayEnsureLicenses)
}

private def sonatypeRelease(state: sbt.State): Def.Initialize[Task[Unit]] = {
// sbt-sonatype needs these task to run sequentially :(
Expand All @@ -239,7 +239,7 @@ object ReleaseEarly {
logger.info(Feedback.logReleaseSonatype(projectName))
// Trick to make sure that 'sonatypeRelease' does not change the name
import Sonatype.{sonatypeRelease => _, sonatypeOpen => _}
val toRun = s";sonatypeOpen $projectName;publishSigned;sonatypeRelease"
val toRun = s";sonatypeOpen $projectName;$projectName/publishSigned;sonatypeRelease"
Copy link
Collaborator Author

@laughedelic laughedelic Oct 9, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So this was the fix for that CI failure? Another sbt scoping trap...

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, it was a legit issue... once you go the command way, you need to manually speciify which command you really meant. Glad I found this, it was a real bug.

runCommandAndRemaining(toRun)(state)
()
}
Expand All @@ -250,7 +250,6 @@ object ReleaseEarly {
* Both have to be executed one after the other on and exclusively,
* meaning that concurrency is not accepted. */
val releaseEarlyClose: Def.Initialize[Task[Unit]] = Def.taskDyn {
val state = Keys.state.value
val logger = Keys.streams.value.log
val projectName = Keys.name.value
if (!PrivateKeys.releaseEarlyIsSonatype.value) {
Expand Down Expand Up @@ -282,13 +281,10 @@ object ReleaseEarly {
val msg = Feedback.skipRelease(Keys.name.value)
Def.task(logger.info(msg))
} else {
logger.info(Feedback.logReleaseEarly(Keys.name.value))
val steps = ThisPluginKeys.releaseEarlyProcess.value
// Return task with unit value at the end
val initializedSteps = steps.map(_.toTask)
Def.taskDyn {
logger.info(Feedback.logReleaseEarly(Keys.name.value))
StableDef.sequential(initializedSteps, Def.task(()))
}
StableDef.sequential(steps.map(_.toTask), Def.task(()))
}
}

Expand Down Expand Up @@ -322,8 +318,7 @@ object ReleaseEarly {
val releaseEarlyEnableSyncToMaven: Def.Initialize[Boolean] =
Def.setting(true)

val releaseEarlyNoGpg: Def.Initialize[Boolean] =
Def.setting(false)
val releaseEarlyNoGpg: Def.Initialize[Boolean] = Def.setting(false)

val releaseEarlySyncToMaven: Def.Initialize[Task[Unit]] = {
Def.taskDyn {
Expand Down Expand Up @@ -380,71 +375,61 @@ trait Helper {
)
}

def checkRequirementsTask: Def.Initialize[Task[Unit]] = Def.task {
def checkRequirementsTask: Def.Initialize[Task[Unit]] = Def.taskDyn {
import ReleaseEarlyPlugin.{autoImport => ThisPluginKeys}
import scala.util.control.Exception.catching

val logger = Keys.streams.value.log
val projectName = Keys.name.value
val useSonatype = PrivateKeys.releaseEarlyIsSonatype.value

logger.info(Feedback.logCheckRequirements(projectName))

val bintrayCredentials = {
if (useSonatype) {
logger.debug(Feedback.skipBintrayCredentialsCheck(projectName))
None
} else {
catching(classOf[NoSuchElementException])
.opt(bintray.BintrayKeys.bintrayEnsureCredentials.value)
}
def check(checks: (Boolean, String)*): Unit = {
val errors = checks.collect { case (true, feedback) => logger.error(feedback) }
if (errors.nonEmpty) sys.error(Feedback.fixRequirementErrors)
}

val sonatypeCredentials = {
if (useSonatype) {
getSonatypeCredentials.orElse {
// Get extra credentials from optional environment variables
val extraCredentials = getExtraSonatypeCredentials
extraCredentials.foreach(persistExtraSonatypeCredentials)
extraCredentials
}
} else {
logger.debug(Feedback.skipBintrayCredentialsCheck(projectName))
None
// Using Sonatype publisher
if (PrivateKeys.releaseEarlyIsSonatype.value) Def.task {
logger.debug(Feedback.skipBintrayCredentialsCheck(projectName))
val sonatypeCredentials = getSonatypeCredentials.orElse {
// Get extra credentials from optional environment variables
val extraCredentials = getExtraSonatypeCredentials
extraCredentials.foreach(persistExtraSonatypeCredentials)
extraCredentials
}
}

// If not interactive, it means input has to come from environment
val missingBintrayCredentials = !useSonatype && bintrayCredentials.isEmpty
val missingSonatypeCredentials = (
// True if sonatype is the underlying publisher
useSonatype && (
// Or if Bintray publishes a stable version under interactive mode
val missingSonatypeCredentials = {
sonatypeCredentials.isEmpty &&
!Keys.isSnapshot.value &&
sonatypeCredentials.isEmpty &&
!Keys.state.value.interactive
!Keys.state.value.interactive
}

val sonatypeInconsistentState = ThisPluginKeys.releaseEarlyNoGpg.value
check(
(missingSonatypeCredentials, Feedback.missingSonatypeCredentials),
(sonatypeInconsistentState, Feedback.SonatypeInconsistentGpgState)
)
)

val ignoreGpg = ReleaseEarlyPlugin.autoImport.releaseEarlyNoGpg.value
val syncToMaven = ReleaseEarlyPlugin.autoImport.releaseEarlyEnableSyncToMaven.value
val bintrayInconsistentState = !useSonatype && syncToMaven && ignoreGpg
val sonatypeInconsistentState = useSonatype && ignoreGpg
// Using Bintray publisher
} else Def.task {
val missingBintrayCredentials = {
catching(classOf[NoSuchElementException])
.opt(bintray.BintrayKeys.bintrayEnsureCredentials.value)
.isEmpty
}

val Checks = List(
(missingBintrayCredentials, Feedback.missingBintrayCredentials),
(missingSonatypeCredentials, Feedback.missingSonatypeCredentials),
(bintrayInconsistentState, Feedback.BintrayInconsistentGpgState),
(sonatypeInconsistentState, Feedback.SonatypeInconsistentGpgState)
)
val bintrayInconsistentState =
ThisPluginKeys.releaseEarlyEnableSyncToMaven.value &&
ThisPluginKeys.releaseEarlyNoGpg.value

val hasErrors = Checks.foldLeft(false) {
case (hasError, (predicate, feedback)) =>
if (predicate) { logger.error(feedback); true } else hasError
check(
(missingBintrayCredentials, Feedback.missingBintrayCredentials),
(bintrayInconsistentState, Feedback.BintrayInconsistentGpgState)
)
}

if (hasErrors) sys.error(Feedback.fixRequirementErrors)
}

def validatePomTask: Def.Initialize[Task[Unit]] = Def.task {
def validatePomTask: Def.Initialize[Task[Unit]] = Def.taskDyn {
val logger = Keys.streams.value.log
logger.info(Feedback.logValidatePom(Keys.name.value))

Expand All @@ -463,10 +448,12 @@ trait Helper {
} else hasError
}

if (hasErrors) sys.error(Feedback.fixRequirementErrors)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why has this new line be added here?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just some freestyle formatting 😜 I just noticed that you have a scalafmt.conf, but the plugin is not included. Should I apply scalafmt formatting?

Ah, and this line was moved from below to be called before that resulting def-task is returned. If it fails here, it doesn't change anything, so I needed to move it.

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But don't we have now two repeated lines in the same source? This is a new addition, it does not replace or remove anything. The same line seems to exist in checkRequirementsTask.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure I understand. This is in the validatePomTask. This line is similar to the one in checkRequirementsTask, but does a different check. So both tasks have a if (hasErrors) sys.error line. In this function I moved the line from here.


// Ensure licenses before releasing
val useBintray = !PrivateKeys.releaseEarlyIsSonatype.value
if (useBintray) bintray.BintrayKeys.bintrayEnsureLicenses.value
if (hasErrors) sys.error(Feedback.fixRequirementErrors)
if (useBintray) bintray.BintrayKeys.bintrayEnsureLicenses
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this check is unnecessarily duplicated in releaseEarlyPublish:

https://github.com/scalacenter/sbt-release-early/blob/584cf9eae646baf87d9869a7de328f0970eb9a45/src/main/scala/ch/epfl/scala/sbt/release/ReleaseEarlyPlugin.scala#L244

Does it mean that it checks it even for sonatype?

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Given that we're already doing the checks in the right place, that line should be deleted 😉

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done in 77b7b70

else Def.task(())
}

def runCommandAndRemaining(command: String): State => State = { st: State =>
Expand All @@ -480,7 +467,7 @@ trait Helper {
nextState.remainingCommands.toList match {
case Nil => nextState
case head :: tail =>
runCommand(head, nextState.copy(remainingCommands = tail))
runCommand(head.commandLine, nextState.copy(remainingCommands = tail))
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh wow, this is weird. Why is this required?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think before it took a String, but now it's an Exec. I'm not familiar with this stuff, I tried .toString here, it didn't work, so I replaced it with .commandLine, but I still don't have much idea about it. Sorry 🤷‍♂️

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll have a closer look then, don't worry!

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

}
}
runCommand(command, st.copy(remainingCommands = Nil))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,13 +59,13 @@ lazy val p1 = project
.in(file("p1"))
.settings(requiredSettings)
.settings(scriptedTest)
.settings(scalaVersion := "2.11.8")
.settings(scalaVersion := "2.11.11")

lazy val p2 = project
.in(file("p2"))
.settings(scriptedTest)
.settings(requiredSettings)
.settings(scalaVersion := "2.11.8")
.settings(scalaVersion := "2.11.11")

val allowed = "0123456789abcdef"
val randomVersion =
Expand All @@ -84,7 +84,7 @@ randomizeVersion in ThisBuild := {
val newRandomVersion = s"v0.2.0+1-$randomVersion"
logger.info(s"Adding random version to test git tag: $newRandomVersion")
val process =
sbt.Process(s"""git tag -a $newRandomVersion -m hehe""",
sys.process.Process(s"""git tag -a $newRandomVersion -m hehe""",
Option(baseDirectory.in(ThisBuild).value))
assert(process.! == 0)
}
9 changes: 6 additions & 3 deletions src/sbt-test/sbt-release-early/example-bintray/build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ lazy val publishSettings = Seq(
bintrayPackageLabels := Seq("scala", "scalacenter", "plugin", "sbt"),
publishTo := (publishTo in bintray).value,
publishArtifact in Test := false,
// Disable publishing of docs and sources
publishArtifact in (Compile, packageDoc) := false,
publishArtifact in (Compile, packageSrc) := false,
licenses := Seq(
// Scala Center license... BSD 3-clause
"BSD" -> url("http://opensource.org/licenses/BSD-3-Clause")
Expand Down Expand Up @@ -56,13 +59,13 @@ lazy val p1 = project
.in(file("p1"))
.settings(requiredSettings)
.settings(scriptedTest)
.settings(scalaVersion := "2.11.8")
.settings(scalaVersion := "2.11.11")

lazy val p2 = project
.in(file("p2"))
.settings(scriptedTest)
.settings(requiredSettings)
.settings(scalaVersion := "2.11.8")
.settings(scalaVersion := "2.11.11")

val allowed = "0123456789abcdef"
val randomVersion =
Expand All @@ -81,7 +84,7 @@ randomizeVersion in ThisBuild := {
val newRandomVersion = s"v0.2.0+1-$randomVersion"
logger.info(s"Adding random version to test git tag: $newRandomVersion")
val process =
sbt.Process(s"""git tag -a $newRandomVersion -m hehe""",
sys.process.Process(s"""git tag -a $newRandomVersion -m hehe""",
Option(baseDirectory.in(ThisBuild).value))
assert(process.! == 0)
}
9 changes: 6 additions & 3 deletions src/sbt-test/sbt-release-early/example-sonatype/build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ lazy val publishSettings = Seq(
pgpSecretRing := file("/drone/.gnupg/secring.asc"),
releaseEarlyWith := SonatypePublisher,
publishArtifact in Test := false,
// Disable publishing of docs and sources
publishArtifact in (Compile, packageDoc) := false,
publishArtifact in (Compile, packageSrc) := false,
licenses := Seq(
// Scala Center license... BSD 3-clause
"BSD" -> url("http://opensource.org/licenses/BSD-3-Clause")
Expand Down Expand Up @@ -55,13 +58,13 @@ lazy val p1 = project
.in(file("p1"))
.settings(requiredSettings)
.settings(scriptedTest)
.settings(scalaVersion := "2.11.8")
.settings(scalaVersion := "2.11.11")

lazy val p2 = project
.in(file("p2"))
.settings(scriptedTest)
.settings(requiredSettings)
.settings(scalaVersion := "2.11.8")
.settings(scalaVersion := "2.11.11")

val allowed = "0123456789abcdef"
val randomVersion =
Expand All @@ -80,7 +83,7 @@ randomizeVersion in ThisBuild := {
val newRandomVersion = s"v0.2.0+1-$randomVersion"
logger.info(s"Adding random version to test git tag: $newRandomVersion")
val process =
sbt.Process(s"""git tag -a $newRandomVersion -m hehe""",
sys.process.Process(s"""git tag -a $newRandomVersion -m hehe""",
Option(baseDirectory.in(ThisBuild).value))
assert(process.! == 0)
}
3 changes: 2 additions & 1 deletion src/sbt-test/sbt-release-early/example-sonatype/test
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,5 @@ $ exec git tag -a v0.1.0 -m "v0.1.0"
> randomizeVersion
> reload
> show version
> releaseEarly
> p1/releaseEarly
> p2/releaseEarly
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
logLevel := Level.Warn
addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.0.0")

{
val pluginVersion = System.getProperty("plugin.version")
if(pluginVersion == null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@ bintrayRepository := "releases"
bintrayPackage := "root-example"
publishTo := (publishTo in bintray).value

// Disable publishing of docs and sources
publishArtifact in (Compile, packageDoc) := false
publishArtifact in (Compile, packageSrc) := false

// Release early
releaseEarlyEnableLocalReleases := true

Expand All @@ -49,7 +53,7 @@ randomizeVersion in ThisBuild := {
val newRandomVersion = s"v0.2.0+1-$randomVersion"
logger.info(s"Adding random version to test git tag: $newRandomVersion")
val process =
sbt.Process(s"""git tag -a $newRandomVersion -m hehe""",
sys.process.Process(s"""git tag -a $newRandomVersion -m hehe""",
Option(baseDirectory.in(ThisBuild).value))
assert(process.! == 0)
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,3 @@
logLevel := Level.Warn
addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.0.0")

{
val pluginVersion = System.getProperty("plugin.version")
if(pluginVersion == null)
Expand Down
Loading