icons.gant: check that all fallback icons are replaced with stub.png

This commit is contained in:
Aleksey Pivovarov
2018-04-26 13:24:40 +03:00
parent d05d7d95b0
commit 324ffe835e
2 changed files with 39 additions and 6 deletions
@@ -24,6 +24,8 @@ import java.io.File
import java.util.*
abstract class ImageSanityCheckerBase(val projectHome: File, val ignoreSkipTag: Boolean) {
private val STUB_PNG_MD5 = "5a87124746c39b00aad480e92672eca0" // /actions/stub.svg - 16x16
fun check(module: JpsModule) {
val allImages = ImageCollector(projectHome, false, ignoreSkipTag).collect(module)
@@ -34,7 +36,8 @@ abstract class ImageSanityCheckerBase(val projectHome: File, val ignoreSkipTag:
checkHaveCompleteIconSet(images, module)
checkHaveValidSize(images, module)
checkAreNotAmbiguous(images, module)
checkSvgIconsFallbackVersions(images, module)
checkSvgFallbackVersionsAreStubIcons(images, module)
checkOverridingFallbackVersionsAreStubIcons(images, module)
}
private fun checkHaveRetinaVersion(images: List<ImagePaths>, module: JpsModule) {
@@ -83,14 +86,35 @@ abstract class ImageSanityCheckerBase(val projectHome: File, val ignoreSkipTag:
}
}
private fun checkSvgIconsFallbackVersions(images: List<ImagePaths>, module: JpsModule) {
process(images, WARNING, "svg image with non-fallback legacy version", module) { image ->
val extensions = image.files.map { ImageExtension.fromFile(it) }
if (SVG !in extensions) return@process true
return@process image.files.filter { ImageExtension.fromFile(it) != SVG }.filter { ImageType.fromFile(it) != BASIC }.isEmpty()
private fun checkSvgFallbackVersionsAreStubIcons(images: List<ImagePaths>, module: JpsModule) {
process(images, WARNING, "SVG icons should use stub.png as fallback", module) { image ->
if (image.files.none { ImageExtension.fromFile(it) == SVG }) return@process true
val legacyFiles = image.files.filter { ImageExtension.fromFile(it) != SVG }
return@process isStubFallbackVersion(legacyFiles)
}
}
private fun checkOverridingFallbackVersionsAreStubIcons(images: List<ImagePaths>, module: JpsModule) {
process(images, WARNING, "Overridden icons should be replaced with stub.png as fallback", module) { image ->
if (image.deprecationReplacement == null) return@process true
return@process isStubFallbackVersion(image.files)
}
}
private fun isStubFallbackVersion(files: List<File>): Boolean {
if (files.isEmpty()) return true
if (files.size > 1) return false
val file = files.single()
if (ImageType.fromFile(file) != BASIC) return false
val md5 = md5(file)
return md5 == STUB_PNG_MD5
}
private fun process(images: List<ImagePaths>, severity: Severity, message: String, module: JpsModule,
processor: (ImagePaths) -> Boolean) {
val result = ArrayList<ImagePaths>()
@@ -20,6 +20,8 @@ import com.intellij.util.SVGLoader
import java.awt.Dimension
import java.awt.Image
import java.io.File
import java.math.BigInteger
import java.security.MessageDigest
import javax.imageio.ImageIO
internal val File.children: List<File> get() = if (isDirectory) listFiles().toList() else emptyList()
@@ -63,6 +65,13 @@ internal fun loadImage(file: File): Image? {
}
}
internal fun md5(file: File): String {
val md5 = MessageDigest.getInstance("MD5")
val bytes = file.inputStream().readBytes()
val hash = md5.digest(bytes)
return BigInteger(hash).abs().toString(16)
}
internal enum class ImageType(private val suffix: String) {
BASIC(""), RETINA("@2x"), DARCULA("_dark"), RETINA_DARCULA("@2x_dark");