JetifyLibsTask.kt revision d7b0788f3bf58fc26a936c2426ef1214ffb3a180
1d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis/* 2d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis * Copyright (C) 2017 The Android Open Source Project 3d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis * 4d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis * Licensed under the Apache License, Version 2.0 (the "License"); 5d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis * you may not use this file except in compliance with the License. 6d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis * You may obtain a copy of the License at 7d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis * 8d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis * http://www.apache.org/licenses/LICENSE-2.0 9d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis * 10d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis * Unless required by applicable law or agreed to in writing, software 11d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis * distributed under the License is distributed on an "AS IS" BASIS, 12d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis * See the License for the specific language governing permissions and 14d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis * limitations under the License 15d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis */ 16d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis 17d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlispackage android.support.tools.jetifier.plugin.gradle 18d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis 19d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlisimport android.support.tools.jetifier.core.config.ConfigParser 20d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlisimport org.gradle.api.DefaultTask 21d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlisimport org.gradle.api.Project 22d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlisimport org.gradle.api.file.FileCollection 23d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlisimport org.gradle.api.tasks.InputFiles 24d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlisimport org.gradle.api.tasks.OutputDirectory 25d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlisimport org.gradle.api.tasks.TaskAction 26d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlisimport java.io.File 27d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis 28d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis/** 29d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis * Task that processes given file collections using Jetifier. 30d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis * 31d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis * This task also utilizes Gradle caching so it's run only when needed. 32d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis * 33d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis * Example usage in Gradle: 34d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis * dependencies { 35d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis * compile jetifier.process('groupId:artifactId:1.0') 36d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis * } 37d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis */ 38d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlisopen class JetifyLibsTask : DefaultTask() { 39d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis 40d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis companion object { 41d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis const val TASK_NAME = "jetifyLibs" 42d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis const val GROUP_ID = "Pre-build" 43d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis // TODO: Get back to this once the name of the library is decided. 44d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis const val DESCRIPTION = "Rewrites input libraries to run with jetpack" 45d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis 46d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis const val OUTPUT_DIR_APPENDIX = "jetifier" 47d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis 48d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis 49d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis fun resolveTask(project: Project) : JetifyLibsTask { 50d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis val task = project.tasks.findByName(TASK_NAME) as? JetifyLibsTask 51d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis if (task != null) { 52d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis return task 53d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis } 54d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis return project.tasks.create(TASK_NAME, JetifyLibsTask::class.java) 55d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis } 56d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis 57d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis } 58d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis 59d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis private var filesToProcess : FileCollection = project.files() 60d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis 61d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis private val outputDir = File(project.buildDir, OUTPUT_DIR_APPENDIX) 62d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis 63d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis 64d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis override fun getGroup() = GROUP_ID 65d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis 66d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis override fun getDescription() = DESCRIPTION 67d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis 68d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis /** 69d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis * Adds individual files collection to be processed by Jetifier. 70d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis * 71d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis * See [JetifierExtension] for details on how to use this. 72d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis */ 73d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis fun addFilesToProcess(files: FileCollection) : FileCollection { 74d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis filesToProcess = filesToProcess.plus(files) 75d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis return project.files(files.map { File(outputDir, it.name) }.toList()) 76d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis } 77d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis 78d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis /** 79d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis * Used by Gradle to figure out whether this task should be re-run. If the result of this method 80d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis * is different then the task is re-run. 81d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis */ 82d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis @InputFiles 83d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis fun getInputFiles() : FileCollection { 84d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis return filesToProcess 85d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis } 86d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis 87d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis /** 88d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis * Used by Gradle to figure out whether this task should be re-run and if other tasks that are 89d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis * relying on files from this directory should be re-run. Actually not having this and only 90d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis * having [InputFiles] annotation would disable the whole incremental mechanism for this task 91d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis * and lead to constant re-runs. 92d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis */ 93d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis @OutputDirectory 94d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis fun getOutputDir() : File { 95d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis return outputDir 96d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis } 97d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis 98d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis @TaskAction 99d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis @Throws(Exception::class) 100d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis fun run() { 101d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis val config = ConfigParser.loadConfigOrFail(TasksCommon.configFilePath) 102d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis 103d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis // Process the files using Jetifier 104d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis TasksCommon.processFiles(config, filesToProcess.toSet(), project.logger, outputDir) 105d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis } 106d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis 107d7b0788f3bf58fc26a936c2426ef1214ffb3a180Filip Pavlis}