import java.io.File;
import java.io.FileInputStream;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
public class svnRevNrParser extends org.apache.tools.ant.Task{
private String fileName=null;
private String property=null;
public void setFile(String name) {
this.fileName = name;
}
public String getFile() {
return this.fileName;
}
public void setProperty(String property) {
this.property = property;
}
public String getProperty() {
return this.property;
}
public void execute() {
if (this.property==null || this.property.isEmpty()) {
log("svn entries file name property was not set properly",Project.MSG_ERR);
return;
}
if (this.fileName != null && this.fileName.length() > 0) {
File entriesFile = new File(this.fileName);
if (!entriesFile.exists()) throw new BuildException("SVN entries file '" + this.fileName + "' does not exist.");
if (!entriesFile.canRead()) throw new BuildException("SVN entries file '" + this.fileName + "' is not readable.");
// read the content of the file into memory
String dataStr;
try {
byte[] data = new byte[(int) entriesFile.length()];
FileInputStream input = new FileInputStream(entriesFile);
input.read(data);
dataStr = new String(data);
} catch (final Exception e) {
throw new BuildException("Unable to read the SVN entries file '" + this.fileName + "'");
}
// parse the content
Pattern pattern;
if (dataStr.startsWith("<?xml")) {
pattern = Pattern.compile("<entry[^>]*(?:name=\"\"[^>]*revision=\"(\\d*)\"|revision=\"(\\d*)\"[^>]*name=\"\")[^>]*/>");
} else {
pattern = Pattern.compile("\\s\\sdir\\s*(\\d*)\\s*(svn(\\+ssh)?|http(s?))://");
}
Matcher matcher = pattern.matcher(dataStr);
String revNr;
if (matcher.find()) {
revNr = matcher.group(1);
if (revNr == null) revNr = matcher.group(2);
System.out.println(revNr);
log("SVN revision number found: " + revNr, Project.MSG_VERBOSE);
} else {
log("Unable to determine the SVN revision number", Project.MSG_WARN);
revNr = "0000";
}
Project theProject = getProject();
if (theProject != null) {
theProject.setProperty(this.property, revNr);
log("Property '" + this.property + "' set to '" + revNr + "'", Project.MSG_VERBOSE);
}
} else {
throw new BuildException("File name attribute is required.");
}
}
public static void main(String[] args) {
svnRevNrParser parser = new svnRevNrParser();
// parser.setFile(".svn/entries");
// parser.setProperty("test");
// parser.execute();
parser.setFile("/home/theli/.eclipse/yacy/.svn/entries");
parser.setProperty("test");
parser.execute();
}
}