• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
<lambda>null2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package androidx.build.checkapi
18 
19 import androidx.build.Version
20 import com.google.common.io.Files
21 import org.gradle.api.DefaultTask
22 import org.gradle.api.GradleException
23 import org.gradle.api.tasks.Input
24 import org.gradle.api.tasks.InputFile
25 import org.gradle.api.tasks.Optional
26 import org.gradle.api.tasks.OutputFile
27 import org.gradle.api.tasks.TaskAction
28 import java.io.File
29 import java.nio.charset.Charset
30 import java.util.HashSet
31 
32 /**
33  * Task for updating the checked in API file with the newly generated one.
34  */
35 open class UpdateApiTask : DefaultTask() {
36     @get:InputFile
37     lateinit var newApiFile: File
38     @get:[InputFile Optional]
39     var newRemovedApiFile: File? = null
40 
41     @get:[Input Optional]
42     var whitelistErrors: Set<String> = HashSet()
43 
44     @get:OutputFile
45     lateinit var oldApiFile: File
46     @get:[OutputFile Optional]
47     var oldRemovedApiFile: File? = null
48 
49     @get:[OutputFile Optional]
50     var whitelistErrorsFile: File? = null
51 
52     /**
53      * Actually copy the file to the desired location and update the whitelist warnings file.
54      */
55     @TaskAction
56     fun doUpdate() {
57         if (oldApiFile.exists() && newApiFile.readText() == oldApiFile.readText()) {
58             // whatever nothing changed
59             return
60         }
61 
62         val version = Version(project.version as String)
63         if (version.isPatch()) {
64             throw GradleException("Public APIs may not be modified in patch releases.")
65         } else if (version.isFinalApi() && oldApiFile.exists() && !project.hasProperty("force")) {
66             throw GradleException("Public APIs may not be modified in finalized releases.")
67         }
68 
69         Files.copy(newApiFile, oldApiFile)
70 
71         if (oldRemovedApiFile != null) {
72             if (newRemovedApiFile != null) {
73                 Files.copy(newRemovedApiFile!!, oldRemovedApiFile!!)
74             } else {
75                 oldRemovedApiFile!!.delete()
76             }
77         }
78 
79         if (whitelistErrorsFile != null && !whitelistErrors.isEmpty()) {
80             Files.newWriter(
81                     whitelistErrorsFile!!, Charset.defaultCharset()).use { writer ->
82                 for (error in whitelistErrors) {
83                     writer.write(error + "\n")
84                 }
85             }
86             logger.lifecycle("Whitelisted " + whitelistErrors.size + " error(s)...")
87         }
88 
89         logger.lifecycle("Wrote public API definition to " + oldApiFile.name)
90     }
91 }
92