diff --git a/gradle.properties b/gradle.properties index 0065774..888950c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -version=4.1.0 +version=4.1.1 release.useAutomaticVersion=true kotlin.version=1.3.50 diff --git a/src/main/kotlin/com/neva/gradle/fork/config/AbstractRule.kt b/src/main/kotlin/com/neva/gradle/fork/config/AbstractRule.kt index c7189a6..20c613e 100644 --- a/src/main/kotlin/com/neva/gradle/fork/config/AbstractRule.kt +++ b/src/main/kotlin/com/neva/gradle/fork/config/AbstractRule.kt @@ -1,8 +1,10 @@ package com.neva.gradle.fork.config +import com.neva.gradle.fork.file.FileOperations import com.neva.gradle.fork.file.visitAll import org.gradle.api.file.FileTree import org.gradle.api.file.FileVisitDetails +import java.io.File abstract class AbstractRule(val config: Config) : Rule { @@ -37,4 +39,30 @@ abstract class AbstractRule(val config: Config) : Rule { fun visitFiles(tree: FileTree, callback: (FileHandler, FileVisitDetails) -> Unit) { visitTree(tree, { !it.isDirectory }, callback) } + + fun removeEmptyDirs() { + val emptyDirs = mutableListOf() + + visitDirs(config.targetTree) { handler, _ -> + val dir = handler.file + if (FileOperations.isDirEmpty(dir)) { + emptyDirs += dir + } + } + + emptyDirs.forEach { dir -> + var current = dir + while (current != config.targetDir && FileOperations.isDirEmpty(current)) { + logger.debug("Cleaning empty directory: $current") + + if (current.delete()) { + current.delete() + current = current.parentFile + } else { + logger.debug("Cannot delete empty directory: $current") + break + } + } + } + } } diff --git a/src/main/kotlin/com/neva/gradle/fork/config/Config.kt b/src/main/kotlin/com/neva/gradle/fork/config/Config.kt index 271f675..d455ff8 100644 --- a/src/main/kotlin/com/neva/gradle/fork/config/Config.kt +++ b/src/main/kotlin/com/neva/gradle/fork/config/Config.kt @@ -234,6 +234,10 @@ abstract class Config(val fork: ForkExtension, val name: String) { replaceTexts(mapOf(search to replace)) } + fun removeText(removal: String) = removeTexts(listOf(removal)) + + fun removeTexts(removals: List) = replaceTexts(removals.map { it to "" }.toMap()) + fun eachFiles(action: Action) { rule(EachFilesRule(this, action)) } @@ -247,22 +251,28 @@ abstract class Config(val fork: ForkExtension, val name: String) { fun replaceContent(search: String, replace: String) = replaceText(search, replace) fun eachTextFiles(action: Action) { - eachTextFiles(textFiles, textIgnoredFiles, action) + eachFiles(textFiles, textIgnoredFiles, action) } fun eachTextFiles(pattern: String, action: Action) = eachTextFiles(listOf(pattern), action) fun eachTextFiles(patterns: List, action: Action) { - eachTextFiles(patterns, textIgnoredFiles, action) + eachFiles(patterns, textIgnoredFiles, action) } - fun eachTextFiles(includes: List, excludes: List, action: Action) { + fun eachFiles(includes: List, excludes: List, action: Action) { eachFiles(action, Action { it.filter.include(includes) it.filter.exclude(excludes) }) } + fun removeFile(path: String) = removeFiles(listOf(path)) + + fun removeFiles(includes: List, excludes: List = listOf()) { + eachFiles(includes, excludes, Action { it.remove() }) + } + fun copyTemplateFile(templateName: String) { copyTemplateFile(templateName, templateName) } diff --git a/src/main/kotlin/com/neva/gradle/fork/config/FileHandler.kt b/src/main/kotlin/com/neva/gradle/fork/config/FileHandler.kt index f0824f0..6e88be9 100644 --- a/src/main/kotlin/com/neva/gradle/fork/config/FileHandler.kt +++ b/src/main/kotlin/com/neva/gradle/fork/config/FileHandler.kt @@ -47,6 +47,18 @@ class FileHandler(val config: Config, val file: File) { return this } + fun remove(): FileHandler { + actions += action@{ + if (file.exists()) { + logger.info("Removing file $file") + + FileUtils.deleteQuietly(file) + } + } + + return this + } + fun read(): String { return FileOperations.read(file) } @@ -72,7 +84,19 @@ class FileHandler(val config: Config, val file: File) { fun replace(search: String, replace: String): FileHandler { val content = read() if (content.contains(search)) { - logger.info("Replacing '$search' with '$replace' in file $file") + if (search.contains("\n") || replace.contains("\n")) { + if (replace.isEmpty()) { + logger.info("Removing from file $file content:\n$search") + } else { + logger.info("Replacing content of file $file\nSearch:\n$search\nReplace:\n$replace") + } + } else { + if (replace.isEmpty()) { + logger.info("Removing from file $file content '$search'") + } else { + logger.info("Replacing '$search' with '${replace.ifBlank { "" }}' in file $file") + } + } val updatedContent = content.replace(search, replace) write(updatedContent) diff --git a/src/main/kotlin/com/neva/gradle/fork/config/properties/Property.kt b/src/main/kotlin/com/neva/gradle/fork/config/properties/Property.kt index 0cb4db2..fcd6333 100644 --- a/src/main/kotlin/com/neva/gradle/fork/config/properties/Property.kt +++ b/src/main/kotlin/com/neva/gradle/fork/config/properties/Property.kt @@ -39,7 +39,7 @@ class Property( val invalid: Boolean get() = validate().hasErrors() - var enabled: Boolean = true + var enabled: Boolean = definition.enabled var required: Boolean = definition.required diff --git a/src/main/kotlin/com/neva/gradle/fork/config/properties/PropertyDefinition.kt b/src/main/kotlin/com/neva/gradle/fork/config/properties/PropertyDefinition.kt index 5f4c0e1..fb1f4bd 100644 --- a/src/main/kotlin/com/neva/gradle/fork/config/properties/PropertyDefinition.kt +++ b/src/main/kotlin/com/neva/gradle/fork/config/properties/PropertyDefinition.kt @@ -19,6 +19,8 @@ open class PropertyDefinition @Inject constructor(val name: String) { var defaultValue: String = "" + var enabled = true + var required = true var dynamic = false diff --git a/src/main/kotlin/com/neva/gradle/fork/config/rule/CopyTemplateFilesRule.kt b/src/main/kotlin/com/neva/gradle/fork/config/rule/CopyTemplateFilesRule.kt index e09fce6..c51e3ba 100644 --- a/src/main/kotlin/com/neva/gradle/fork/config/rule/CopyTemplateFilesRule.kt +++ b/src/main/kotlin/com/neva/gradle/fork/config/rule/CopyTemplateFilesRule.kt @@ -33,7 +33,7 @@ class CopyTemplateFilesRule(config: Config, private val files: Map + files.forEach { (templateName, targetName) -> val templateFile = findTemplateFile(templateName) if (templateFile != null) { val targetFile = File(config.targetDir, targetName) diff --git a/src/main/kotlin/com/neva/gradle/fork/config/rule/MoveFilesRule.kt b/src/main/kotlin/com/neva/gradle/fork/config/rule/MoveFilesRule.kt index b4f9ae6..e46ecf2 100644 --- a/src/main/kotlin/com/neva/gradle/fork/config/rule/MoveFilesRule.kt +++ b/src/main/kotlin/com/neva/gradle/fork/config/rule/MoveFilesRule.kt @@ -16,7 +16,7 @@ class MoveFilesRule(config: Config, movements: Map String>) : Abst private fun moveFiles() { visitFiles(config.targetTree) { handler, details -> - movements.forEach { searchPath, replacePath -> + movements.forEach { (searchPath, replacePath) -> val sourcePath = details.relativePath.pathString val targetPath = sourcePath.replace(searchPath, replacePath) val target = File(config.targetPath, targetPath) @@ -28,32 +28,6 @@ class MoveFilesRule(config: Config, movements: Map String>) : Abst } } - private fun removeEmptyDirs() { - val emptyDirs = mutableListOf() - - visitDirs(config.targetTree) { handler, _ -> - val dir = handler.file - if (FileOperations.isDirEmpty(dir)) { - emptyDirs += dir - } - } - - emptyDirs.forEach { dir -> - var current = dir - while (current != config.targetDir && FileOperations.isDirEmpty(current)) { - logger.debug("Cleaning empty directory: $current") - - if (current.delete()) { - current.delete() - current = current.parentFile - } else { - logger.debug("Cannot delete empty directory: $current") - break - } - } - } - } - override fun toString(): String { return "MoveFilesRule(movements=$movements)" } diff --git a/src/main/kotlin/com/neva/gradle/fork/config/rule/ReplaceContentsRule.kt b/src/main/kotlin/com/neva/gradle/fork/config/rule/ReplaceContentsRule.kt index da58fea..012fa42 100644 --- a/src/main/kotlin/com/neva/gradle/fork/config/rule/ReplaceContentsRule.kt +++ b/src/main/kotlin/com/neva/gradle/fork/config/rule/ReplaceContentsRule.kt @@ -17,7 +17,7 @@ class ReplaceContentsRule(config: Config, replacements: Map String override fun execute() { visitFiles(targetTree) { fileHandler, _ -> - replacements.forEach { search, replace -> fileHandler.replace(search, replace) } + replacements.forEach { (search, replace) -> fileHandler.replace(search, replace) } } }