package hudson.plugins.svn_release_mgr; import hudson.model.AbstractProject; import hudson.model.Cause; import hudson.model.ParametersAction; import hudson.model.ProminentProjectAction; import hudson.model.Run; import hudson.model.StringParameterValue; import hudson.model.TaskListener; import hudson.plugins.svn_release_mgr.model.Revision; import hudson.scm.SubversionReleaseSCM; import hudson.scm.SubversionReleaseSCM.ModuleLocation; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Iterator; import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; import java.util.logging.Logger; import javax.servlet.ServletException; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; import org.tmatesoft.svn.core.SVNException; import org.tmatesoft.svn.core.SVNLogEntry; import org.tmatesoft.svn.core.SVNURL; import org.tmatesoft.svn.core.auth.ISVNAuthenticationProvider; import org.tmatesoft.svn.core.internal.io.dav.DAVRepositoryFactory; import org.tmatesoft.svn.core.io.SVNRepository; import org.tmatesoft.svn.core.wc.SVNClientManager; public class ProjectReleaseAction implements ProminentProjectAction { private AbstractProject<?, ?> owner; private JobPropertyImpl property; private static final Logger LOGGER = Logger.getLogger(ProjectReleaseAction.class.getName()); public ProjectReleaseAction(AbstractProject<?, ?> owner, JobPropertyImpl property) { this.owner = owner; this.property = property; } private ISVNAuthenticationProvider getAuthProvider() { return getSubversion().getDescriptor().createAuthenticationProvider(); } private ModuleLocation[] getLocations() { return getSubversion().getLocations(); } public Collection<Revision> getRevisions() { Collection revisions = new ArrayList(); int i = 1; int maxRevisions = Integer.parseInt(property.maxRevisions); for (Revision r:getRevisions(0, -1)) { revisions.add(r); i++; if (i > maxRevisions) break; } return revisions; } public Collection<Revision> getRevisions(String start, String end) { return getRevisions(Long.parseLong(start), Long.parseLong(end)); } public Collection<Revision> getRevisions(long start, long end) { DAVRepositoryFactory.setup(); SortedMap<Long, Revision> revisions = new TreeMap<Long, Revision>(Collections.reverseOrder()); for (ModuleLocation l : getLocations()) { SVNURL svnUrl; SVNRepository repository; try { svnUrl = l.getSVNURL(); repository = createSvnClientManager().createRepository(svnUrl, true); Collection logEntries = null; logEntries = repository.log(new String[] { "" }, null, start, end, true, false); for (Iterator entries = logEntries.iterator(); entries.hasNext();) { SVNLogEntry logEntry = (SVNLogEntry) entries.next(); revisions.put(logEntry.getRevision(), new Revision(logEntry)); // -------------DEBUG OUTPUT--------------- LOGGER.fine("---------------------------------------------"); LOGGER.fine("revision: " + logEntry.getRevision()); LOGGER.fine("author: " + logEntry.getAuthor()); LOGGER.fine("date: " + logEntry.getDate()); LOGGER.fine("log message: " + logEntry.getMessage()); LOGGER.fine("---------------------------------------------"); } } catch (SVNException e) { // TODO Auto-generated catch block e.printStackTrace(); } } for (Run r : owner.getBuilds().toArray(new Run[0])) { try { Map<String, String> env = r.getEnvironment(TaskListener.NULL); LOGGER.fine("---------ENV VARS FOR RUN:" + r.number); for (String key : env.keySet()) { LOGGER.fine(key + " = " + env.get(key)); } } catch (Exception ex) { } Long rev = Revision.getRevisionNumber(r); if (rev == null) continue; Revision revision = revisions.get(rev); if (revision != null ) { //Add the link to the build as well - DOES NOT WORK //if (r.getActions(ProjectReleaseAction.class).size() < 1) r.addAction(this); revision.addBuild(r); } } return revisions.values(); } public String getUrlName() { return "releases"; } public String getDisplayName() { return "Releases"; } public String getIconFileName() { return "clipboard.gif"; } public AbstractProject<?, ?> getOwner() { return owner; } public void setOwner(AbstractProject<?, ?> owner) { this.owner = owner; } public JobPropertyImpl getProperty() { return property; } public void setProperty(JobPropertyImpl property) { this.property = property; } public SubversionReleaseSCM getSubversion() { return (SubversionReleaseSCM)owner.getScm(); } public SVNClientManager createSvnClientManager() { return SubversionReleaseSCM.createSvnClientManager(getAuthProvider()); } public void doBuild(StaplerRequest req, StaplerResponse rsp) throws ServletException, IOException { owner.scheduleBuild(0, new Cause.UserCause(), new ParametersAction(new StringParameterValue("REVISION", req.getParameter("revision")))); rsp.forwardToPreviousPage(req); } }