package com.groupon.jenkins.dotci.patch;
import com.google.common.base.*;
import com.groupon.jenkins.github.services.*;
import hudson.model.*;
import org.kohsuke.github.*;
import org.wickedsource.diffparser.api.*;
import org.wickedsource.diffparser.api.model.*;
import java.io.*;
import java.util.*;
import java.util.regex.*;
public class PatchParser {
private final PrintStream logger;
public PatchParser(BuildListener listener) {
this.logger = listener.getLogger();
}
public List<PatchFile> getLines(String repoUrl,int prNumber){
GHRepository repo = new GithubRepositoryService(repoUrl).getGithubRepository();
List<PatchFile> files = new ArrayList<PatchFile>();
try {
DiffParser parser = new UnifiedDiffParser();
for(GHPullRequestFileDetail file : repo.getPullRequest(prNumber).listFiles()){
PatchFile patchFile = new PatchFile(file.getFilename());
files.add(patchFile);
if(file.getPatch() ==null) continue;
String fixPatch = fixPatch(file.getPatch());
// printPatches(file, fixPatch);
String patch = "--- /file/path\n+++ /file/path_new\n"+ fixPatch;
List<Diff> diffs = parser.parse(patch.getBytes());
for(Diff diff : diffs){
int pos =0;
for(Hunk hunk: diff.getHunks()){
PatchHunk patchHunk = new PatchHunk(hunk.getToFileRange());
patchFile.add(patchHunk);
int lineNo = hunk.getToFileRange().getLineStart();
for(Line line: hunk.getLines()){
pos = pos+1;
if(line.getLineType().equals(Line.LineType.NEUTRAL)){
lineNo= lineNo + 1;
}
if(line.getLineType().equals(Line.LineType.TO)){
patchHunk.add(new PatchLine(lineNo,pos));
lineNo= lineNo + 1;
}
}
pos = pos + 1; //Increment pos for each new hunk
}
}
}
} catch (IOException e) {
throw new RuntimeException(e);
}
return files;
}
// private void printPatches(GHPullRequestFileDetail file, String fixPatch) {
// logger.println("--------UnFixed Patch------------");
// logger.println(file.getPatch());
// logger.println("--------UnFixed Patch------------");
//
// logger.println("--------Fixed Patch------------");
// logger.println(fixPatch);
// logger.println("--------Fixed Patch------------");
// }
private String fixPatch(String patch){
String[] lines = patch.split("\n");
Pattern hunkStartPatternExtra = Pattern.compile("^(@@.*@@)(.+)");
Pattern hunkStartPatternLegit = Pattern.compile("^(@@.*@@)");
List fixedLines = new ArrayList<String>() ;
for(int i=0 ; i< lines.length ; i++){
Matcher matcher = hunkStartPatternExtra.matcher(lines[i].trim());
if(matcher.matches()){
fixedLines.add(matcher.group(1)) ;
// fixedLines.add(" "+matcher.group(2)) ;
}else{
Matcher legitMatcher = hunkStartPatternLegit.matcher(lines[i].trim());
if(legitMatcher.matches() && fixedLines.size() >0){//Add new line between hunks
fixedLines.add("\n");
}
fixedLines.add(lines[i]) ;
}
}
fixedLines.add("\n");
return Joiner.on("\n").join(fixedLines);
}
}