package hudson.plugins.trac; import hudson.Extension; import hudson.model.Descriptor; import hudson.model.AbstractProject; import hudson.scm.EditType; import hudson.scm.RepositoryBrowser; import hudson.scm.SubversionChangeLogSet.LogEntry; import hudson.scm.SubversionChangeLogSet.Path; import hudson.scm.SubversionRepositoryBrowser; import org.kohsuke.stapler.DataBoundConstructor; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; /** * {@link SubversionRepositoryBrowser} that produces Trac links. */ public class TracRepositoryBrowser extends SubversionRepositoryBrowser { @DataBoundConstructor public TracRepositoryBrowser() { } /** * Gets a URL for the {@link TracProjectProperty#tracWebsite} value * configured for the current project. */ private URL getTracWebURL(LogEntry cs) throws MalformedURLException { AbstractProject<?,?> p = (AbstractProject<?,?>)cs.getParent().build.getProject(); TracProjectProperty tpp = p.getProperty(TracProjectProperty.class); if(tpp==null) return null; else return new URL(tpp.tracWebsite); } @Override public URL getDiffLink(Path path) throws IOException { if(path.getEditType()!= EditType.EDIT) return null; // no diff if this is not an edit change URL baseUrl = getTracWebURL(path.getLogEntry()); int revision = path.getLogEntry().getRevision(); return new URL(baseUrl, "changeset/" + revision + path.getValue() + "#file0"); } @Override public URL getFileLink(Path path) throws IOException { URL baseUrl = getTracWebURL(path.getLogEntry()); return baseUrl == null ? null : new URL(baseUrl, "browser" + path.getValue() + "#L1"); } @Override public URL getChangeSetLink(LogEntry changeSet) throws IOException { URL baseUrl = getTracWebURL(changeSet); return baseUrl == null ? null : new URL(baseUrl, "changeset/" + changeSet.getRevision()); } @Extension public static final class DescriptorImpl extends Descriptor<RepositoryBrowser<?>> { public DescriptorImpl() { super(TracRepositoryBrowser.class); } public String getDisplayName() { return "Trac"; } } }