package hudson.plugins.redmine;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import org.kohsuke.stapler.DataBoundConstructor;
import hudson.Extension;
import hudson.model.AbstractProject;
import hudson.model.Descriptor;
import hudson.scm.EditType;
import hudson.scm.RepositoryBrowser;
import hudson.scm.SubversionRepositoryBrowser;
import hudson.scm.SubversionChangeLogSet.LogEntry;
import hudson.scm.SubversionChangeLogSet.Path;
/**
* produces redmine links.
*
* @author gaooh
* @date 2008/10/26
*/
public class RedmineRepositoryBrowser extends SubversionRepositoryBrowser {
@DataBoundConstructor
public RedmineRepositoryBrowser() {
}
@Override
public URL getDiffLink(Path path) throws IOException {
if(path.getEditType()!= EditType.EDIT) {
return null;
}
URL baseUrl = getRedmineURL(path.getLogEntry());
String projectName = getProject(path.getLogEntry());
String filePath = getFilePath(path.getLogEntry(), path.getValue());
int revision = path.getLogEntry().getRevision();
return new URL(baseUrl, "repositories/diff/" + projectName + filePath + "?rev=" + revision);
}
@Override
public URL getFileLink(Path path) throws IOException {
URL baseUrl = getRedmineURL(path.getLogEntry());
String projectName = getProject(path.getLogEntry());
String filePath = getFilePath(path.getLogEntry(), path.getValue());
return baseUrl == null ? null : new URL(baseUrl, "repositories/entry/" + projectName + filePath);
}
@Override
public URL getChangeSetLink(LogEntry changeSet) throws IOException {
URL baseUrl = getRedmineURL(changeSet);
String projectName = getProject(changeSet);
return baseUrl == null ? null : new URL(baseUrl, "repositories/revision/" + projectName + "/" + changeSet.getRevision());
}
@Override
public Descriptor<RepositoryBrowser<?>> getDescriptor() {
return DESCRIPTOR;
}
private URL getRedmineURL(LogEntry logEntry) throws MalformedURLException {
AbstractProject<?,?> p = (AbstractProject<?,?>)logEntry.getParent().build.getProject();
RedmineProjectProperty rpp = p.getProperty(RedmineProjectProperty.class);
if(rpp == null) {
return null;
} else {
return new URL(rpp.redmineWebsite);
}
}
private String getProject(LogEntry logEntry) {
AbstractProject<?,?> p = (AbstractProject<?,?>)logEntry.getParent().build.getProject();
RedmineProjectProperty rpp = p.getProperty(RedmineProjectProperty.class);
if(rpp == null) {
return null;
} else {
return rpp.projectName;
}
}
private String getFilePath(LogEntry logEntry, String fileFullPath) {
AbstractProject<?,?> p = (AbstractProject<?,?>)logEntry.getParent().build.getProject();
RedmineProjectProperty rpp = p.getProperty(RedmineProjectProperty.class);
String filePath = "";
if(rpp.redmineVersion.booleanValue()) { // 0.8.1 or after
filePath = fileFullPath;
} else { // 0.8.0 or before
String[] filePaths = fileFullPath.split("/");
filePath = "/";
if(filePaths.length > 2) {
for(int i = 2 ; i < filePaths.length; i++) {
filePath = filePath + filePaths[i];
if(i != filePaths.length - 1) {
filePath = filePath + "/";
}
}
}
}
return filePath;
}
@Extension
public static final DescriptorImpl DESCRIPTOR = new DescriptorImpl();
public static final class DescriptorImpl extends Descriptor<RepositoryBrowser<?>> {
public DescriptorImpl() {
super(RedmineRepositoryBrowser.class);
}
public String getDisplayName() {
return "Redmine";
}
}
}