blame: Do not update candidate regionList during output

Instead of updating the candidate's regionList field to iterate
through the linked list of regions, use a special purpose field
in the BlameGenerator. This allows the candidate to be unmodified.

Change-Id: I2cda031b59220ab603ef82050e741ecbbaa1953f
This commit is contained in:
Shawn Pearce 2014-04-19 19:59:21 -07:00
parent 4db7e8f94d
commit 6afae79901
1 changed files with 24 additions and 21 deletions

View File

@ -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 BlameResult computeBlameResult() throws IOException {
*/ */
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,
@ -520,7 +521,8 @@ private boolean done() {
private boolean result(Candidate n) throws IOException { private boolean result(Candidate n) throws IOException {
if (n.sourceCommit != null) if (n.sourceCommit != null)
revPool.parseBody(n.sourceCommit); revPool.parseBody(n.sourceCommit);
currentSource = n; outCandidate = n;
outRegion = n.regionList;
return true; return true;
} }
@ -847,12 +849,12 @@ private boolean processMerge(Candidate n) throws IOException {
* @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 +865,12 @@ public PersonIdent getSourceCommitter() {
/** @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 +880,7 @@ public int getRenameScore() {
* {@link #getSourcePath()}. * {@link #getSourcePath()}.
*/ */
public int getSourceStart() { public int getSourceStart() {
return currentSource.regionList.sourceStart; return outRegion.sourceStart;
} }
/** /**
@ -888,7 +890,7 @@ public int getSourceStart() {
* {@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 +899,7 @@ public int getSourceEnd() {
* 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 +910,7 @@ public int getResultStart() {
* 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 +921,7 @@ public int getResultEnd() {
* {@code getSourceEnd() - getSourceStart()}. * {@code getSourceEnd() - getSourceStart()}.
*/ */
public int getRegionLength() { public int getRegionLength() {
return currentSource.regionList.length; return outRegion.length;
} }
/** /**
@ -930,7 +932,7 @@ public int getRegionLength() {
* 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 +953,8 @@ public RawText getResultContents() throws IOException {
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 {