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}