2017-10-04 19:01:06 +02:00
|
|
|
/*
|
|
|
|
|
* sbt
|
|
|
|
|
* Copyright 2011 - 2017, Lightbend, Inc.
|
|
|
|
|
* Copyright 2008 - 2010, Mark Harrah
|
|
|
|
|
* Licensed under BSD-3-Clause license (see LICENSE)
|
|
|
|
|
*/
|
|
|
|
|
|
2014-06-25 21:19:17 +02:00
|
|
|
package sbt
|
|
|
|
|
|
|
|
|
|
import java.io._
|
|
|
|
|
|
|
|
|
|
import org.specs2.mutable.Specification
|
2016-05-07 01:21:13 +02:00
|
|
|
import sbt.internal._
|
2017-04-21 09:14:31 +02:00
|
|
|
import sbt.internal.util.{
|
|
|
|
|
AttributeEntry,
|
|
|
|
|
AttributeMap,
|
|
|
|
|
ConsoleOut,
|
|
|
|
|
GlobalLogging,
|
|
|
|
|
MainAppender,
|
|
|
|
|
Settings
|
|
|
|
|
}
|
2018-06-04 12:14:38 +02:00
|
|
|
import sbt.util.Logger
|
2015-09-11 11:00:34 +02:00
|
|
|
|
2016-07-08 04:23:20 +02:00
|
|
|
object PluginCommandTestPlugin0 extends AutoPlugin { override def requires = empty }
|
2014-06-25 21:19:17 +02:00
|
|
|
|
|
|
|
|
package subpackage {
|
|
|
|
|
|
2016-07-08 04:23:20 +02:00
|
|
|
object PluginCommandTestPlugin1 extends AutoPlugin { override def requires = empty }
|
2014-06-25 21:19:17 +02:00
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
object PluginCommandTest extends Specification {
|
|
|
|
|
sequential
|
|
|
|
|
|
|
|
|
|
import subpackage._
|
|
|
|
|
import FakeState._
|
|
|
|
|
|
|
|
|
|
"The `plugin` command" should {
|
|
|
|
|
|
|
|
|
|
"should work for plugins within nested in one package" in {
|
2018-04-24 17:12:10 +02:00
|
|
|
val output = processCommand(
|
|
|
|
|
"plugin sbt.PluginCommandTestPlugin0",
|
|
|
|
|
PluginCommandTestPlugin0,
|
|
|
|
|
PluginCommandTestPlugin1
|
|
|
|
|
)
|
2014-06-25 21:19:17 +02:00
|
|
|
output must contain("sbt.PluginCommandTestPlugin0 is activated.")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
"should work for plugins nested more than one package" in {
|
2018-04-24 17:12:10 +02:00
|
|
|
val output = processCommand(
|
|
|
|
|
"plugin sbt.subpackage.PluginCommandTestPlugin1",
|
|
|
|
|
PluginCommandTestPlugin0,
|
|
|
|
|
PluginCommandTestPlugin1
|
|
|
|
|
)
|
2014-06-25 21:19:17 +02:00
|
|
|
output must contain("sbt.subpackage.PluginCommandTestPlugin1 is activated.")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
"suggest a plugin when given an incorrect plugin with a similar name" in {
|
2018-04-24 17:12:10 +02:00
|
|
|
val output = processCommand(
|
|
|
|
|
"plugin PluginCommandTestPlugin0",
|
|
|
|
|
PluginCommandTestPlugin0,
|
|
|
|
|
PluginCommandTestPlugin1
|
|
|
|
|
)
|
2014-06-25 21:19:17 +02:00
|
|
|
output must contain(
|
|
|
|
|
"Not a valid plugin: PluginCommandTestPlugin0 (similar: sbt.PluginCommandTestPlugin0, sbt.subpackage.PluginCommandTestPlugin1)"
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
object FakeState {
|
|
|
|
|
|
|
|
|
|
def processCommand(input: String, enabledPlugins: AutoPlugin*): String = {
|
|
|
|
|
val previousOut = System.out
|
|
|
|
|
val outBuffer = new ByteArrayOutputStream
|
|
|
|
|
try {
|
|
|
|
|
System.setOut(new PrintStream(outBuffer, true))
|
|
|
|
|
val state = FakeState(enabledPlugins: _*)
|
2017-01-20 17:28:00 +01:00
|
|
|
MainLoop.processCommand(Exec(input, None), state)
|
2014-06-25 21:19:17 +02:00
|
|
|
new String(outBuffer.toByteArray)
|
|
|
|
|
} finally {
|
|
|
|
|
System.setOut(previousOut)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
def apply(plugins: AutoPlugin*) = {
|
|
|
|
|
|
|
|
|
|
val base = new File("").getAbsoluteFile
|
|
|
|
|
val testProject = Project("test-project", base).setAutoPlugins(plugins)
|
|
|
|
|
|
|
|
|
|
val settings: Seq[Def.Setting[_]] = Nil
|
|
|
|
|
|
|
|
|
|
val currentProject = Map(testProject.base.toURI -> testProject.id)
|
|
|
|
|
val currentEval: () => sbt.compiler.Eval = () => Load.mkEval(Nil, base, Nil)
|
2017-04-21 09:14:31 +02:00
|
|
|
val sessionSettings =
|
|
|
|
|
SessionSettings(base.toURI, currentProject, Nil, Map.empty, Nil, currentEval)
|
2014-06-25 21:19:17 +02:00
|
|
|
|
|
|
|
|
val delegates: (Scope) => Seq[Scope] = _ => Nil
|
|
|
|
|
val scopeLocal: Def.ScopeLocal = _ => Nil
|
|
|
|
|
|
|
|
|
|
val data: Settings[Scope] = Def.make(settings)(delegates, scopeLocal, Def.showFullKey)
|
2017-04-21 09:14:31 +02:00
|
|
|
val extra: KeyIndex => BuildUtil[_] = (keyIndex) =>
|
|
|
|
|
BuildUtil(base.toURI, Map.empty, keyIndex, data)
|
2018-06-04 12:14:38 +02:00
|
|
|
val structureIndex: StructureIndex =
|
2018-08-06 05:18:13 +02:00
|
|
|
Load.structureIndex(data, settings, extra, Map.empty)
|
2014-06-25 21:19:17 +02:00
|
|
|
val streams: (State) => BuildStreams.Streams = null
|
|
|
|
|
|
|
|
|
|
val loadedDefinitions: LoadedDefinitions = new LoadedDefinitions(
|
2017-04-21 09:14:31 +02:00
|
|
|
base,
|
|
|
|
|
Nil,
|
|
|
|
|
ClassLoader.getSystemClassLoader,
|
|
|
|
|
Nil,
|
|
|
|
|
Seq(testProject),
|
|
|
|
|
Nil
|
2014-06-25 21:19:17 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
val pluginData = PluginData(Nil, Nil, None, None, Nil)
|
2016-03-29 19:11:42 +02:00
|
|
|
val builds: DetectedModules[BuildDef] = new DetectedModules[BuildDef](Nil)
|
2014-06-25 21:19:17 +02:00
|
|
|
|
2017-04-21 09:14:31 +02:00
|
|
|
val detectedAutoPlugins: Seq[DetectedAutoPlugin] =
|
|
|
|
|
plugins.map(p => DetectedAutoPlugin(p.label, p, hasAutoImport = false))
|
2016-06-19 22:37:10 +02:00
|
|
|
val detectedPlugins = new DetectedPlugins(detectedAutoPlugins, builds)
|
2017-04-21 09:14:31 +02:00
|
|
|
val loadedPlugins =
|
|
|
|
|
new LoadedPlugins(base, pluginData, ClassLoader.getSystemClassLoader, detectedPlugins)
|
2014-06-25 21:19:17 +02:00
|
|
|
val buildUnit = new BuildUnit(base.toURI, base, loadedDefinitions, loadedPlugins)
|
|
|
|
|
|
|
|
|
|
val (partBuildUnit: PartBuildUnit, _) = Load.loaded(buildUnit)
|
|
|
|
|
val loadedBuildUnit = Load.resolveProjects(base.toURI, partBuildUnit, _ => testProject.id)
|
|
|
|
|
|
|
|
|
|
val units = Map(base.toURI -> loadedBuildUnit)
|
2018-04-24 17:12:10 +02:00
|
|
|
val buildStructure = new BuildStructure(
|
|
|
|
|
units,
|
|
|
|
|
base.toURI,
|
|
|
|
|
settings,
|
|
|
|
|
data,
|
|
|
|
|
structureIndex,
|
|
|
|
|
streams,
|
|
|
|
|
delegates,
|
|
|
|
|
scopeLocal
|
|
|
|
|
)
|
2014-06-25 21:19:17 +02:00
|
|
|
|
|
|
|
|
val attributes = AttributeMap.empty ++ AttributeMap(
|
|
|
|
|
AttributeEntry(Keys.sessionSettings, sessionSettings),
|
|
|
|
|
AttributeEntry(Keys.stateBuildStructure, buildStructure)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
State(
|
|
|
|
|
null,
|
|
|
|
|
Seq(BuiltinCommands.plugin),
|
|
|
|
|
Set.empty,
|
|
|
|
|
None,
|
2016-12-07 19:22:34 +01:00
|
|
|
List(),
|
2014-06-25 21:19:17 +02:00
|
|
|
State.newHistory,
|
|
|
|
|
attributes,
|
2018-04-24 17:12:10 +02:00
|
|
|
GlobalLogging.initial(
|
|
|
|
|
MainAppender.globalDefault(ConsoleOut.systemOut),
|
|
|
|
|
File.createTempFile("sbt", ".log"),
|
|
|
|
|
ConsoleOut.systemOut
|
|
|
|
|
),
|
2016-12-07 19:22:34 +01:00
|
|
|
None,
|
2014-06-25 21:19:17 +02:00
|
|
|
State.Continue
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|