List of usage examples for org.eclipse.jgit.diff Edit getType
public final Type getType()
From source file:com.GitAnalytics.CommitInfo.java
private CommitInfo(DiffFormatter df, RevWalk rw, RevCommit commit, List<String> tags) throws Exception { System.out.print("Processing Commit: " + I + "\r"); I++;//from www . jav a2 s . co m mCommit = commit; mTags = tags; mAuthor = mCommit.getAuthorIdent(); mLinesChanged = new int[3]; RevTree parent = null; try { parent = rw.parseCommit(commit.getParent(0).getId()).getTree(); } catch (Exception e) { } //int filesChanged = diffs.size(); mLinesChanged[0] = mLinesChanged[1] = mLinesChanged[2] = 0; for (DiffEntry diff : df.scan(parent, commit.getTree())) { for (Edit edit : df.toFileHeader(diff).toEditList()) { int del = edit.getEndA() - edit.getBeginA(); int add = edit.getEndB() - edit.getBeginB(); if (edit.getType() == Type.REPLACE) { mLinesChanged[1] += Math.abs(add - del); } mLinesChanged[2] += add; mLinesChanged[0] += del; } } }
From source file:com.github.gitreport.ReleaseReport.java
License:Open Source License
/** * Generate report for repository/*from ww w. j a v a 2s .c om*/ * * @param repository * @param start * @param end * @throws IOException */ public void run(final Repository repository, final String start, final String end) throws IOException { this.repository = repository; this.start = CommitUtils.getCommit(repository, start); LastCommitFilter last = null; if (end != null) { this.end = CommitUtils.getCommit(repository, end); } else { last = new LastCommitFilter(); } CommitFinder finder = new CommitFinder(repository); AuthorSetFilter authorsFilter = new AuthorSetFilter(); CommitterSetFilter committersFilter = new CommitterSetFilter(); CommitCountFilter countFilter = new CommitCountFilter(); AuthorHistogramFilter authorHistogramFilter = new AuthorHistogramFilter(); CommitterHistogramFilter committerHistogramFilter = new CommitterHistogramFilter(); CommitLineImpactFilter lineImpactFilter = new CommitLineImpactFilter(10); CommitFileImpactFilter fileImpactFilter = new CommitFileImpactFilter(10); AllCommitFilter matcher = new AllCommitFilter(); matcher.add(authorsFilter, committersFilter); matcher.add(authorHistogramFilter, committerHistogramFilter); matcher.add(new AllDiffFilter(true, lineImpactFilter, fileImpactFilter)); matcher.add(countFilter); if (last != null) { matcher.add(last); } finder.setMatcher(new AllCommitFilter(new AndCommitFilter(NO_MERGES, matcher))); if (end != null) { finder.findBetween(start, end); } else { finder.findFrom(start); } if (last != null) { this.end = last.getLast(); } mostFiles = fileImpactFilter.getCommits(); mostLines = lineImpactFilter.getCommits(); authorHistogram = authorHistogramFilter.getHistogram(); committerHistogram = committerHistogramFilter.getHistogram(); namesToEmails.putAll(RepositoryUtils.mapNamesToEmails(authorsFilter.getPersons())); for (PersonIdent person : authorsFilter.getPersons()) { authors.add(person.getName()); } namesToEmails.putAll(RepositoryUtils.mapNamesToEmails(committersFilter.getPersons())); for (PersonIdent person : committersFilter.getPersons()) { committers.add(person.getName()); } commits = countFilter.getCount(); CommitDiffEditFilter releaseFilter = new CommitDiffEditFilter(true) { protected TreeWalk createTreeWalk(RevWalk walker, RevCommit commit) { TreeWalk walk = TreeUtils.diffWithCommits(repository, end, commit.name()); walk.setRecursive(true); return walk; } protected boolean include(RevCommit commit, DiffEntry diff, Collection<Edit> edits) { switch (diff.getChangeType()) { case ADD: added.add(getName(diff.getNewPath())); break; case DELETE: deleted.add(getName(diff.getOldPath())); break; case MODIFY: modified.add(getName(diff.getNewPath())); break; case RENAME: renamed.add(getName(diff.getNewPath())); break; } return super.include(commit, diff, edits); } protected boolean include(RevCommit commit, DiffEntry diff, Edit edit) { switch (edit.getType()) { case DELETE: linesDeleted += edit.getLengthA(); break; case INSERT: linesAdded += edit.getLengthB(); break; case REPLACE: linesEdited += edit.getLengthB(); break; } return true; } }; releaseFilter.setRepository(repository); RevWalk walk = new RevWalk(repository); try { releaseFilter.include(walk, this.start); } finally { walk.release(); } AllCommitFilter firstTimerFilter = new AllCommitFilter(); Map<String, CommitCountFilter> otherCommits = new HashMap<String, CommitCountFilter>(); for (String author : authors) { CommitCountFilter filter = new CommitCountFilter(); otherCommits.put(author, filter); firstTimerFilter.add(new AndCommitFilter(new AuthorFilter(author, null), filter)); } finder.setMatcher(firstTimerFilter).findFrom(end); for (String author : authors) { CommitCountFilter filter = otherCommits.get(author); if (filter.getCount() == 0) { firstTimers.add(author); } } }
From source file:com.github.kevinsawicki.git.reports.ReleaseReport.java
License:Open Source License
/** * Generate report for repository//from w w w .ja va 2s .co m * * @param repository * @param start * @param end * @throws IOException */ public void run(final Repository repository, final String start, final String end) throws IOException { this.repository = repository; this.start = CommitUtils.getCommit(repository, start); LastCommitFilter last = null; if (end != null) this.end = CommitUtils.getCommit(repository, end); else last = new LastCommitFilter(); CommitFinder finder = new CommitFinder(repository); AuthorSetFilter authorsFilter = new AuthorSetFilter(); CommitterSetFilter committersFilter = new CommitterSetFilter(); CommitCountFilter countFilter = new CommitCountFilter(); AuthorHistogramFilter authorHistogramFilter = new AuthorHistogramFilter(); CommitterHistogramFilter committerHistogramFilter = new CommitterHistogramFilter(); CommitLineImpactFilter lineImpactFilter = new CommitLineImpactFilter(10); CommitFileImpactFilter fileImpactFilter = new CommitFileImpactFilter(10); AllCommitFilter matcher = new AllCommitFilter(); matcher.add(authorsFilter, committersFilter); matcher.add(authorHistogramFilter, committerHistogramFilter); matcher.add(new AllDiffFilter(true, lineImpactFilter, fileImpactFilter)); matcher.add(countFilter); if (last != null) matcher.add(last); finder.setMatcher(new AllCommitFilter(new AndCommitFilter(NO_MERGES, matcher))); if (end != null) finder.findBetween(start, end); else finder.findFrom(start); if (last != null) this.end = last.getLast(); mostFiles = fileImpactFilter.getCommits(); mostLines = lineImpactFilter.getCommits(); authorHistogram = authorHistogramFilter.getHistogram(); committerHistogram = committerHistogramFilter.getHistogram(); namesToEmails.putAll(RepositoryUtils.mapNamesToEmails(authorsFilter.getPersons())); for (PersonIdent person : authorsFilter.getPersons()) authors.add(person.getName()); namesToEmails.putAll(RepositoryUtils.mapNamesToEmails(committersFilter.getPersons())); for (PersonIdent person : committersFilter.getPersons()) committers.add(person.getName()); commits = countFilter.getCount(); CommitDiffEditFilter releaseFilter = new CommitDiffEditFilter(true) { protected TreeWalk createTreeWalk(RevWalk walker, RevCommit commit) { TreeWalk walk = TreeUtils.diffWithCommits(repository, end, commit.name()); walk.setRecursive(true); return walk; } protected boolean include(RevCommit commit, DiffEntry diff, Collection<Edit> edits) { switch (diff.getChangeType()) { case ADD: added.add(getName(diff.getNewPath())); break; case DELETE: deleted.add(getName(diff.getOldPath())); break; case MODIFY: modified.add(getName(diff.getNewPath())); break; case RENAME: renamed.add(getName(diff.getNewPath())); break; } return super.include(commit, diff, edits); } protected boolean include(RevCommit commit, DiffEntry diff, Edit edit) { switch (edit.getType()) { case DELETE: linesDeleted += edit.getLengthA(); break; case INSERT: linesAdded += edit.getLengthB(); break; case REPLACE: linesEdited += edit.getLengthB(); break; } return true; } }; releaseFilter.setRepository(repository); RevWalk walk = new RevWalk(repository); try { releaseFilter.include(walk, this.start); } finally { walk.release(); } AllCommitFilter firstTimerFilter = new AllCommitFilter(); Map<String, CommitCountFilter> otherCommits = new HashMap<String, CommitCountFilter>(); for (String author : authors) { CommitCountFilter filter = new CommitCountFilter(); otherCommits.put(author, filter); firstTimerFilter.add(new AndCommitFilter(new AuthorFilter(author, null), filter)); } finder.setMatcher(firstTimerFilter).findFrom(end); for (String author : authors) { CommitCountFilter filter = otherCommits.get(author); if (filter.getCount() == 0) firstTimers.add(author); } }
From source file:com.google.gerrit.client.patches.AbstractPatchContentTable.java
License:Apache License
private boolean hasEdits(PatchScript script) { for (Edit e : script.getEdits()) { if (e.getType() != Edit.Type.EMPTY) { return true; }/*from w w w . j av a 2 s . co m*/ } return false; }
From source file:com.google.gerrit.server.change.GetDiff.java
License:Apache License
@Override public Response<DiffInfo> apply(FileResource resource) throws ResourceConflictException, ResourceNotFoundException, OrmException, AuthException, InvalidChangeOperationException, IOException { PatchSet basePatchSet = null;/*from ww w . j av a 2s .c o m*/ if (base != null) { RevisionResource baseResource = revisions.parse(resource.getRevision().getChangeResource(), IdString.fromDecoded(base)); basePatchSet = baseResource.getPatchSet(); } AccountDiffPreference prefs = new AccountDiffPreference(new Account.Id(0)); prefs.setIgnoreWhitespace(ignoreWhitespace.whitespace); prefs.setContext(context); prefs.setIntralineDifference(intraline); try { PatchScriptFactory psf = patchScriptFactoryFactory.create(resource.getRevision().getControl(), resource.getPatchKey().getFileName(), basePatchSet != null ? basePatchSet.getId() : null, resource.getPatchKey().getParentKey(), prefs); psf.setLoadHistory(false); psf.setLoadComments(context != AccountDiffPreference.WHOLE_FILE_CONTEXT); PatchScript ps = psf.call(); Content content = new Content(ps); for (Edit edit : ps.getEdits()) { if (edit.getType() == Edit.Type.EMPTY) { continue; } content.addCommon(edit.getBeginA()); checkState(content.nextA == edit.getBeginA(), "nextA = %s; want %s", content.nextA, edit.getBeginA()); checkState(content.nextB == edit.getBeginB(), "nextB = %s; want %s", content.nextB, edit.getBeginB()); switch (edit.getType()) { case DELETE: case INSERT: case REPLACE: List<Edit> internalEdit = edit instanceof ReplaceEdit ? ((ReplaceEdit) edit).getInternalEdits() : null; content.addDiff(edit.getEndA(), edit.getEndB(), internalEdit); break; case EMPTY: default: throw new IllegalStateException(); } } content.addCommon(ps.getA().size()); ProjectState state = projectCache.get(resource.getRevision().getChange().getProject()); DiffInfo result = new DiffInfo(); // TODO referring to the parent commit by refs/changes/12/60012/1^1 // will likely not work for inline edits String revA = basePatchSet != null ? basePatchSet.getRefName() : resource.getRevision().getPatchSet().getRefName() + "^1"; String revB = resource.getRevision().getEdit().isPresent() ? resource.getRevision().getEdit().get().getRefName() : resource.getRevision().getPatchSet().getRefName(); FluentIterable<DiffWebLinkInfo> links = webLinks.getDiffLinks(state.getProject().getName(), resource.getPatchKey().getParentKey().getParentKey().get(), basePatchSet != null ? basePatchSet.getId().get() : null, revA, MoreObjects.firstNonNull(ps.getOldName(), ps.getNewName()), resource.getPatchKey().getParentKey().get(), revB, ps.getNewName()); result.webLinks = links.isEmpty() ? null : links.toList(); if (!webLinksOnly) { if (ps.isBinary()) { result.binary = true; } if (ps.getDisplayMethodA() != DisplayMethod.NONE) { result.metaA = new FileMeta(); result.metaA.name = MoreObjects.firstNonNull(ps.getOldName(), ps.getNewName()); result.metaA.contentType = FileContentUtil.resolveContentType(state, result.metaA.name, ps.getFileModeA(), ps.getMimeTypeA()); result.metaA.lines = ps.getA().size(); result.metaA.webLinks = getFileWebLinks(state.getProject(), revA, result.metaA.name); result.metaA.commitId = content.commitIdA; } if (ps.getDisplayMethodB() != DisplayMethod.NONE) { result.metaB = new FileMeta(); result.metaB.name = ps.getNewName(); result.metaB.contentType = FileContentUtil.resolveContentType(state, result.metaB.name, ps.getFileModeB(), ps.getMimeTypeB()); result.metaB.lines = ps.getB().size(); result.metaB.webLinks = getFileWebLinks(state.getProject(), revB, result.metaB.name); result.metaB.commitId = content.commitIdB; } if (intraline) { if (ps.hasIntralineTimeout()) { result.intralineStatus = IntraLineStatus.TIMEOUT; } else if (ps.hasIntralineFailure()) { result.intralineStatus = IntraLineStatus.FAILURE; } else { result.intralineStatus = IntraLineStatus.OK; } } result.changeType = CHANGE_TYPE.get(ps.getChangeType()); if (result.changeType == null) { throw new IllegalStateException("unknown change type: " + ps.getChangeType()); } if (ps.getPatchHeader().size() > 0) { result.diffHeader = ps.getPatchHeader(); } result.content = content.lines; } Response<DiffInfo> r = Response.ok(result); if (resource.isCacheable()) { r.caching(CacheControl.PRIVATE(7, TimeUnit.DAYS)); } return r; } catch (NoSuchChangeException e) { throw new ResourceNotFoundException(e.getMessage()); } catch (LargeObjectException e) { throw new ResourceConflictException(e.getMessage()); } }
From source file:com.google.gerrit.server.patch.IntraLineLoader.java
License:Apache License
static IntraLineDiff compute(Text aText, Text bText, List<Edit> edits) throws Exception { combineLineEdits(edits, aText, bText); for (int i = 0; i < edits.size(); i++) { Edit e = edits.get(i); if (e.getType() == Edit.Type.REPLACE) { CharText a = new CharText(aText, e.getBeginA(), e.getEndA()); CharText b = new CharText(bText, e.getBeginB(), e.getEndB()); CharTextComparator cmp = new CharTextComparator(); List<Edit> wordEdits = MyersDiff.INSTANCE.diff(cmp, a, b); // Combine edits that are really close together. If they are // just a few characters apart we tend to get better results // by joining them together and taking the whole span. ////from w w w .j av a 2 s .co m for (int j = 0; j < wordEdits.size() - 1;) { Edit c = wordEdits.get(j); Edit n = wordEdits.get(j + 1); if (n.getBeginA() - c.getEndA() <= 5 || n.getBeginB() - c.getEndB() <= 5) { int ab = c.getBeginA(); int ae = n.getEndA(); int bb = c.getBeginB(); int be = n.getEndB(); if (canCoalesce(a, c.getEndA(), n.getBeginA()) && canCoalesce(b, c.getEndB(), n.getBeginB())) { wordEdits.set(j, new Edit(ab, ae, bb, be)); wordEdits.remove(j + 1); continue; } } j++; } // Apply some simple rules to fix up some of the edits. Our // logic above, along with our per-character difference tends // to produce some crazy stuff. // for (int j = 0; j < wordEdits.size(); j++) { Edit c = wordEdits.get(j); int ab = c.getBeginA(); int ae = c.getEndA(); int bb = c.getBeginB(); int be = c.getEndB(); // Sometimes the diff generator produces an INSERT or DELETE // right up against a REPLACE, but we only find this after // we've also played some shifting games on the prior edit. // If that happened to us, coalesce them together so we can // correct this mess for the user. If we don't we wind up // with silly stuff like "es" -> "es = Addresses". // if (1 < j) { Edit p = wordEdits.get(j - 1); if (p.getEndA() == ab || p.getEndB() == bb) { if (p.getEndA() == ab && p.getBeginA() < p.getEndA()) { ab = p.getBeginA(); } if (p.getEndB() == bb && p.getBeginB() < p.getEndB()) { bb = p.getBeginB(); } wordEdits.remove(--j); } } // We sometimes collapsed an edit together in a strange way, // such that the edges of each text is identical. Fix by // by dropping out that incorrectly replaced region. // while (ab < ae && bb < be && cmp.equals(a, ab, b, bb)) { ab++; bb++; } while (ab < ae && bb < be && cmp.equals(a, ae - 1, b, be - 1)) { ae--; be--; } // The leading part of an edit and its trailing part in the same // text might be identical. Slide down that edit and use the tail // rather than the leading bit. If however the edit is only on a // whitespace block try to shift it to the left margin, assuming // that it is an indentation change. // boolean aShift = true; if (ab < ae && isOnlyWhitespace(a, ab, ae)) { int lf = findLF(wordEdits, j, a, ab); if (lf < ab && a.charAt(lf) == '\n') { int nb = lf + 1; int p = 0; while (p < ae - ab) { if (cmp.equals(a, ab + p, a, ab + p)) { p++; } else { break; } } if (p == ae - ab) { ab = nb; ae = nb + p; aShift = false; } } } if (aShift) { while (0 < ab && ab < ae && a.charAt(ab - 1) != '\n' && cmp.equals(a, ab - 1, a, ae - 1)) { ab--; ae--; } if (!a.isLineStart(ab) || !a.contains(ab, ae, '\n')) { while (ab < ae && ae < a.size() && cmp.equals(a, ab, a, ae)) { ab++; ae++; if (a.charAt(ae - 1) == '\n') { break; } } } } boolean bShift = true; if (bb < be && isOnlyWhitespace(b, bb, be)) { int lf = findLF(wordEdits, j, b, bb); if (lf < bb && b.charAt(lf) == '\n') { int nb = lf + 1; int p = 0; while (p < be - bb) { if (cmp.equals(b, bb + p, b, bb + p)) { p++; } else { break; } } if (p == be - bb) { bb = nb; be = nb + p; bShift = false; } } } if (bShift) { while (0 < bb && bb < be && b.charAt(bb - 1) != '\n' && cmp.equals(b, bb - 1, b, be - 1)) { bb--; be--; } if (!b.isLineStart(bb) || !b.contains(bb, be, '\n')) { while (bb < be && be < b.size() && cmp.equals(b, bb, b, be)) { bb++; be++; if (b.charAt(be - 1) == '\n') { break; } } } } // If most of a line was modified except the LF was common, make // the LF part of the modification region. This is easier to read. // if (ab < ae // && (ab == 0 || a.charAt(ab - 1) == '\n') // && ae < a.size() && a.charAt(ae - 1) != '\n' && a.charAt(ae) == '\n') { ae++; } if (bb < be // && (bb == 0 || b.charAt(bb - 1) == '\n') // && be < b.size() && b.charAt(be - 1) != '\n' && b.charAt(be) == '\n') { be++; } wordEdits.set(j, new Edit(ab, ae, bb, be)); } edits.set(i, new ReplaceEdit(e, wordEdits)); } } return new IntraLineDiff(edits); }
From source file:com.google.gitiles.DiffServletTest.java
License:Apache License
@Test public void diffFileNoParentsText() throws Exception { String contents = "foo\ncontents\n"; RevCommit c = repo.update("master", repo.commit().add("foo", contents)); FakeHttpServletRequest req = FakeHttpServletRequest.newRequest(); req.setPathInfo("/test/+diff/" + c.name() + "^!/foo"); req.setQueryString("format=TEXT"); FakeHttpServletResponse res = new FakeHttpServletResponse(); servlet.service(req, res);//from w w w . j a v a 2 s . c o m Patch p = parsePatch(res.getActualBody()); FileHeader f = getOnlyElement(p.getFiles()); assertEquals(ChangeType.ADD, f.getChangeType()); assertEquals(DiffEntry.DEV_NULL, f.getPath(Side.OLD)); assertEquals("foo", f.getPath(Side.NEW)); RawText rt = new RawText(contents.getBytes(UTF_8)); Edit e = getOnlyElement(getOnlyElement(f.getHunks()).toEditList()); assertEquals(Type.INSERT, e.getType()); assertEquals(contents, rt.getString(e.getBeginB(), e.getEndB(), false)); }
From source file:com.google.gitiles.DiffServletTest.java
License:Apache License
@Test public void diffFileOneParentText() throws Exception { String contents1 = "foo\n"; String contents2 = "foo\ncontents\n"; RevCommit c1 = repo.update("master", repo.commit().add("foo", contents1)); RevCommit c2 = repo.update("master", repo.commit().parent(c1).add("foo", contents2)); FakeHttpServletRequest req = FakeHttpServletRequest.newRequest(); req.setPathInfo("/test/+diff/" + c2.name() + "^!/foo"); req.setQueryString("format=TEXT"); FakeHttpServletResponse res = new FakeHttpServletResponse(); servlet.service(req, res);/*from ww w. java 2 s. co m*/ Patch p = parsePatch(res.getActualBody()); FileHeader f = getOnlyElement(p.getFiles()); assertEquals(ChangeType.MODIFY, f.getChangeType()); assertEquals("foo", f.getPath(Side.OLD)); assertEquals("foo", f.getPath(Side.NEW)); RawText rt2 = new RawText(contents2.getBytes(UTF_8)); Edit e = getOnlyElement(getOnlyElement(f.getHunks()).toEditList()); assertEquals(Type.INSERT, e.getType()); assertEquals("contents\n", rt2.getString(e.getBeginB(), e.getEndB(), false)); }
From source file:com.wirelust.sonar.plugins.bitbucket.PullRequestFacade.java
License:Open Source License
private void loadHeaderHunks(List<Integer> patchLocationMapping, FileHeader fileHeader) { for (HunkHeader hunk : fileHeader.getHunks()) { for (Edit edit : hunk.toEditList()) { if (!edit.getType().equals(Edit.Type.DELETE)) { for (int line = edit.getBeginB(); line < edit.getEndB(); line++) { patchLocationMapping.add(line + 1); }// w w w . ja v a 2 s. c o m } } } }
From source file:jbenchmarker.trace.git.model.Edition.java
License:Open Source License
public Edition(Edit edit, RawText a, RawText b) { this.beginA = edit.getBeginA(); this.beginB = edit.getBeginB(); this.type = typeof(edit.getType()); this.ca = new ArrayList<String>(); this.cb = new ArrayList<String>(); for (int i = beginA; i < edit.getEndA(); ++i) { ca.add(a.getString(i) + '\n'); }/*from w w w . j av a 2 s.c o m*/ for (int i = beginB; i < edit.getEndB(); ++i) { cb.add(b.getString(i) + '\n'); } }