package hudson.plugins.im.build_notify; import hudson.Extension; import hudson.model.AbstractBuild; import hudson.model.BuildListener; import hudson.model.Result; import hudson.model.ResultTrend; import hudson.plugins.im.IMPublisher; import hudson.scm.ChangeLogSet.Entry; import org.kohsuke.stapler.DataBoundConstructor; import java.io.IOException; /** * {@link BuildToChatNotifier} that maintains the traditional behaviour of {@link IMPublisher}. * * @author Kohsuke Kawaguchi */ public class DefaultBuildToChatNotifier extends SummaryOnlyBuildToChatNotifier { @DataBoundConstructor public DefaultBuildToChatNotifier() { } @Override public String buildStartMessage(IMPublisher publisher, AbstractBuild<?, ?> build, BuildListener listener) throws IOException, InterruptedException { StringBuilder sb = new StringBuilder(super.buildStartMessage(publisher, build, listener)); AbstractBuild<?, ?> previousBuild = build.getPreviousBuild(); if (previousBuild != null && !previousBuild.isBuilding()) { sb.append(" (previous build: ") .append(ResultTrend.getResultTrend(previousBuild).getID()); if (previousBuild.getResult().isWorseThan(Result.SUCCESS)) { AbstractBuild<?, ?> lastSuccessfulBuild = build.getPreviousSuccessfulBuild(); if (lastSuccessfulBuild != null) { sb.append(" -- last ").append(Result.SUCCESS).append(" ") .append(lastSuccessfulBuild.getDisplayName()) .append(" ").append(lastSuccessfulBuild.getTimestampString()).append(" ago"); } } sb.append(")"); } return sb.toString(); } @Override public String buildCompletionMessage(IMPublisher publisher, AbstractBuild<?, ?> build, BuildListener listener) throws IOException, InterruptedException { StringBuilder sb = new StringBuilder(super.buildCompletionMessage(publisher,build,listener)); if (!build.getChangeSet().isEmptySet()) { boolean hasManyChangeSets = build.getChangeSet().getItems().length > 1; for (Entry entry : build.getChangeSet()) { sb.append("\n"); if (hasManyChangeSets) { sb.append("* "); } sb.append(entry.getAuthor()).append(": ").append(entry.getMsg()); } } return sb.toString(); } // set a high ordinal so that this comes in the top, as the default selection @Extension(ordinal=100) public static class DescriptorImpl extends BuildToChatNotifierDescriptor { @Override public String getDisplayName() { return "Summary + SCM changes"; } } }