From 1e667080e993dbf6e210f0a0bcd0f523e76b1880 Mon Sep 17 00:00:00 2001 From: "Dmitriy.Panov" Date: Thu, 22 Nov 2018 18:10:31 +0300 Subject: [PATCH] IJI-9: sync icons only from changes to IntelliJIcons from IDEA --- .../intellij/build/images/sync/Context.kt | 11 ++++++ .../intellij/build/images/sync/checkIcons.kt | 37 +++++++++++++------ .../intellij/build/images/sync/gitUtils.kt | 2 +- 3 files changed, 38 insertions(+), 12 deletions(-) diff --git a/platform/build-scripts/icons/src/org/jetbrains/intellij/build/images/sync/Context.kt b/platform/build-scripts/icons/src/org/jetbrains/intellij/build/images/sync/Context.kt index aa1b2373e158..8567a962746f 100644 --- a/platform/build-scripts/icons/src/org/jetbrains/intellij/build/images/sync/Context.kt +++ b/platform/build-scripts/icons/src/org/jetbrains/intellij/build/images/sync/Context.kt @@ -2,6 +2,7 @@ package org.jetbrains.intellij.build.images.sync import com.intellij.openapi.util.io.FileUtil +import com.intellij.openapi.util.text.StringUtil import java.io.File import java.nio.file.Files import java.nio.file.Paths @@ -40,6 +41,7 @@ internal class Context(private val errorHandler: Consumer = Consumer { e addedByDev + removedByDev + modifiedByDev } val iconsCommitHashesToSync: Set + val devIconsCommitHashesToSync: Set fun iconsSyncRequired() = devChanges.isNotEmpty() fun devSyncRequired() = iconsChanges.isNotEmpty() @@ -102,6 +104,15 @@ internal class Context(private val errorHandler: Consumer = Consumer { e ?.split(",", ";", " ") ?.filter { it.isNotBlank() } ?.mapTo(mutableSetOf(), String::trim) ?: emptySet() + devIconsCommitHashesToSync = System.getProperty("teamcity.build.changedFiles.file") + ?.let(::File) + ?.takeIf(File::exists) + ?.let(FileUtil::loadFile) + ?.takeIf { !it.contains("") } + ?.also { log("Changes from TeamCity: $it") } + ?.let(StringUtil::splitByLines) + ?.map { it.split(':')[2] } + ?.toSet() ?: emptySet() doSyncIconsRepo = bool(syncIconsArg) doSyncDevRepo = bool(syncDevIconsArg) doSyncRemovedIconsInDev = bool(syncRemovedIconsInDevArg) || iconsCommitHashesToSync.isNotEmpty() diff --git a/platform/build-scripts/icons/src/org/jetbrains/intellij/build/images/sync/checkIcons.kt b/platform/build-scripts/icons/src/org/jetbrains/intellij/build/images/sync/checkIcons.kt index 5052ef2b4468..7098950db854 100644 --- a/platform/build-scripts/icons/src/org/jetbrains/intellij/build/images/sync/checkIcons.kt +++ b/platform/build-scripts/icons/src/org/jetbrains/intellij/build/images/sync/checkIcons.kt @@ -32,11 +32,10 @@ internal fun checkIcons(context: Context = Context(), loggerImpl: Consumer searchForChangedIconsByDesigners(context) + context.devIconsCommitHashesToSync.isNotEmpty() -> searchForChangedIconsByDev(context, devRepoVcsRoots) + else -> searchForAllChangedIcons(context, devRepoVcsRoots) } } syncIcons(context) @@ -86,16 +85,32 @@ private fun searchForAllChangedIcons(context: Context, devRepoVcsRoots: Collecti } } +private fun asIcon(files: Collection, repo: File, root: File) = files + .filter { ImageExtension.fromName(it) != null } + .map { repo.resolve(it).toRelativeString(root) } + private fun searchForChangedIconsByDesigners(context: Context) { - fun check(files: Collection) = files - .filter { ImageExtension.fromName(it) != null } - .map { context.iconsRepo.resolve(it).toRelativeString(context.iconsRepoDir) } + log("${context.iconsRepoName} changes from commits ${context.iconsCommitHashesToSync.joinToString()}") context.iconsCommitHashesToSync.forEach { commit -> changesFromCommit(context.iconsRepo, commit).forEach { type, files -> when (type) { - ChangeType.ADDED -> context.addedByDesigners += check(files) - ChangeType.MODIFIED -> context.modifiedByDesigners += check(files) - ChangeType.DELETED -> context.removedByDesigners += check(files) + ChangeType.ADDED -> context.addedByDesigners += asIcon(files, context.iconsRepo, context.iconsRepoDir) + ChangeType.MODIFIED -> context.modifiedByDesigners += asIcon(files, context.iconsRepo, context.iconsRepoDir) + ChangeType.DELETED -> context.removedByDesigners += asIcon(files, context.iconsRepo, context.iconsRepoDir) + } + } + } +} + +private fun searchForChangedIconsByDev(context: Context, devRepoVcsRoots: List) { + log("${context.devRepoName} changes from commits ${context.devIconsCommitHashesToSync.joinToString()}") + context.devIconsCommitHashesToSync.forEach { commit -> + val repo = devRepoVcsRoots.first { commitInfo(it, commit) != null } + changesFromCommit(repo, commit).forEach { type, files -> + when (type) { + ChangeType.ADDED -> context.addedByDev.addAll(asIcon(files, repo, context.devRepoRoot)) + ChangeType.MODIFIED -> context.modifiedByDev.addAll(asIcon(files, repo, context.devRepoRoot)) + ChangeType.DELETED -> context.removedByDev.addAll(asIcon(files, repo, context.devRepoRoot)) } } } diff --git a/platform/build-scripts/icons/src/org/jetbrains/intellij/build/images/sync/gitUtils.kt b/platform/build-scripts/icons/src/org/jetbrains/intellij/build/images/sync/gitUtils.kt index 4225df5608ab..cabedc3f2827 100644 --- a/platform/build-scripts/icons/src/org/jetbrains/intellij/build/images/sync/gitUtils.kt +++ b/platform/build-scripts/icons/src/org/jetbrains/intellij/build/images/sync/gitUtils.kt @@ -274,7 +274,7 @@ private fun head(repo: File): String { return heads[repo]!! } -private fun commitInfo(repo: File, vararg args: String): CommitInfo? { +internal fun commitInfo(repo: File, vararg args: String): CommitInfo? { val output = execute(repo, GIT, "log", "--max-count", "1", "--format=%H/%cd/%P/%ce/%s", "--date=raw", *args) .splitNotBlank("/") // / //committer email/