Browse Source

Merge changes Icb1d49e5,I8bcab447,I3fa19b86,I2cda031b,I8b2dbf63

* changes:
  blame: Reuse existing blameEntireRegionOnParent method
  blame: Remove unnecessary curly braces around single statement if
  blame: Allow candidate to manage its setup before output
  blame: Do not update candidate regionList during output
  blame: Only use computeRange if -L was requested
stable-3.4
Shawn Pearce 11 years ago committed by Gerrit Code Review @ Eclipse.org
parent
commit
616ebfc821
  1. 55
      org.eclipse.jgit/src/org/eclipse/jgit/blame/BlameGenerator.java
  2. 4
      org.eclipse.jgit/src/org/eclipse/jgit/blame/BlameResult.java
  3. 11
      org.eclipse.jgit/src/org/eclipse/jgit/blame/Candidate.java

55
org.eclipse.jgit/src/org/eclipse/jgit/blame/BlameGenerator.java

@ -143,7 +143,8 @@ public class BlameGenerator {
private int remaining; private int remaining;
/** Blame is currently assigned to this source. */ /** Blame is currently assigned to this source. */
private Candidate currentSource; private Candidate outCandidate;
private Region outRegion;
/** /**
* Create a blame generator for the repository and path (relative to * Create a blame generator for the repository and path (relative to
@ -466,19 +467,19 @@ public class BlameGenerator {
*/ */
public boolean next() throws IOException { public boolean next() throws IOException {
// If there is a source still pending, produce the next region. // If there is a source still pending, produce the next region.
if (currentSource != null) { if (outRegion != null) {
Region r = currentSource.regionList; Region r = outRegion;
Region n = r.next;
remaining -= r.length; remaining -= r.length;
if (n != null) { if (r.next != null) {
currentSource.regionList = n; outRegion = r.next;
return true; return true;
} }
if (currentSource.queueNext != null) if (outCandidate.queueNext != null)
return result(currentSource.queueNext); return result(outCandidate.queueNext);
currentSource = null; outCandidate = null;
outRegion = null;
} }
// If there are no lines remaining, the entire result is done, // If there are no lines remaining, the entire result is done,
@ -518,9 +519,9 @@ public class BlameGenerator {
} }
private boolean result(Candidate n) throws IOException { private boolean result(Candidate n) throws IOException {
if (n.sourceCommit != null) n.beginResult(revPool);
revPool.parseBody(n.sourceCommit); outCandidate = n;
currentSource = n; outRegion = n.regionList;
return true; return true;
} }
@ -688,9 +689,8 @@ public class BlameGenerator {
revPool.parseHeaders(parent); revPool.parseHeaders(parent);
if (!find(parent, n.sourcePath)) if (!find(parent, n.sourcePath))
continue; continue;
if (!(n instanceof ReverseCandidate) && idBuf.equals(n.sourceBlob)) { if (!(n instanceof ReverseCandidate) && idBuf.equals(n.sourceBlob))
return blameEntireRegionOnParent(n, parent); return blameEntireRegionOnParent(n, parent);
}
if (ids == null) if (ids == null)
ids = new ObjectId[pCnt]; ids = new ObjectId[pCnt];
ids[pIdx] = idBuf.toObjectId(); ids[pIdx] = idBuf.toObjectId();
@ -720,10 +720,8 @@ public class BlameGenerator {
// have an exact content match. For performance reasons // have an exact content match. For performance reasons
// we choose to follow the one parent over trying to do // we choose to follow the one parent over trying to do
// possibly both parents. // possibly both parents.
n.sourceCommit = parent;
n.setSourcePath(PathFilter.create(r.getOldPath())); n.setSourcePath(PathFilter.create(r.getOldPath()));
push(n); return blameEntireRegionOnParent(n, parent);
return false;
} }
renames[pIdx] = r; renames[pIdx] = r;
@ -847,12 +845,12 @@ public class BlameGenerator {
* @return current revision being blamed. * @return current revision being blamed.
*/ */
public RevCommit getSourceCommit() { public RevCommit getSourceCommit() {
return currentSource.sourceCommit; return outCandidate.sourceCommit;
} }
/** @return current author being blamed. */ /** @return current author being blamed. */
public PersonIdent getSourceAuthor() { public PersonIdent getSourceAuthor() {
return currentSource.getAuthor(); return outCandidate.getAuthor();
} }
/** @return current committer being blamed. */ /** @return current committer being blamed. */
@ -863,12 +861,12 @@ public class BlameGenerator {
/** @return path of the file being blamed. */ /** @return path of the file being blamed. */
public String getSourcePath() { public String getSourcePath() {
return currentSource.sourcePath.getPath(); return outCandidate.sourcePath.getPath();
} }
/** @return rename score if a rename occurred in {@link #getSourceCommit}. */ /** @return rename score if a rename occurred in {@link #getSourceCommit}. */
public int getRenameScore() { public int getRenameScore() {
return currentSource.renameScore; return outCandidate.renameScore;
} }
/** /**
@ -878,7 +876,7 @@ public class BlameGenerator {
* {@link #getSourcePath()}. * {@link #getSourcePath()}.
*/ */
public int getSourceStart() { public int getSourceStart() {
return currentSource.regionList.sourceStart; return outRegion.sourceStart;
} }
/** /**
@ -888,7 +886,7 @@ public class BlameGenerator {
* {@link #getSourcePath()}. * {@link #getSourcePath()}.
*/ */
public int getSourceEnd() { public int getSourceEnd() {
Region r = currentSource.regionList; Region r = outRegion;
return r.sourceStart + r.length; return r.sourceStart + r.length;
} }
@ -897,7 +895,7 @@ public class BlameGenerator {
* blamed for providing. Line numbers use 0 based indexing. * blamed for providing. Line numbers use 0 based indexing.
*/ */
public int getResultStart() { public int getResultStart() {
return currentSource.regionList.resultStart; return outRegion.resultStart;
} }
/** /**
@ -908,7 +906,7 @@ public class BlameGenerator {
* than {@link #getResultStart()}. * than {@link #getResultStart()}.
*/ */
public int getResultEnd() { public int getResultEnd() {
Region r = currentSource.regionList; Region r = outRegion;
return r.resultStart + r.length; return r.resultStart + r.length;
} }
@ -919,7 +917,7 @@ public class BlameGenerator {
* {@code getSourceEnd() - getSourceStart()}. * {@code getSourceEnd() - getSourceStart()}.
*/ */
public int getRegionLength() { public int getRegionLength() {
return currentSource.regionList.length; return outRegion.length;
} }
/** /**
@ -930,7 +928,7 @@ public class BlameGenerator {
* applications will want the result contents for display to users. * applications will want the result contents for display to users.
*/ */
public RawText getSourceContents() { public RawText getSourceContents() {
return currentSource.sourceText; return outCandidate.sourceText;
} }
/** /**
@ -951,7 +949,8 @@ public class BlameGenerator {
public void release() { public void release() {
revPool.release(); revPool.release();
queue = null; queue = null;
currentSource = null; outCandidate = null;
outRegion = null;
} }
private boolean find(RevCommit commit, PathFilter path) throws IOException { private boolean find(RevCommit commit, PathFilter path) throws IOException {

4
org.eclipse.jgit/src/org/eclipse/jgit/blame/BlameResult.java

@ -290,6 +290,10 @@ public class BlameResult {
BlameGenerator gen = generator; BlameGenerator gen = generator;
if (gen == null) if (gen == null)
return; return;
if (start == 0 && end == resultContents.size()) {
computeAll();
return;
}
while (start < end) { while (start < end) {
if (hasSourceData(start, end)) if (hasSourceData(start, end))

11
org.eclipse.jgit/src/org/eclipse/jgit/blame/Candidate.java

@ -49,6 +49,7 @@ import org.eclipse.jgit.blame.ReverseWalk.ReverseCommit;
import org.eclipse.jgit.diff.Edit; import org.eclipse.jgit.diff.Edit;
import org.eclipse.jgit.diff.EditList; import org.eclipse.jgit.diff.EditList;
import org.eclipse.jgit.diff.RawText; import org.eclipse.jgit.diff.RawText;
import org.eclipse.jgit.errors.MissingObjectException;
import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ObjectLoader; import org.eclipse.jgit.lib.ObjectLoader;
@ -56,6 +57,7 @@ import org.eclipse.jgit.lib.ObjectReader;
import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevFlag; import org.eclipse.jgit.revwalk.RevFlag;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.treewalk.filter.PathFilter; import org.eclipse.jgit.treewalk.filter.PathFilter;
/** /**
@ -114,6 +116,10 @@ class Candidate {
recursivePath = path.shouldBeRecursive(); recursivePath = path.shouldBeRecursive();
} }
void beginResult(RevWalk rw) throws MissingObjectException, IOException {
rw.parseBody(sourceCommit);
}
int getParentCount() { int getParentCount() {
return sourceCommit.getParentCount(); return sourceCommit.getParentCount();
} }
@ -405,6 +411,11 @@ class Candidate {
description = name; description = name;
} }
@Override
void beginResult(RevWalk rw) {
// Blob candidates have nothing to prepare.
}
@Override @Override
int getParentCount() { int getParentCount() {
return parent != null ? 1 : 0; return parent != null ? 1 : 0;

Loading…
Cancel
Save