package hudson.plugins.disk_usage; import hudson.model.AbstractBuild; import hudson.model.AbstractProject; import hudson.model.BuildBadgeAction; import hudson.model.ItemGroup; import hudson.model.Job; import java.util.LinkedList; import java.util.List; /** * Disk usage information for a single build * @author dvrzalik */ public class BuildDiskUsageAction extends DiskUsageAction implements BuildBadgeAction { DiskUsage diskUsage; AbstractBuild build; public BuildDiskUsageAction(AbstractBuild build, long wsUsage, long buildUsage) { diskUsage = new DiskUsage(buildUsage, wsUsage); this.build = build; } /** * @return Disk usage of the build (included child builds) */ public DiskUsage getDiskUsage() { DiskUsage du = (diskUsage != null) ? new DiskUsage(diskUsage.buildUsage, diskUsage.wsUsage) : new DiskUsage(0,0); for (AbstractBuild child : getChildBuilds(build)) { BuildDiskUsageAction bdua = child.getAction(BuildDiskUsageAction.class); if (bdua != null) { du.buildUsage += bdua.diskUsage.getBuildUsage(); } } //In case there is no workspace size available, refer to the previous result AbstractBuild previous = build; while((du.wsUsage == 0) && ((previous = (AbstractBuild) previous.getPreviousBuild()) != null)) { BuildDiskUsageAction bdua = previous.getAction(BuildDiskUsageAction.class); if (bdua != null) { du.wsUsage = bdua.diskUsage.wsUsage; } } return du; } /** * @return Buidls of nested projects (like MavenModuleBuilds and MatrixRuns) */ private static List<AbstractBuild> getChildBuilds(AbstractBuild build) { List<AbstractBuild> result = new LinkedList<AbstractBuild>(); Job project = build.getParent(); if (project instanceof ItemGroup) { for (Object child : ((ItemGroup) project).getItems()) { if (child instanceof AbstractProject) { AbstractBuild childBuild = (AbstractBuild) ((AbstractProject) child).getNearestBuild(build.getNumber()); AbstractBuild nextBuild = (AbstractBuild) build.getNextBuild(); Integer nextBuildNumber = (nextBuild != null) ? nextBuild.getNumber() : Integer.MAX_VALUE; while ((childBuild != null) && (childBuild.getNumber() < nextBuildNumber)) { result.add(childBuild); childBuild = (AbstractBuild) childBuild.getNextBuild(); } } } } return result; } }