]> source.dussan.org Git - jgit.git/commitdiff
blame: Do not update candidate regionList during output 10/25310/2
authorShawn Pearce <spearce@spearce.org>
Sun, 20 Apr 2014 02:59:21 +0000 (19:59 -0700)
committerShawn Pearce <spearce@spearce.org>
Mon, 21 Apr 2014 18:43:02 +0000 (11:43 -0700)
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

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

index 5b02ce6c925291a4eabf6ba9392ebc58a9108aed..d90d59824d240e560e8a1cf45210c5e9da5ac81e 100644 (file)
@@ -143,7 +143,8 @@ public class BlameGenerator {
        private int remaining;
 
        /** 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
@@ -466,19 +467,19 @@ public class BlameGenerator {
         */
        public boolean next() throws IOException {
                // If there is a source still pending, produce the next region.
-               if (currentSource != null) {
-                       Region r = currentSource.regionList;
-                       Region n = r.next;
+               if (outRegion != null) {
+                       Region r = outRegion;
                        remaining -= r.length;
-                       if (n != null) {
-                               currentSource.regionList = n;
+                       if (r.next != null) {
+                               outRegion = r.next;
                                return true;
                        }
 
-                       if (currentSource.queueNext != null)
-                               return result(currentSource.queueNext);
+                       if (outCandidate.queueNext != null)
+                               return result(outCandidate.queueNext);
 
-                       currentSource = null;
+                       outCandidate = null;
+                       outRegion = null;
                }
 
                // If there are no lines remaining, the entire result is done,
@@ -520,7 +521,8 @@ public class BlameGenerator {
        private boolean result(Candidate n) throws IOException {
                if (n.sourceCommit != null)
                        revPool.parseBody(n.sourceCommit);
-               currentSource = n;
+               outCandidate = n;
+               outRegion = n.regionList;
                return true;
        }
 
@@ -847,12 +849,12 @@ public class BlameGenerator {
         * @return current revision being blamed.
         */
        public RevCommit getSourceCommit() {
-               return currentSource.sourceCommit;
+               return outCandidate.sourceCommit;
        }
 
        /** @return current author being blamed. */
        public PersonIdent getSourceAuthor() {
-               return currentSource.getAuthor();
+               return outCandidate.getAuthor();
        }
 
        /** @return current committer being blamed. */
@@ -863,12 +865,12 @@ public class BlameGenerator {
 
        /** @return path of the file being blamed. */
        public String getSourcePath() {
-               return currentSource.sourcePath.getPath();
+               return outCandidate.sourcePath.getPath();
        }
 
        /** @return rename score if a rename occurred in {@link #getSourceCommit}. */
        public int getRenameScore() {
-               return currentSource.renameScore;
+               return outCandidate.renameScore;
        }
 
        /**
@@ -878,7 +880,7 @@ public class BlameGenerator {
         *         {@link #getSourcePath()}.
         */
        public int getSourceStart() {
-               return currentSource.regionList.sourceStart;
+               return outRegion.sourceStart;
        }
 
        /**
@@ -888,7 +890,7 @@ public class BlameGenerator {
         *         {@link #getSourcePath()}.
         */
        public int getSourceEnd() {
-               Region r = currentSource.regionList;
+               Region r = outRegion;
                return r.sourceStart + r.length;
        }
 
@@ -897,7 +899,7 @@ public class BlameGenerator {
         *         blamed for providing. Line numbers use 0 based indexing.
         */
        public int getResultStart() {
-               return currentSource.regionList.resultStart;
+               return outRegion.resultStart;
        }
 
        /**
@@ -908,7 +910,7 @@ public class BlameGenerator {
         *         than {@link #getResultStart()}.
         */
        public int getResultEnd() {
-               Region r = currentSource.regionList;
+               Region r = outRegion;
                return r.resultStart + r.length;
        }
 
@@ -919,7 +921,7 @@ public class BlameGenerator {
         *         {@code getSourceEnd() - getSourceStart()}.
         */
        public int getRegionLength() {
-               return currentSource.regionList.length;
+               return outRegion.length;
        }
 
        /**
@@ -930,7 +932,7 @@ public class BlameGenerator {
         *         applications will want the result contents for display to users.
         */
        public RawText getSourceContents() {
-               return currentSource.sourceText;
+               return outCandidate.sourceText;
        }
 
        /**
@@ -951,7 +953,8 @@ public class BlameGenerator {
        public void release() {
                revPool.release();
                queue = null;
-               currentSource = null;
+               outCandidate = null;
+               outRegion = null;
        }
 
        private boolean find(RevCommit commit, PathFilter path) throws IOException {