package hudson.plugins.git.util;
import hudson.model.Action;
import hudson.model.Api;
import hudson.plugins.git.Branch;
import hudson.plugins.git.Revision;
import java.io.Serializable;
import java.util.HashMap;
import java.util.IdentityHashMap;
import java.util.Map;
import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean;
import org.spearce.jgit.lib.ObjectId;
@ExportedBean( defaultVisibility = 999)
public class BuildData implements Action, Serializable, Cloneable
{
private static final long serialVersionUID = 1L;
/**
* Map of branch name -> build (Branch name to last built SHA1).
*/
public Map<String, Build> buildsByBranchName = new HashMap<String, Build>();
/**
* The last build that we did.
*/
public Build lastBuild;
public String getDisplayName()
{
return "Git Build Data";
}
public String getIconFileName()
{
return "/plugin/git/icons/git-32x32.png";
}
public String getUrlName()
{
return "git";
}
/**
* Return true if the history shows this SHA1 has been built.
* False otherwise.
* @param sha1
* @return
*/
public boolean hasBeenBuilt(ObjectId sha1)
{
try
{
for(Build b : buildsByBranchName.values())
{
if( b.revision.getSha1().equals(sha1) )
return true;
}
return false;
}
catch(Exception ex)
{
return false;
}
}
public void saveBuild(Build build)
{
lastBuild = build;
for( Branch branch : build.revision.getBranches() )
{
buildsByBranchName.put(branch.getName(), build);
}
}
public Build getLastBuildOfBranch(String branch)
{
try
{
return buildsByBranchName.get(branch);
}
catch(Exception ex)
{
return null;
}
}
@Exported
public Revision getLastBuiltRevision() {
return lastBuild==null?null:lastBuild.revision;
}
@Override
public BuildData clone()
{
BuildData clone;
try
{
clone = (BuildData) super.clone();
}
catch (CloneNotSupportedException e)
{
throw new RuntimeException("Error cloning BuildData", e);
}
IdentityHashMap<Build, Build> clonedBuilds = new IdentityHashMap<Build, Build>();
if (buildsByBranchName != null)
{
clone.buildsByBranchName = new HashMap<String, Build>();
for (Map.Entry<String, Build> buildByBranchName : buildsByBranchName.entrySet())
{
String branchName = buildByBranchName.getKey();
Build build = buildByBranchName.getValue();
Build clonedBuild = clonedBuilds.get(build);
if (clonedBuild == null)
{
clonedBuild = build.clone();
clonedBuilds.put(build, clonedBuild);
}
clone.buildsByBranchName.put(branchName, clonedBuild);
}
}
if (lastBuild != null)
{
clone.lastBuild = clonedBuilds.get(lastBuild);
if (clone.lastBuild == null)
{
clone.lastBuild = lastBuild.clone();
clonedBuilds.put(lastBuild, clone.lastBuild);
}
}
return clone;
}
public Api getApi() {
return new Api(this);
}
}