-
Notifications
You must be signed in to change notification settings - Fork 27
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
clean up deprecated methods in preparation of sbt 1.0, where these wi…
…ll be removed. This requires having separate sources for sbt 0.12 and 0.13. Code duplication, but that's okay, since we only need to maintain the basic functionality in sbt 0.12
- Loading branch information
Showing
35 changed files
with
4,795 additions
and
54 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -6,3 +6,4 @@ project/target | |
actual.txt | ||
expected.txt | ||
sbt-global | ||
structure-*-actual.xml |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
File renamed without changes.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
7 changes: 3 additions & 4 deletions
7
...s/sbt/extractors/StructureExtractor.scala → ...s/sbt/extractors/StructureExtractor.scala
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
File renamed without changes.
31 changes: 31 additions & 0 deletions
31
extractor/src/main/scala-sbt-0.13/org/jetbrains/sbt/adapters.scala
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
package org.jetbrains.sbt | ||
|
||
import sbt._ | ||
|
||
case class LoadedBuildUnitAdapter(delegate: LoadedBuildUnit) { | ||
def imports: Seq[String] = | ||
delegate.imports | ||
|
||
def pluginsClasspath: Seq[Attributed[File]] = | ||
delegate.unit.plugins.pluginData.dependencyClasspath | ||
} | ||
|
||
case class UpdateReportAdapter(configurationToModule: Map[String, Seq[ModuleReportAdapter]]) { | ||
def this(delegate: UpdateReport) { | ||
this(delegate.configurations.map { report => | ||
(report.configuration, report.modules.map(new ModuleReportAdapter(_))) | ||
}.toMap) | ||
} | ||
|
||
def allModules: Seq[ModuleReportAdapter] = | ||
configurationToModule.values.toSeq.flatten | ||
|
||
def modulesFrom(configuration: String): Seq[ModuleReportAdapter] = | ||
configurationToModule.getOrElse(configuration, Seq.empty) | ||
} | ||
|
||
case class ModuleReportAdapter(moduleId: ModuleID, artifacts: Seq[(Artifact, File)]) { | ||
def this(delegate: ModuleReport) { | ||
this(delegate.module, delegate.artifacts) | ||
} | ||
} |
134 changes: 134 additions & 0 deletions
134
...ctor/src/main/scala-sbt-0.13/org/jetbrains/sbt/extractors/AndroidSdkPluginExtractor.scala
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,134 @@ | ||
package org.jetbrains.sbt.extractors | ||
|
||
import java.io.File | ||
|
||
import org.jetbrains.sbt.structure.{Aar, AndroidData, ApkLib, BuildData, ConfigurationData, DependencyData, DirectoryData, ProjectData} | ||
import org.jetbrains.sbt.{SbtStateOps, TaskOps} | ||
import sbt._ | ||
|
||
import scala.language.reflectiveCalls | ||
|
||
|
||
object AndroidSdkPluginExtractor extends SbtStateOps with TaskOps { | ||
|
||
def taskDef: Def.Initialize[Task[Option[AndroidData]]] = | ||
(sbt.Keys.state, sbt.Keys.thisProjectRef) flatMap { (state, projectRef) => | ||
val keys = state.attributes.get(sbt.Keys.sessionSettings) match { | ||
case Some(SessionSettings(_, _, settings, _, _, _)) => settings map { _.key } | ||
case _ => Seq.empty | ||
} | ||
|
||
val manifestFileTaskOpt = Keys.processManifest.in(projectRef).find(state) | ||
.orElse(Keys.manifestPath.in(projectRef).find(state).map(_.toTask)) | ||
val layoutAsAnyOpt = findSettingKeyIn(keys, "projectLayout") | ||
.flatMap(_.in(projectRef).find(state)) | ||
val apklibsAsAnyTaskOpt = findTaskKeyIn(keys, "apklibs") | ||
.flatMap(_.in(projectRef).find(state)) | ||
val aarsAsAnyTaskOpt = findTaskKeyIn(keys, "aars") | ||
.flatMap(_.in(projectRef).find(state)) | ||
|
||
val androidTaskOpt = for { | ||
manifestTask <- manifestFileTaskOpt | ||
apk <- Keys.apkFile.in(projectRef).find(state) | ||
isLibrary <- Keys.libraryProject.in(projectRef).find(state) | ||
layoutAsAny <- layoutAsAnyOpt | ||
apklibsAsAnyTask <- apklibsAsAnyTaskOpt | ||
targetVersionTask <- Keys.settingOrTask[String](Keys.targetSdkVersionKey, projectRef, state) | ||
aarsAsAnyTask <- aarsAsAnyTaskOpt | ||
proguardConfigTask <- Keys.proguardConfig.in(projectRef).find(state) | ||
proguardOptionsTask <- Keys.settingOrTask[Seq[String]](Keys.proguardOptionsKey, projectRef, state) | ||
} yield { | ||
for { | ||
manifest <- manifestTask | ||
targetVersion <- targetVersionTask | ||
proguardConfig <- proguardConfigTask | ||
proguardOptions <- proguardOptionsTask | ||
apklibsAsAny <- apklibsAsAnyTask | ||
aarsAsAny <- aarsAsAnyTask | ||
} yield { | ||
try { | ||
val layout = layoutAsAny.asInstanceOf[ProjectLayout] | ||
val apklibs = apklibsAsAny.asInstanceOf[Seq[LibraryDependency]] | ||
val aars = aarsAsAny.asInstanceOf[Seq[LibraryDependency]].map(libraryDepToAar(targetVersion)) | ||
Some(AndroidData(targetVersion, manifest, apk, | ||
layout.res, layout.assets, layout.gen, layout.libs, | ||
isLibrary, proguardConfig ++ proguardOptions, | ||
apklibs.map(libraryDepToApkLib), aars)) | ||
} catch { | ||
case _ : NoSuchMethodException => None | ||
} | ||
} | ||
} | ||
|
||
androidTaskOpt.getOrElse(None.toTask) | ||
} | ||
|
||
private val Android = config("android") | ||
|
||
private object Keys { | ||
val targetSdkVersionKey = "target-sdk-version" | ||
val manifestPath: SettingKey[File] = SettingKey[File]("manifest-path").in(Android) | ||
val processManifest: TaskKey[File] = TaskKey[File]("process-manifest").in(Android) | ||
val apkFile: SettingKey[File] = SettingKey[File]("apk-file").in(Android) | ||
val libraryProject: SettingKey[Boolean] = SettingKey[Boolean]("library-project").in(Android) | ||
val proguardConfig: TaskKey[Seq[String]] = TaskKey[Seq[String]]("proguard-config").in(Android) | ||
val proguardOptionsKey = "proguard-options" | ||
|
||
def settingOrTask[A : Manifest](key: String, projectRef: ProjectRef, state: State): Option[Task[A]] = { | ||
TaskKey[A](key).in(Android).in(projectRef).find(state) | ||
.orElse(SettingKey[A](key).in(Android).in(projectRef).find(state).map(_.toTask)) | ||
} | ||
} | ||
|
||
private type ProjectLayout = { | ||
def base: File | ||
def res: File | ||
def assets: File | ||
def gen: File | ||
def bin: File | ||
def libs: File | ||
def sources: File | ||
def resources: File | ||
def manifest: File | ||
} | ||
|
||
private type LibraryDependency = { | ||
def layout: ProjectLayout | ||
def getName: String | ||
def getJarFile: File | ||
} | ||
|
||
private def findSettingKeyIn(keys: Seq[sbt.ScopedKey[_]], label: String): Option[SettingKey[Any]] = | ||
keys.find(k => k.key.label == label && isInAndroidScope(k)) | ||
.map(k => SettingKey(k.key.asInstanceOf[AttributeKey[Any]]).in(k.scope)) | ||
|
||
private def findTaskKeyIn(keys: Seq[sbt.ScopedKey[_]], label: String): Option[TaskKey[Any]] = | ||
keys.find(k => k.key.label == label && isInAndroidScope(k)) | ||
.map(k => TaskKey(k.key.asInstanceOf[AttributeKey[Task[Any]]]).in(k.scope)) | ||
|
||
private def libraryDepToApkLib(lib: LibraryDependency): ApkLib = { | ||
// As for version 1.5.0 android-sdk-plugin uses canonical path to library as its name | ||
val fixedLibName = lib.getName.split(File.separatorChar).last | ||
ApkLib(fixedLibName, lib.layout.base, lib.layout.manifest, lib.layout.sources, lib.layout.res, lib.layout.libs, lib.layout.gen) | ||
} | ||
|
||
private def libraryDepToAar(targetSdkVersion: String)(lib: LibraryDependency): Aar = { | ||
val fixedLibName = lib.getName.split(File.separatorChar).last | ||
val android = AndroidData(targetSdkVersion, lib.layout.manifest, lib.layout.base, | ||
lib.layout.res, lib.layout.assets, lib.layout.gen, lib.layout.libs, | ||
isLibrary = true, Nil, Nil, Nil) | ||
val project = ProjectData( | ||
fixedLibName, fixedLibName, "sbt-android-synthetic-organization", "0.1-SNAPSHOT-sbt-android", | ||
lib.layout.base, Nil, lib.layout.bin, BuildData(Nil, Nil, Nil, Nil), | ||
ConfigurationData("compile", | ||
Seq(DirectoryData(lib.layout.sources, managed = true)), | ||
Seq(DirectoryData(lib.layout.resources, managed = true)), Nil, lib.getJarFile) :: Nil, None, None, Some(android), | ||
DependencyData(Nil, Nil, Nil), Set.empty, None) | ||
Aar(fixedLibName, project) | ||
} | ||
|
||
private def isInAndroidScope(key: ScopedKey[_]) = key.scope.config match { | ||
case Select(k) => k.name == Android.name | ||
case _ => false | ||
} | ||
} |
38 changes: 38 additions & 0 deletions
38
extractor/src/main/scala-sbt-0.13/org/jetbrains/sbt/extractors/BuildExtractor.scala
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
package org.jetbrains.sbt.extractors | ||
|
||
import java.io.File | ||
|
||
import org.jetbrains.sbt.{LoadedBuildUnitAdapter, SbtStateOps, StructureKeys, TaskOps, UpdateReportAdapter} | ||
import org.jetbrains.sbt.structure.BuildData | ||
import sbt._ | ||
|
||
/** | ||
* @author Nikolay Obedin | ||
* @since 4/10/15. | ||
*/ | ||
class BuildExtractor(unit: LoadedBuildUnitAdapter, updateSbtClassifiers: Option[UpdateReportAdapter]) { | ||
private[extractors] def extract: BuildData = { | ||
val (docs, sources) = extractSbtClassifiers | ||
BuildData(unit.imports, unit.pluginsClasspath.map(_.data), docs, sources) | ||
} | ||
|
||
private def extractSbtClassifiers: (Seq[File], Seq[File]) = | ||
updateSbtClassifiers.map { updateReport => | ||
val allArtifacts = updateReport.allModules.flatMap(_.artifacts) | ||
def artifacts(kind: String) = allArtifacts.filter(_._1.`type` == kind).map(_._2).distinct | ||
(artifacts(Artifact.DocType), artifacts(Artifact.SourceType)) | ||
}.getOrElse((Seq.empty, Seq.empty)) | ||
} | ||
|
||
object BuildExtractor extends SbtStateOps with TaskOps { | ||
def taskDef: Def.Initialize[Task[BuildData]] = | ||
(sbt.Keys.state, sbt.Keys.thisProjectRef, StructureKeys.sbtStructureOpts) flatMap { | ||
(state, projectRef, options) => | ||
val unit = LoadedBuildUnitAdapter(structure(state).units(projectRef.build)) | ||
Keys.updateSbtClassifiers.in(projectRef).get(state) | ||
.onlyIf(options.download && options.resolveSbtClassifiers) | ||
.map { updateClassifiersOpt => | ||
new BuildExtractor(unit, updateClassifiersOpt.map(new UpdateReportAdapter(_))).extract | ||
} | ||
} | ||
} |
Oops, something went wrong.