Copy Builds and BuildDefinition via api, question. RESOLVED
Unfortunately I am working on a copyproject function. one element is the build engines and builds.
I now can loop thru the data on the source server, and am starting to replicate the data (which there appears to be a LOT of).
Buildengine has a copyEngine() and BuildDef has a copyDefintion() functions. These appear to be deep copy, but of course embedded handles are copied intact. those handles of course are useless on the new repository.
Is there any documented tree of the objects down from build engine, that shows (object) handle relationships?
(that I can look at?)
oh, and I want to say, there is a very dangerous issue with adding a Builddef to a build engine supported list.
assuming that the list<> object is persistent outside the object is really nasty. (not to mention hard to learn)
buildEngine_new.getSupportedBuildDefinitions().add(bd_new);
one is depending that the value returned by getSupportedBuildDefinitions() is passed by reference and not by value.
this should have been encapsulated in the BuildEngine object with an addSupportedBuildDef(bd) method.
(and this design should be consistent across all the objects.. matching get/set methods).
Accepted answer
as a followon question (have to put this in an 'answer' cause of the size.)
I am successfully creating build engines and build definitions.
BuildDef only has the overview page successfully built.
if you add the schedule info the build def, it shows!!. doah!.. corrected below in bold
you have to copy the properties too!. corrected below in bold
I do not 'initialize' the builddef, cause I don't know what template it came from, I just copy data from the prod server instance to the dev server instance.
I process all the data for schedules and all the other tabs, but that data is not saved in the buildDef..
I looked thru the Eclipse UI code for creating engines and defs and don't 'see' anything special about the sub pages.
here is my clone builddef function
private static IBuildDefinition cloneBuildDef(ITeamRepository devrepo, IBuildDefinition oldbuildDef, IProcessAreaHandle new_project)
{
ITeamBuildClient buildClientdev = (ITeamBuildClient) devrepo
.getClientLibrary(ITeamBuildClient.class);
// create a new build definition connected to the new project area
IBuildDefinition newbuildDef = BuildItemFactory.createBuildDefinition((IProcessArea) new_project);
try {
newbuildDef.setId(oldbuildDef.getId()); // worked
newbuildDef.setDescription(oldbuildDef.getDescription()); // worked
newbuildDef.setIgnoreWarnings(oldbuildDef.isIgnoreWarnings());
// process the build pruning info
IBuildResultPruningPolicy ppp = BuildItemFactory.createBuildResultPruningPolicy();
ppp.setEnabled(oldbuildDef.getBuildResultPruningPolicy().isEnabled());
ppp.setFailedResultsToKeep(oldbuildDef.getBuildResultPruningPolicy().getFailedResultsToKeep());
ppp.setSuccessfulResultsToKeep(oldbuildDef.getBuildResultPruningPolicy().getSuccessfulResultsToKeep());
newbuildDef.setBuildResultPruningPolicy(ppp);
// process the build schedule info
IBuildSchedule pppp = BuildItemFactory.createBuildSchedule();
pppp.setScheduleEnabled(oldbuildDef.getBuildSchedule().isScheduleEnabled());
ArrayList<IBuildScheduleEntry> entrylist = new ArrayList<IBuildScheduleEntry>();
for(IBuildScheduleEntry ppppp: (List<IBuildScheduleEntry>)oldbuildDef.getBuildSchedule().getBuildScheduleEntries())
{
IBuildScheduleEntry newschedentry = BuildItemFactory.createBuildScheduleEntry();
newschedentry.setBuildHour(ppppp.getBuildHour());
newschedentry.setBuildInterval(ppppp.getBuildInterval());
newschedentry.setBuildMinute(ppppp.getBuildMinute());
newschedentry.setBuildOnMonday(ppppp.isBuildOnMonday());
newschedentry.setBuildOnTuesday(ppppp.isBuildOnTuesday());
newschedentry.setBuildOnWednesday(ppppp.isBuildOnWednesday());
newschedentry.setBuildOnThursday(ppppp.isBuildOnThursday());
newschedentry.setBuildOnFriday(ppppp.isBuildOnFriday());
newschedentry.setBuildOnSaturday(ppppp.isBuildOnSaturday());
newschedentry.setBuildOnSunday(ppppp.isBuildOnSunday());
System.out.println("build schedule entry time="+newschedentry.getBuildHour()+":"+newschedentry.getBuildMinute());
entrylist.add(newschedentry);
}
pppp.setBuildScheduleEntries(entrylist);
newbuildDef.setBuildSchedule(pppp);
// process the build configuration data
for(IBuildConfigurationElement buildConfElem:(List<IBuildConfigurationElement>)oldbuildDef.getConfigurationElements())
{
System.out.println("\t\tBuild Config element name="+buildConfElem.getName());
IBuildConfigurationElement newconfElem = BuildItemFactory. createBuildConfigurationElement();
newconfElem.setDescription(buildConfElem.getDescription());
newconfElem.setName(buildConfElem.getName());
newconfElem.setElementId(buildConfElem.getElementId());
newconfElem.setLicenseId(buildConfElem.getLicenseId());
newconfElem.setVariableSubstitutionAllowed(buildConfElem.isVariableSubstitutionAllowed());
for (IConfigurationProperty buildConfigProperty : (List <IConfigurationProperty>) buildConfElem.getConfigurationProperties())
{
String name = buildConfigProperty.getName();
String value = buildConfigProperty.getValue();
IConfigurationProperty new_ibcp = BuildItemFactory.createConfigurationProperty(name, value);
newconfElem.getConfigurationProperties().add(new_ibcp);
System.out.println("\t\t\tname:" + name + "---value:" + value);
System.out.println("there are now "+newconfElem.getConfigurationProperties().size()+" properties");
}
newbuildDef.getConfigurationElements().add(newconfElem);
}
// copy all the properties
for(IBuildProperty bdp :(List<IBuildProperty>)oldbuildDef.getProperties())
{
newbuildDef.setProperty(bdp.getName(), bdp.getValue());
}
// save the new build definition
newbuildDef=buildClientdev.save(newbuildDef,null);
}
catch (Exception e)
{
// TODO Auto-generated catch block
System.out.println("clone definition error = "+e.getMessage());
}
return newbuildDef;
}
Comments
also, how do you know what timezone a buildscheduleentry is using? local or GMT?
when I pull the data out, it shows
build schedule entry time=8:15
build schedule entry time=18:15
but in the build def UI it shows 3:15am(8-5=3) and 1:15pm(18-5=13=1pm)
never mind, doesn't matter if u save the data!