From c092d7ea147c3b13f373c682a2d9239cdf6a854e Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Tue, 26 Feb 2013 16:36:15 +0100 Subject: [PATCH] external make: better diagnostic message for fully rebuilt modules --- .../jps/incremental/BuildOperations.java | 14 +------ .../jps/incremental/IncProjectBuilder.java | 41 ++++++++++++++++++- .../storage/BuildTargetConfiguration.java | 16 +++++++- 3 files changed, 56 insertions(+), 15 deletions(-) diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/BuildOperations.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/BuildOperations.java index 25effec23dca..6f2015e88bc4 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/BuildOperations.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/BuildOperations.java @@ -22,13 +22,10 @@ import org.jetbrains.jps.builders.*; import org.jetbrains.jps.builders.impl.BuildOutputConsumerImpl; import org.jetbrains.jps.builders.impl.BuildTargetChunk; import org.jetbrains.jps.builders.impl.DirtyFilesHolderBase; -import org.jetbrains.jps.builders.java.JavaModuleBuildTargetType; import org.jetbrains.jps.builders.logging.ProjectBuilderLogger; import org.jetbrains.jps.builders.storage.SourceToOutputMapping; import org.jetbrains.jps.cmdline.ProjectDescriptor; import org.jetbrains.jps.incremental.fs.BuildFSState; -import org.jetbrains.jps.incremental.messages.BuildMessage; -import org.jetbrains.jps.incremental.messages.CompilerMessage; import org.jetbrains.jps.incremental.messages.DoneSomethingNotification; import org.jetbrains.jps.incremental.messages.FileDeletedEvent; import org.jetbrains.jps.incremental.storage.BuildDataManager; @@ -51,25 +48,16 @@ public class BuildOperations { final ProjectDescriptor pd = context.getProjectDescriptor(); final Timestamps timestamps = pd.timestamps.getStorage(); final BuildTargetConfiguration configuration = pd.getTargetsState().getTargetConfiguration(target); - boolean isTargetConfigChange = false; if (context.isProjectRebuild()) { FSOperations.markDirtyFiles(context, target, timestamps, true, null, null); pd.fsState.markInitialScanPerformed(target); configuration.save(); } - else if (context.getScope().isRecompilationForced(target) || - (isTargetConfigChange = configuration.isTargetDirty()) || - configuration.outputRootWasDeleted(context)) { + else if (context.getScope().isRecompilationForced(target) || configuration.isTargetDirty(context) || configuration.outputRootWasDeleted(context)) { initTargetFSState(context, target, true); IncProjectBuilder.clearOutputFiles(context, target); pd.dataManager.cleanTargetStorages(target); configuration.save(); - - if (isTargetConfigChange && ModuleBuildTarget.REBUILD_ON_DEPENDENCY_CHANGE && JavaModuleBuildTargetType.PRODUCTION.equals(target.getTargetType())) { - final String moduleName = ((ModuleBuildTarget)target).getModule().getName(); - context.processMessage(new CompilerMessage("", BuildMessage.Kind.INFO, "Rebuilding module \"" + moduleName + "\" because of dependencies change")); - } - } else if (!pd.fsState.isInitialScanPerformed(target)) { initTargetFSState(context, target, false); diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java index d8e4048a7ff1..d4f828572b68 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/IncProjectBuilder.java @@ -49,10 +49,12 @@ import org.jetbrains.jps.cmdline.ProjectDescriptor; import org.jetbrains.jps.incremental.fs.BuildFSState; import org.jetbrains.jps.incremental.java.ExternalJavacDescriptor; import org.jetbrains.jps.incremental.messages.*; +import org.jetbrains.jps.incremental.storage.BuildTargetConfiguration; import org.jetbrains.jps.incremental.storage.OneToManyPathsMapping; import org.jetbrains.jps.indices.ModuleExcludeIndex; import org.jetbrains.jps.model.java.JpsJavaExtensionService; import org.jetbrains.jps.model.java.compiler.JpsJavaCompilerConfiguration; +import org.jetbrains.jps.model.module.JpsModule; import org.jetbrains.jps.service.SharedThreadPool; import org.jetbrains.jps.util.JpsPathUtil; @@ -177,6 +179,7 @@ public class IncProjectBuilder { context = createContext(scope, isMake, isProjectRebuild); runBuild(context, forceCleanCaches); myProjectDescriptor.dataManager.saveVersion(); + reportRebuiltModules(context); } catch (ProjectBuildException e) { final Throwable cause = e.getCause(); @@ -191,8 +194,9 @@ public class IncProjectBuilder { throw new RebuildRequestedException(cause); } else { + reportRebuiltModules(context); if (cause == null) { - // some builder desided to stop the build + // some builder decided to stop the build // report optional progress message if exists final String msg = e.getMessage(); if (!StringUtil.isEmpty(msg)) { @@ -222,6 +226,41 @@ public class IncProjectBuilder { } } + private static void reportRebuiltModules(CompileContextImpl context) { + final Set modules = BuildTargetConfiguration.MODULES_WITH_TARGET_CONFIG_CHANGED_KEY.get(context); + if (modules == null || modules.isEmpty()) { + return; + } + final StringBuilder message = new StringBuilder(); + if (modules.size() > 1) { + message.append("Modules "); + final int namesLimit = 5; + int idx = 0; + for (Iterator iterator = modules.iterator(); iterator.hasNext(); ) { + final JpsModule module = iterator.next(); + if (idx == namesLimit && iterator.hasNext()) { + message.append(" and ").append(modules.size() - namesLimit).append(" others"); + break; + } + if (idx > 0) { + message.append(", "); + } + message.append("\"").append(module.getName()).append("\""); + idx += 1; + } + message.append(" were"); + } + else { + message.append("Module \"").append(modules.iterator().next().getName()).append("\" was"); + } + message.append(" fully rebuilt due to project configuration"); + if (ModuleBuildTarget.REBUILD_ON_DEPENDENCY_CHANGE) { + message.append("/dependencies"); + } + message.append(" changes"); + context.processMessage(new CompilerMessage("", BuildMessage.Kind.INFO, message.toString())); + } + private static void flushContext(CompileContext context) { if (context != null) { final ProjectDescriptor pd = context.getProjectDescriptor(); diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/BuildTargetConfiguration.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/BuildTargetConfiguration.java index 8067aefacd5c..8d926f89c273 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/BuildTargetConfiguration.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/storage/BuildTargetConfiguration.java @@ -16,6 +16,7 @@ package org.jetbrains.jps.incremental.storage; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.util.Key; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.SmartList; @@ -23,6 +24,8 @@ import gnu.trove.THashSet; import org.jetbrains.jps.builders.BuildTarget; import org.jetbrains.jps.incremental.CompileContext; import org.jetbrains.jps.incremental.GlobalContextKey; +import org.jetbrains.jps.incremental.ModuleBuildTarget; +import org.jetbrains.jps.model.module.JpsModule; import java.io.*; import java.util.Collection; @@ -34,6 +37,7 @@ import java.util.Set; * @author nik */ public class BuildTargetConfiguration { + public static final Key> MODULES_WITH_TARGET_CONFIG_CHANGED_KEY = GlobalContextKey.create("_modules_with_target_config_changed_"); private static final Logger LOG = Logger.getInstance(BuildTargetConfiguration.class); private final BuildTarget myTarget; private final BuildTargetsState myTargetsState; @@ -60,7 +64,7 @@ public class BuildTargetConfiguration { return ""; } - public boolean isTargetDirty() { + public boolean isTargetDirty(CompileContext context) { final String currentState = getCurrentState(); if (!currentState.equals(myConfiguration)) { LOG.debug(myTarget + " configuration was changed:"); @@ -69,6 +73,16 @@ public class BuildTargetConfiguration { LOG.debug("New:"); LOG.debug(currentState); LOG.debug(myTarget + " will be recompiled"); + if (myTarget instanceof ModuleBuildTarget) { + final JpsModule module = ((ModuleBuildTarget)myTarget).getModule(); + synchronized (MODULES_WITH_TARGET_CONFIG_CHANGED_KEY) { + Set modules = MODULES_WITH_TARGET_CONFIG_CHANGED_KEY.get(context); + if (modules == null) { + MODULES_WITH_TARGET_CONFIG_CHANGED_KEY.set(context, modules = new THashSet()); + } + modules.add(module); + } + } return true; } return false;