package hudson.plugins.googlecode.scm;
import java.util.List;
import java.util.logging.Logger;
import hudson.Extension;
import hudson.model.AbstractProject;
import hudson.model.Hudson;
import hudson.model.TopLevelItem;
import hudson.model.listeners.ItemListener;
import hudson.plugins.googlecode.GoogleCodeProjectProperty;
import hudson.scm.SCM;
/**
* ItemListener that will upgrade GoogleCodeSCM objects to GoogleCodeSCMEx objects.
* Due to the bug https://hudson.dev.java.net/issues/show_bug.cgi?id=4136, the old Google code SCM
* objects has to be reconfigured to use the new GoogleCodeSCMEx.
*
* @author redsolo
*/
@Extension
public class GoogleCodeSCMUpgrader extends ItemListener {
private static final Logger logger = Logger.getLogger(GoogleCodeSCMUpgrader.class.getName());
@Override
public void onLoaded() {
onLoaded(Hudson.getInstance().getItems());
}
/**
* Goes through the items to upgrade each GoogleCodeSCM to GoogleCodeSCMEx
* Method extracted because it is easier to mock TopLevelItems than start a Hudson test case
* @param items list of top level items
*/
void onLoaded(List<TopLevelItem> items) {
for (TopLevelItem item : items) {
if (item instanceof AbstractProject<?,?>) {
AbstractProject<?, ?> abstractProject = (AbstractProject<?,?>) item;
SCM oldScm = abstractProject.getScm();
if (oldScm instanceof GoogleCodeSCM) {
upgradeScmInProject(abstractProject, (GoogleCodeSCM) oldScm);
}
}
}
}
/**
* Upgrades the SCM in project with data from the old scm
* @param abstractProject project containing a GoogleCodeProjectProperty
* @param oldScm old scm containing remote directory
*/
void upgradeScmInProject(AbstractProject<?, ?> abstractProject, GoogleCodeSCM oldScm) {
String name = abstractProject.getName();
try {
GoogleCodeSCMEx scmCopy = copy(oldScm, abstractProject.getProperty(GoogleCodeProjectProperty.class));
abstractProject.setScm(scmCopy);
abstractProject.save();
logger.info("Upgraded Google Code SCM in '" + name + "'.");
} catch (Exception e) {
logger.warning("Error while upgrading Google Code SCM configuration for '" + name +
"'. The project is still usable, but should be manually configured again. " +
"For more information please see https://hudson.dev.java.net/issues/show_bug.cgi?id=4136.");
abstractProject.setScm(oldScm);
}
}
/**
* Copies the old GoogleCodeSCM to a new GoogleCodeSCMEx object
* @param source scm to copy
* @param property property containing the project URL
* @return a new GoogleCodeSCMEx class
*/
GoogleCodeSCMEx copy(GoogleCodeSCM source, GoogleCodeProjectProperty property) {
return GoogleCodeSCMEx.DescriptorImpl.newInstance(property, source.getDirectory());
}
}