package hudson.plugins.mercurial;
import hudson.model.AbstractBuild;
import hudson.scm.ChangeLogParser;
import hudson.util.Digester2;
import hudson.util.IOException2;
import org.apache.commons.digester.Digester;
import org.xml.sax.SAXException;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Set;
/**
* Parses the changelog.xml.
*
* See {@link MercurialChangeSet#CHANGELOG_TEMPLATE} for the format.
*/
public class MercurialChangeLogParser extends ChangeLogParser {
private final Set<String> modules;
public MercurialChangeLogParser(Set<String> modules) {
this.modules = modules;
}
public MercurialChangeSetList parse(AbstractBuild build, File changelogFile) throws IOException, SAXException {
Digester digester = new Digester2();
ArrayList<MercurialChangeSet> r = new ArrayList<MercurialChangeSet>();
digester.push(r);
digester.addObjectCreate("*/changeset", MercurialChangeSet.class);
digester.addSetProperties("*/changeset");
digester.addSetProperties("*/changeset","author","user");
digester.addBeanPropertySetter("*/changeset/msg");
digester.addBeanPropertySetter("*/changeset/added");
digester.addBeanPropertySetter("*/changeset/deleted");
digester.addBeanPropertySetter("*/changeset/files");
digester.addBeanPropertySetter("*/changeset/parents");
digester.addSetNext("*/changeset","add");
try {
digester.parse(changelogFile);
} catch (IOException e) {
throw new IOException2("Failed to parse "+changelogFile,e);
} catch (SAXException e) {
throw new IOException2("Failed to parse "+changelogFile,e);
}
if (modules != null) {
Iterator<MercurialChangeSet> it = r.iterator();
while (it.hasNext()) {
boolean include = false;
INCLUDE: for (String path : it.next().getAffectedPaths()) {
for (String module : modules) {
if (path.startsWith(module)) {
include = true;
break INCLUDE;
}
}
}
if (!include) {
it.remove();
}
}
}
return new MercurialChangeSetList(build,r);
}
}