<lambda>null1import org.gradle.api.DefaultTask 2 import org.gradle.api.file.ConfigurableFileCollection 3 import org.gradle.api.file.FileType 4 import org.gradle.api.tasks.Input 5 import org.gradle.api.tasks.InputFiles 6 import org.gradle.api.tasks.Optional 7 import org.gradle.api.tasks.OutputDirectory 8 import org.gradle.api.tasks.TaskAction 9 import org.gradle.work.ChangeType 10 import org.gradle.work.Incremental 11 import org.gradle.work.InputChanges 12 import java.io.File 13 14 import java.nio.file.Files 15 16 /** 17 * Create symbolic links of a collection of files in a set output directory. 18 * 19 * The files must all be rooted at androidTop. This will create a file tree at outputDirectory that 20 * mimics the structure rooted at androidTop. 21 */ 22 abstract class SymbolicLinksTask : DefaultTask() { 23 24 @get:Incremental 25 @get:InputFiles 26 abstract val inputDirectories: ConfigurableFileCollection 27 28 @get:OutputDirectory 29 abstract var outputDirectory: String 30 31 @get:Input 32 abstract var androidBuildTop: String 33 34 init { 35 group = "symlink" 36 } 37 38 @TaskAction 39 fun execute(inputChanges: InputChanges) { 40 var androidTopFile = File(androidBuildTop).canonicalFile 41 inputChanges.getFileChanges(inputDirectories).forEach { change -> 42 var file = change.file 43 if (change.fileType == FileType.DIRECTORY) { 44 println("Creating link to ${file.path}") 45 var relativePath = file.canonicalFile.relativeTo(androidTopFile) 46 var symbolicLinkPath = 47 project.file("$outputDirectory/$relativePath").toPath() 48 if (change.changeType == ChangeType.ADDED && !symbolicLinkPath.toFile().exists()) { 49 symbolicLinkPath.parent.toFile().mkdirs() 50 Files.createSymbolicLink(symbolicLinkPath, file.toPath()) 51 } 52 } else { 53 // We only need to create symbolic links to directories. 54 // System.err.println("${file.path} is not a directory") 55 } 56 } 57 } 58 } 59