package it.unitn.molerat.repos.wrappers; import java.io.IOException; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; import java.util.TreeMap; import java.util.regex.Matcher; import java.util.regex.Pattern; import it.unitn.molerat.evidence.Changes; public abstract class RepoWrapper { protected String diffFilePrefix; protected final Pattern hunkRegexPattern = Pattern.compile("@@[ ]*\\-([0-9]+)[\\,0-9 ]+\\+([0-9]+)[\\,0-9 ]+@@"); protected final Pattern commentsPattern = Pattern.compile("(\\*|\\/\\*|\\*\\/|\\/\\/)(.*)"); public abstract String doDiff(String leftRev, String rightRev) throws Exception; public abstract String doDiff(String path, String leftRev, String rightRev) throws Exception; public abstract void annotate(String path, String rev, Object callback) throws Exception; public abstract String doCat(String path, String rev) throws Exception; public abstract String getBasePath(); public abstract Set getRevisionFiles(String rev, String filter) throws Exception; public abstract Set getRevisionNumbers(String topRev) throws Exception; public abstract Map determineOriginatingRevision(final String filePath, final String revision, final Map lines) throws Exception; public Set inferChangesFromDiff(String diffText, String leftRev, String rightRev) throws IOException { Set relevantChanges = new LinkedHashSet<>(); Changes newRelevantChanges = null; int deletionRange = -1; int additionRange = -1; boolean additionRangeNotSet = true; boolean deletionRangeNotSet = true; String[] diffLines = diffText.split(System.getProperty("line.separator")); //for (String line : diffLines) { for (int i=0; i lines) { Iterator> it = lines.entrySet().iterator(); while (it.hasNext()) { String line = it.next().getValue(); Matcher commentMatcher = this.commentsPattern.matcher(line.trim()); if (line.trim().isEmpty() || commentMatcher.matches()) { it.remove(); } } } public Map getLineMappings(final String fileContents) { Map lineMappings = new TreeMap(); String[] lines = fileContents.split(System.getProperty("line.separator")); int lineNumber = 1; for (String line : lines) { line = line.trim().replace("\t",""); lineMappings.put(lineNumber++, line); } return lineMappings; } public int getNumberOfLoc(final String fileContents) { return this.getLineMappings(fileContents).size(); } public int getNumberOfLocFiltered(final String fileContents) { Map locs = this.getLineMappings(fileContents); this.filterCommentsAndBlanks(locs); return locs.size(); } protected abstract String getReleaseTag(String release) throws Exception; public abstract String getReleaseCommit(String release) throws Exception; public abstract Set getAllRepositoryTransactions() throws Exception; }