external build: send messages when building of target is started/finished (to be used in TeamCity)

This commit is contained in:
nik
2013-04-30 13:27:24 +04:00
parent e4e74cf8a6
commit c2b41bb4f9
4 changed files with 62 additions and 4 deletions
@@ -139,13 +139,16 @@ final class BuildSession implements Runnable, CanceledStatus {
CustomBuilderMessage builderMessage = (CustomBuilderMessage)buildMessage;
response = CmdlineProtoUtil.createCustomBuilderMessage(builderMessage.getBuilderId(), builderMessage.getMessageType(), builderMessage.getMessageText());
}
else {
else if (!(buildMessage instanceof BuildingTargetProgressMessage)) {
float done = -1.0f;
if (buildMessage instanceof ProgressMessage) {
done = ((ProgressMessage)buildMessage).getDone();
}
response = CmdlineProtoUtil.createCompileProgressMessageResponse(buildMessage.getMessageText(), done);
}
else {
response = null;
}
if (response != null) {
Channels.write(myChannel, CmdlineProtoUtil.toMessage(mySessionId, response));
}
@@ -809,6 +809,7 @@ public class IncProjectBuilder {
private void buildTargetsChunk(CompileContext context, final BuildTargetChunk chunk) throws ProjectBuildException {
boolean doneSomething;
try {
sendBuildingTargetMessages(chunk.getTargets(), BuildingTargetProgressMessage.Event.STARTED);
Utils.ERRORS_DETECTED_KEY.set(context, Boolean.FALSE);
for (BuildTarget<?> target : chunk.getTargets()) {
@@ -864,9 +865,14 @@ public class IncProjectBuilder {
finally {
Utils.REMOVED_SOURCES_KEY.set(context, null);
}
sendBuildingTargetMessages(chunk.getTargets(), BuildingTargetProgressMessage.Event.FINISHED);
}
}
private void sendBuildingTargetMessages(@NotNull Set<? extends BuildTarget<?>> targets, @NotNull BuildingTargetProgressMessage.Event event) {
myMessageDispatcher.processMessage(new BuildingTargetProgressMessage(targets, event));
}
private static void createClasspathIndex(final BuildTargetChunk chunk) {
final Set<File> outputDirs = new THashSet<File>(FileUtil.FILE_HASHING_STRATEGY);
for (BuildTarget<?> target : chunk.getTargets()) {
@@ -992,6 +998,7 @@ public class IncProjectBuilder {
// return true if changed something, false otherwise
private boolean runModuleLevelBuilders(final CompileContext context, final ModuleChunk chunk) throws ProjectBuildException, IOException {
sendBuildingTargetMessages(chunk.getTargets(), BuildingTargetProgressMessage.Event.STARTED);
for (BuilderCategory category : BuilderCategory.values()) {
for (ModuleLevelBuilder builder : myBuilderRegistry.getBuilders(category)) {
builder.chunkBuildStarted(context, chunk);
@@ -1105,6 +1112,7 @@ public class IncProjectBuilder {
builder.chunkBuildFinished(context, chunk);
}
}
sendBuildingTargetMessages(chunk.getTargets(), BuildingTargetProgressMessage.Event.FINISHED);
}
return doneSomething;
@@ -0,0 +1,47 @@
package org.jetbrains.jps.incremental.messages;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.NotNullFunction;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jps.builders.BuildTarget;
import java.util.Collection;
/**
* @author nik
*/
public class BuildingTargetProgressMessage extends BuildMessage {
private final Collection<? extends BuildTarget<?>> myTargets;
@NotNull private final Event myEventType;
public enum Event {
STARTED, FINISHED
}
public BuildingTargetProgressMessage(@NotNull Collection<? extends BuildTarget<?>> targets, @NotNull Event event) {
super(composeMessageText(targets, event), Kind.PROGRESS);
myTargets = targets;
myEventType = event;
}
private static String composeMessageText(Collection<? extends BuildTarget<?>> targets, Event event) {
String targetsString = StringUtil.join(targets, new NotNullFunction<BuildTarget<?>, String>() {
@NotNull
@Override
public String fun(BuildTarget<?> dom) {
return dom.getPresentableName();
}
}, ", ");
return (event == Event.STARTED ? "Started" : "Finished") + " building " + targetsString;
}
@NotNull
public Collection<? extends BuildTarget<?>> getTargets() {
return myTargets;
}
@NotNull
public Event getEventType() {
return myEventType;
}
}
@@ -1183,9 +1183,9 @@ public class StringUtil extends StringUtilRt {
}
@NotNull
public static <T> String join(@NotNull Collection<T> items, @NotNull Function<T, String> f, @NotNull @NonNls String separator) {
public static <T> String join(@NotNull Collection<? extends T> items, @NotNull Function<? super T, String> f, @NotNull @NonNls String separator) {
if (items.isEmpty()) return "";
return join((Iterable<T>)items, f, separator);
return join((Iterable<? extends T>)items, f, separator);
}
public static String join(@NotNull Iterable<?> items, @NotNull @NonNls String separator) {
@@ -1200,7 +1200,7 @@ public class StringUtil extends StringUtilRt {
}
@NotNull
public static <T> String join(@NotNull Iterable<T> items, @NotNull Function<T, String> f, @NotNull @NonNls String separator) {
public static <T> String join(@NotNull Iterable<? extends T> items, @NotNull Function<? super T, String> f, @NotNull @NonNls String separator) {
final StringBuilder result = new StringBuilder();
for (T item : items) {
String string = f.fun(item);