package br.ufmg.dcc.labsoft.aserg.modularitycheck.bugparser.model.source.git; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.eclipse.jgit.diff.DiffEntry; import org.eclipse.jgit.diff.DiffFormatter; import org.eclipse.jgit.diff.RawTextComparator; import org.eclipse.jgit.errors.IncorrectObjectTypeException; import org.eclipse.jgit.errors.MissingObjectException; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevWalk; import org.eclipse.jgit.treewalk.CanonicalTreeParser; import org.eclipse.jgit.treewalk.EmptyTreeIterator; import org.eclipse.jgit.util.io.DisabledOutputStream; import br.ufmg.dcc.labsoft.aserg.modularitycheck.bugparser.model.source.Commit; import br.ufmg.dcc.labsoft.aserg.modularitycheck.bugparser.util.Properties; public class GITLogHandler { private List<Commit> commits; public GITLogHandler() { commits = new ArrayList<Commit>(); } public void handleLogEntry(Iterable<RevCommit> logs, Repository repository) { List<DiffEntry> diffs = null; Commit commit = null; for (RevCommit rev : logs) { StringBuilder builder = new StringBuilder(); String temp = rev.getFullMessage().replaceAll("[\n]", Properties.BLANK); temp.replaceAll("[\n]", Properties.BLANK); builder.append(temp).append(Properties.BLANK); temp = rev.getShortMessage().replaceAll("[\n]", Properties.BLANK); temp.replaceAll("[\t]", Properties.BLANK); builder.append(temp).append(Properties.BLANK); commit = new Commit(builder.toString()); try { diffs = getPaths(repository, rev); } catch (IOException e) { e.printStackTrace(); } for (DiffEntry diff : diffs) { commit.addFile(diff.getNewPath()); } commits.add(commit); } } private List<DiffEntry> getPaths(Repository repository, RevCommit rev) throws MissingObjectException, IncorrectObjectTypeException, IOException { RevCommit parent = null; List<DiffEntry> diffs = null; RevWalk rw = new RevWalk(repository); DiffFormatter df = new DiffFormatter(DisabledOutputStream.INSTANCE); df.setRepository(repository); df.setDiffComparator(RawTextComparator.DEFAULT); df.setDetectRenames(true); if (rev.getParentCount() > 0 && rev.getParent(0) != null) { parent = rw.parseCommit(rev.getParent(0).getId()); diffs = df.scan(parent.getTree(), rev.getTree()); } else { diffs = df.scan(new EmptyTreeIterator(), new CanonicalTreeParser( null, rw.getObjectReader(), rev.getTree())); } return diffs; } public List<Commit> getCommits() { return commits; } }