blob: a7fd4dc1a27ce9a160bdbe26c5210af6b35c92fd [file] [log] [blame]
/*
* Copyright (C) 2024 Dremio
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package copiedcode
import org.gradle.api.Project
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.file.SourceDirectorySet
import org.gradle.api.provider.Property
import org.gradle.api.provider.SetProperty
abstract class CopiedCodeCheckerExtension(private val project: Project) {
/**
* Per-project set of additional directories to scan.
*
* This property is _not_ propagated to subprojects.
*/
val scanDirectories =
project.objects.domainObjectContainer(
SourceDirectorySet::class.java,
{ name -> project.objects.sourceDirectorySet(name, name) },
)
/**
* By default, this plugin scans all files. The content types that match the regular expression of
* this property are excluded, unless a content-type matches one of the regular expressions in
* [CopiedCodeCheckerExtension.includedContentTypePatterns].
*
* See [CopiedCodeCheckerExtension.addDefaultContentTypes],
* [CopiedCodeCheckerExtension.includedContentTypePatterns],
* [CopiedCodeCheckerExtension.includeUnrecognizedContentType],
* [CopiedCodeCheckerExtension.includedContentTypePatterns].
*/
abstract val excludedContentTypePatterns: SetProperty<String>
/**
* By default, this plugin scans all files. The content types that match the regular expression of
* the [copiedcode.CopiedCodeCheckerExtension.excludedContentTypePatterns] property are excluded,
* unless a content-type matches one of the regular expressions in this property.
*
* See [CopiedCodeCheckerExtension.addDefaultContentTypes],
* [CopiedCodeCheckerExtension.excludedContentTypePatterns],
* [CopiedCodeCheckerExtension.includeUnrecognizedContentType],
* [CopiedCodeCheckerExtension.includedContentTypePatterns].
*/
abstract val includedContentTypePatterns: SetProperty<String>
/**
* If a content-type could not be detected, this property, which defaults to `true`, is consulted.
*
* See [CopiedCodeCheckerPlugin] for details.
*/
abstract val includeUnrecognizedContentType: Property<Boolean>
/**
* The magic "word", if present in a file, meaning "this file has been copied".
*
* A file is considered as "copied" must contain this magic word. "Word" means that the value must
* be surrounded by regular expression word boundaries (`\b`).
*/
abstract val magicWord: Property<String>
/**
* License file to check, configured on the root project. See [CopiedCodeCheckerPlugin] for
* details.
*/
abstract val licenseFile: RegularFileProperty
/** Recommended to use, adds known and used binary content types. */
fun addDefaultContentTypes(): CopiedCodeCheckerExtension {
// Exclude all images
excludedContentTypePatterns.add("image/.*")
// But include images built in XML (e.g. image/svg+xml)
includedContentTypePatterns.add("\\+xml")
return this
}
init {
includeUnrecognizedContentType.convention(true)
magicWord.convention(DEFAULT_MAGIC_WORD)
}
companion object {
// String manipulation is intentional - otherwise this source file would be considered as
// "copied".
val DEFAULT_MAGIC_WORD = "_CODE_COPIED_TO_POLARIS".substring(1)
}
}