[automerger] Merge "Improve DiffAndDocs" into oc-mr1-support-27.0-dev am: c7f9ed6330 am: 5fea9cc3ba
Change-Id: I45ae9d773c33096d7c4133ede3dd3fe87c622a65
diff --git a/app-toolkit/init.gradle b/app-toolkit/init.gradle
index 1bf6f98..4a334b6 100644
--- a/app-toolkit/init.gradle
+++ b/app-toolkit/init.gradle
@@ -15,15 +15,10 @@
*/
import android.support.DacOptions
-import android.support.LibraryVersions
import org.gradle.internal.os.OperatingSystem
-ext.inAppToolkitProject = rootProject.name == "app-toolkit"
-
-if (ext.inAppToolkitProject) {
- apply from: "${ext.supportRootFolder}/buildSrc/init.gradle"
- init.setSdkInLocalPropertiesFile()
-}
+apply from: "${ext.supportRootFolder}/buildSrc/init.gradle"
+init.setSdkInLocalPropertiesFile()
apply from: "${ext.supportRootFolder}/app-toolkit/dependencies.gradle"
@@ -31,19 +26,13 @@
def buildServerAnchorTask = rootProject.tasks.create(name : "runBuildServerCompilationTasks",
description: "Anchor task for everything we want to run in build server.")
-if (ext.inAppToolkitProject) {
- // always build offline docs for flatfoot specific builds.
- ext.docsDac = new DacOptions("android/arch", "ARCH_DATA")
- repos.addMavenRepositories(repositories)
- init.setupRepoOutAndBuildNumber()
- init.configureSubProjects()
- init.setupRelease()
- init.enableDoclavaAndJDiff(this)
- rootProject.tasks["generateDocs"].exclude '**/R.java'
-}
-
-ext.testApkDistOut = distDir
-ext.testResultsDistDir = new File(distDir, "host-test-reports")
+repos.addMavenRepositories(repositories)
+init.setupRepoOutAndBuildNumber()
+init.configureSubProjects()
+init.setupRelease()
+// always build offline docs for flatfoot specific builds.
+init.enableDoclavaAndJDiff(this, new DacOptions("android/arch", "ARCH_DATA"))
+rootProject.tasks["generateDocs"].exclude '**/R.java'
// flatfoot docs
def zipFlatfootDocsTask = rootProject.tasks.create(name : "createFlatfootDocsArchive", type : Zip) {
@@ -58,8 +47,6 @@
buildServerAnchorTask.dependsOn createArchive
subprojects {
- repos.addMavenRepositories(project.repositories)
-
project.tasks.whenTaskAdded { task ->
if (task.name.startsWith("assembleAndroidTest")) {
buildServerAnchorTask.dependsOn task
diff --git a/build.gradle b/build.gradle
index 560bbda..7bbeb56 100644
--- a/build.gradle
+++ b/build.gradle
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+import android.support.DacOptions
buildscript {
ext.supportRootFolder = project.projectDir
@@ -39,7 +40,7 @@
init.setupRelease()
-init.enableDoclavaAndJDiff(this)
+init.enableDoclavaAndJDiff(this, new DacOptions("android/support", "SUPPORT_DATA"))
///// FLATFOOT START
diff --git a/buildSrc/init.gradle b/buildSrc/init.gradle
index 1591004..64c5f3f 100644
--- a/buildSrc/init.gradle
+++ b/buildSrc/init.gradle
@@ -15,7 +15,6 @@
*/
-import android.support.DacOptions
import android.support.DiffAndDocs
import android.support.gmaven.GMavenVersionChecker
import com.android.build.gradle.internal.coverage.JacocoPlugin
@@ -36,9 +35,8 @@
apply from: "${supportRoot}/buildSrc/dependencies.gradle"
apply from: "${supportRoot}/buildSrc/build_dependencies.gradle"
-ext.docsDac = new DacOptions("android/support", "SUPPORT_DATA")
-def enableDoclavaAndJDiff(p) {
+def enableDoclavaAndJDiff(p, dacOptions) {
p.configurations {
doclava
jdiff
@@ -50,7 +48,8 @@
jdiff build_libs.xml_parser_apis
jdiff build_libs.xerces_impl
}
- DiffAndDocs.configureDiffAndDocs(rootProject, createArchive, supportRootFolder)
+ def allChecks = DiffAndDocs.configureDiffAndDocs(rootProject, supportRootFolder, dacOptions)
+ createArchive.dependsOn(allChecks)
}
def getFullSdkPath() {
diff --git a/buildSrc/repos.gradle b/buildSrc/repos.gradle
index 156ec66..ad5a621 100644
--- a/buildSrc/repos.gradle
+++ b/buildSrc/repos.gradle
@@ -37,7 +37,6 @@
ext.repoNames = ["${repos.prebuiltsRoot}/gradle-plugin",
"${repos.prebuiltsRoot}/tools/common/m2/repository",
- "${repos.prebuiltsRoot}/tools/common/m2/internal",
"${repos.prebuiltsRoot}/maven_repo/android",
"${getFullSdkPath(repos.prebuiltsRoot)}/extras/m2repository"]
diff --git a/buildSrc/src/main/java/android/support/Version.java b/buildSrc/src/main/java/android/support/Version.java
index 69b7f5e..36c7728 100644
--- a/buildSrc/src/main/java/android/support/Version.java
+++ b/buildSrc/src/main/java/android/support/Version.java
@@ -16,6 +16,7 @@
package android.support;
+import java.io.File;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -23,17 +24,28 @@
* Utility class which represents a version
*/
public class Version implements Comparable<Version> {
+ private static final Pattern VERSION_FILE_REGEX = Pattern.compile("^(\\d+\\.\\d+\\.\\d+).txt$");
+ private static final Pattern VERSION_REGEX = Pattern
+ .compile("^(\\d+)\\.(\\d+)\\.(\\d+)(-.+)?$");
+
private final int mMajor;
private final int mMinor;
private final int mPatch;
private final String mExtra;
public Version(String versionString) {
- Pattern compile = Pattern.compile("^(\\d+)\\.(\\d+)\\.(\\d+)(-.+)?$");
- Matcher matcher = compile.matcher(versionString);
+ this(checkedMatcher(versionString));
+ }
+
+ private static Matcher checkedMatcher(String versionString) {
+ Matcher matcher = VERSION_REGEX.matcher(versionString);
if (!matcher.matches()) {
throw new IllegalArgumentException("Can not parse version: " + versionString);
}
+ return matcher;
+ }
+
+ private Version(Matcher matcher) {
mMajor = Integer.parseInt(matcher.group(1));
mMinor = Integer.parseInt(matcher.group(2));
mPatch = Integer.parseInt(matcher.group(3));
@@ -117,4 +129,29 @@
result = 31 * result + (mExtra != null ? mExtra.hashCode() : 0);
return result;
}
+
+ /**
+ * @return Version or null, if a name of the given file doesn't match
+ */
+ public static Version from(File file) {
+ if (!file.isFile()) {
+ return null;
+ }
+ Matcher matcher = VERSION_FILE_REGEX.matcher(file.getName());
+ if (!matcher.matches()) {
+ return null;
+ }
+ return new Version(matcher.group(1));
+ }
+
+ /**
+ * @return Version or null, if the given string doesn't match
+ */
+ public static Version from(String versionString) {
+ Matcher matcher = VERSION_REGEX.matcher(versionString);
+ if (!matcher.matches()) {
+ return null;
+ }
+ return new Version(matcher);
+ }
}
diff --git a/buildSrc/src/main/kotlin/android/support/DiffAndDocs.kt b/buildSrc/src/main/kotlin/android/support/DiffAndDocs.kt
index 4c57721..fefc3ed 100644
--- a/buildSrc/src/main/kotlin/android/support/DiffAndDocs.kt
+++ b/buildSrc/src/main/kotlin/android/support/DiffAndDocs.kt
@@ -20,6 +20,7 @@
import android.support.checkapi.CheckApiTask
import android.support.checkapi.UpdateApiTask
import android.support.doclava.DoclavaTask
+import android.support.docs.GenerateDocsTask
import android.support.jdiff.JDiffTask
import com.android.build.gradle.LibraryExtension
import com.android.build.gradle.api.LibraryVariant
@@ -42,8 +43,8 @@
@JvmStatic
fun configureDiffAndDocs(
root: Project,
- createArchiveTask: Task,
- supportRootFolder: File) = configure(root, createArchiveTask, supportRootFolder)
+ supportRootFolder: File,
+ dacOptions: DacOptions) = configure(root, supportRootFolder, dacOptions)
}
private data class CheckApiConfig(
@@ -58,6 +59,7 @@
"visibility, you may exclude it from public API by using the @hide javadoc\n" +
"annotation paired with the @RestrictTo(LIBRARY_GROUP) code annotation."
+@Suppress("DEPRECATION")
private fun hasJavaSources(variant: LibraryVariant) = !variant.javaCompile.source
.filter { file -> file.name != "R.java" && file.name != "BuildConfig.java" }
.isEmpty
@@ -98,22 +100,17 @@
private fun stripExtension(fileName: String) = fileName.substringBeforeLast('.')
-private fun getLastReleasedApiFile(rootFolder: File, refApi: String): File? {
- val refVersion = Version(refApi)
+private fun getLastReleasedApiFile(rootFolder: File, refVersion: Version): File? {
val apiDir = File(rootFolder, "api")
var lastFile: File? = null
var lastVersion: Version? = null
- val regex = Regex("(\\d+)\\.(\\d+)\\.0\\.txt")
- // Only look at released versions and snapshots thereof, ex. X.Y.0.txt.
- apiDir.listFiles().filter { file ->
- regex.matches(file.name) && file.isFile
- }.forEach { file ->
- val version = Version(stripExtension(file.name))
-
- if ((lastFile == null || lastVersion!! < version) && version < refVersion) {
- lastFile = file
- lastVersion = version
+ apiDir.listFiles().forEach { file ->
+ Version.from(file)?.let { version ->
+ if ((lastFile == null || lastVersion!! < version) && version < refVersion) {
+ lastFile = file
+ lastVersion = version
+ }
}
}
return lastFile
@@ -215,12 +212,15 @@
// configuration file for setting up api diffs and api docs
private fun registerAndroidProjectForDocsTask(task: Javadoc, releaseVariant: LibraryVariant) {
+ @Suppress("DEPRECATION")
task.dependsOn(releaseVariant.javaCompile)
val packageDir = releaseVariant.applicationId.replace('.', '/')
+ @Suppress("DEPRECATION")
val sources = releaseVariant.javaCompile.source.filter { file ->
file.name != "R.java" || file.parent.endsWith(packageDir)
}
task.source(sources)
+ @Suppress("DEPRECATION")
task.classpath += releaseVariant.getCompileClasspath(null) +
task.project.files(releaseVariant.javaCompile.destinationDir)
}
@@ -247,15 +247,14 @@
*/
private fun createOldApiXml(project: Project, doclavaConfig: Configuration) =
project.tasks.createWithConfig("oldApiXml", ApiXmlConversionTask::class.java) {
- val regex = Regex("(\\d+\\.){2}\\d+")
- val toApi = project.processProperty("toApi")
+ val toApi = project.processProperty("toApi")?.let(Version::from)
val fromApi = project.processProperty("fromApi")
classpath = project.files(doclavaConfig.resolve())
val rootFolder = project.projectDir
if (fromApi != null) {
// Use an explicit API file.
inputApiFile = File(rootFolder, "api/$fromApi.txt")
- } else if (toApi != null && regex.matches(toApi)) {
+ } else if (toApi != null) {
// If toApi matches released API (X.Y.Z) format, use the most recently
// released API file prior to toApi.
inputApiFile = getLastReleasedApiFile(rootFolder, toApi)
@@ -401,7 +400,8 @@
project: Project,
generateSdkApiTask: Task,
doclavaConfig: Configuration,
- supportRootFolder: File) =
+ supportRootFolder: File,
+ dacOptions: DacOptions) =
project.tasks.createWithConfig("generateDocs", GenerateDocsTask::class.java) {
dependsOn(generateSdkApiTask, doclavaConfig)
group = JavaBasePlugin.DOCUMENTATION_GROUP
@@ -439,8 +439,8 @@
if (!offline) {
addStringOption("toroot", "/")
addBooleanOption("devsite", true)
- addStringOption("dac_libraryroot", project.docsDac().libraryroot)
- addStringOption("dac_dataname", project.docsDac().dataname)
+ addStringOption("dac_libraryroot", dacOptions.libraryroot)
+ addStringOption("dac_dataname", dacOptions.dataname)
}
exclude("**/BuildConfig.java")
@@ -449,10 +449,12 @@
addArtifactsAndSince()
}
-private fun initializeApiChecksForProject(
- project: Project,
- generateDocs: GenerateDocsTask,
- createArchive: Task): Pair<DoclavaTask, JDiffTask> {
+private data class Tasks(
+ val generateApi: DoclavaTask,
+ val generateDiffs: JDiffTask,
+ val checkApiTask: CheckApiTask)
+
+private fun initializeApiChecksForProject(project: Project, generateDocs: GenerateDocsTask): Tasks {
if (!project.hasProperty("docsDir")) {
project.extensions.add("docsDir", File(project.rootProject.docsDir(), project.name))
}
@@ -467,7 +469,7 @@
val verifyUpdateTask = createVerifyUpdateApiAllowedTask(project)
// Make sure the API surface has not broken since the last release.
- val lastReleasedApiFile = getLastReleasedApiFile(workingDir, version.toString())
+ val lastReleasedApiFile = getLastReleasedApiFile(workingDir, version)
val whitelistFile = lastReleasedApiFile?.let { apiFile ->
File(lastReleasedApiFile.parentFile, stripExtension(apiFile.name) + ".ignore")
@@ -520,56 +522,16 @@
// Associate current API surface with the Maven artifact.
generateDocs.addArtifact(generateApi.apiFile!!.absolutePath, artifact)
generateDocs.dependsOn(generateApi)
- createArchive.dependsOn(checkApi)
- return (generateApi to generateDiffTask)
+ return Tasks(generateApi, generateDiffTask, checkApi)
}
-private open class GenerateDocsTask : DoclavaTask() {
-
- private data class Since(val path: String, val apiLevel: String)
- private data class Artifact(val path: String, val artifact: String)
-
- private val sinces = mutableListOf<Since>()
- private val artifacts = mutableListOf<Artifact>()
-
- fun addArtifactsAndSince() {
- doFirst {
- coreJavadocOptions {
- if (sinces.isNotEmpty()) {
- addMultilineMultiValueOption("since").value = sinces.map { (path, apiLevel) ->
- listOf(path, apiLevel)
- }
- }
-
- if (artifacts.isNotEmpty()) {
- addMultilineMultiValueOption("artifact").value = artifacts.map { artifact ->
- listOf(artifact.path, artifact.artifact)
- }
- }
- }
- }
- }
-
- fun addSinceFilesFrom(dir: File) {
- val regex = Regex("(\\d+\\.\\d+\\.\\d).txt")
- val apiDir = File(dir, "api")
- apiDir.listFiles { file ->
- file.isFile && regex.matches(file.name)
- }.forEach { apiFile ->
- val matchResult = regex.matchEntire(apiFile.name)!!
- sinces.add(Since(apiFile.absolutePath, matchResult.groups[1]!!.value))
- }
- }
-
- fun addArtifact(path: String, artifact: String) = artifacts.add(Artifact(path, artifact))
-}
-
-private fun configure(root: Project, createArchiveTask: Task, supportRootFolder: File) {
+private fun configure(root: Project, supportRootFolder: File, dacOptions: DacOptions): Task {
+ val allChecks = root.tasks.create("AnchorCheckApis")
val doclavaConfiguration = root.configurations.getByName("doclava")
val generateSdkApiTask = createGenerateSdkApiTask(root, doclavaConfiguration)
val generateDocsTask = createGenerateDocsTask(root, generateSdkApiTask,
- doclavaConfiguration, supportRootFolder)
+ doclavaConfiguration, supportRootFolder, dacOptions)
createDistDocsTask(root, generateDocsTask)
root.subprojects { subProject ->
@@ -603,10 +565,10 @@
"an api folder, ignoring API tasks.")
return@all
}
- val (generateApi, generateDiffs) = initializeApiChecksForProject(project,
- generateDocsTask, createArchiveTask)
- registerAndroidProjectForDocsTask(generateApi, variant)
- registerAndroidProjectForDocsTask(generateDiffs, variant)
+ val tasks = initializeApiChecksForProject(project, generateDocsTask)
+ registerAndroidProjectForDocsTask(tasks.generateApi, variant)
+ registerAndroidProjectForDocsTask(tasks.generateDiffs, variant)
+ allChecks.dependsOn(tasks.checkApiTask)
}
}
} else if (project.hasProperty("compileJava")) {
@@ -618,15 +580,15 @@
return@afterEvaluate
}
project.afterEvaluate { proj ->
- val (generateApi, generateDiffs) = initializeApiChecksForProject(proj,
- generateDocsTask,
- createArchiveTask)
- registerJavaProjectForDocsTask(generateApi, compileJava)
- registerJavaProjectForDocsTask(generateDiffs, compileJava)
+ val tasks = initializeApiChecksForProject(proj, generateDocsTask)
+ registerJavaProjectForDocsTask(tasks.generateApi, compileJava)
+ registerJavaProjectForDocsTask(tasks.generateDiffs, compileJava)
+ allChecks.dependsOn(tasks.checkApiTask)
}
}
}
}
+ return allChecks
}
private fun sdkApiFile(project: Project) = File(project.docsDir(), "release/sdk_current.txt")
@@ -647,14 +609,12 @@
private fun Project.androidSrcJar() = rootProject.properties["androidSrcJar"] as File
-private fun Project.version() = Version(project.properties["version"] as String)
+private fun Project.version() = Version(project.version as String)
private fun Project.buildNumber() = properties["buildNumber"] as String
private fun Project.androidApiTxt() = properties["androidApiTxt"] as? File
-private fun Project.docsDac() = properties["docsDac"] as DacOptions
-
private fun Project.processProperty(name: String) =
if (hasProperty(name)) {
properties[name] as String
diff --git a/buildSrc/src/main/kotlin/android/support/docs/GenerateDocsTask.kt b/buildSrc/src/main/kotlin/android/support/docs/GenerateDocsTask.kt
new file mode 100644
index 0000000..2183b88
--- /dev/null
+++ b/buildSrc/src/main/kotlin/android/support/docs/GenerateDocsTask.kt
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.docs
+
+import android.support.Version
+import android.support.doclava.DoclavaTask
+import java.io.File
+
+open class GenerateDocsTask : DoclavaTask() {
+
+ private data class Since(val path: String, val apiLevel: String)
+ private data class Artifact(val path: String, val artifact: String)
+
+ private val sinces = mutableListOf<Since>()
+ private val artifacts = mutableListOf<Artifact>()
+
+ fun addArtifactsAndSince() {
+ doFirst {
+ coreJavadocOptions {
+ if (sinces.isNotEmpty()) {
+ addMultilineMultiValueOption("since").value = sinces.map { (path, apiLevel) ->
+ listOf(path, apiLevel)
+ }
+ }
+
+ if (artifacts.isNotEmpty()) {
+ addMultilineMultiValueOption("artifact").value = artifacts.map { artifact ->
+ listOf(artifact.path, artifact.artifact)
+ }
+ }
+ }
+ }
+ }
+
+ fun addSinceFilesFrom(dir: File) {
+ File(dir, "api").listFiles().forEach { file ->
+ Version.from(file)?.let { version ->
+ sinces.add(Since(file.absolutePath, version.toString()))
+ }
+ }
+ }
+
+ fun addArtifact(path: String, artifact: String) = artifacts.add(Artifact(path, artifact))
+}
\ No newline at end of file