diff options
author | Dave Borowitz <dborowitz@google.com> | 2016-08-03 16:19:05 -0400 |
---|---|---|
committer | Dave Borowitz <dborowitz@google.com> | 2016-08-03 16:24:37 -0400 |
commit | d6fe52e914ee652d3e2e406f662e5bf1b694e1ac (patch) | |
tree | 60c2e0973c08ec4c69131ccfb3fd7f7837451804 /org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffFormatter.java | |
parent | 23b1405484eb8dea10d1a6870b28e865d04d9f63 (diff) | |
download | jgit-d6fe52e914ee652d3e2e406f662e5bf1b694e1ac.tar.gz jgit-d6fe52e914ee652d3e2e406f662e5bf1b694e1ac.zip |
DiffFormatter: Support setting a reader without a repo
Change-Id: I575cdb9c0a9a341b79ef5e3c7a35e68cde142540
Diffstat (limited to 'org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffFormatter.java')
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffFormatter.java | 63 |
1 files changed, 40 insertions, 23 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffFormatter.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffFormatter.java index fc701f3a54..819442cbea 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffFormatter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffFormatter.java @@ -73,6 +73,7 @@ import org.eclipse.jgit.errors.MissingObjectException; import org.eclipse.jgit.internal.JGitText; import org.eclipse.jgit.lib.AbbreviatedObjectId; import org.eclipse.jgit.lib.AnyObjectId; +import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.ConfigConstants; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.FileMode; @@ -117,10 +118,10 @@ public class DiffFormatter implements AutoCloseable { private final OutputStream out; - private Repository db; - private ObjectReader reader; + private boolean closeReader; + private DiffConfig diffCfg; private int context = 3; @@ -172,28 +173,42 @@ public class DiffFormatter implements AutoCloseable { * source repository holding referenced objects. */ public void setRepository(Repository repository) { - if (reader != null) - reader.close(); + setReader(repository.newObjectReader(), repository.getConfig(), true); + } - db = repository; - reader = db.newObjectReader(); - diffCfg = db.getConfig().get(DiffConfig.KEY); + /** + * Set the repository the formatter can load object contents from. + * + * @param reader + * source reader holding referenced objects. Caller is responsible + * for closing the reader. + * @param cfg + * config specifying diff algorithm and rename detection options. + * @since 4.5 + */ + public void setReader(ObjectReader reader, Config cfg) { + setReader(reader, cfg, false); + } + + private void setReader(ObjectReader reader, Config cfg, boolean closeReader) { + close(); + this.closeReader = closeReader; + this.reader = reader; + this.diffCfg = cfg.get(DiffConfig.KEY); ContentSource cs = ContentSource.create(reader); source = new ContentSource.Pair(cs, cs); - DiffConfig dc = db.getConfig().get(DiffConfig.KEY); - if (dc.isNoPrefix()) { + if (diffCfg.isNoPrefix()) { setOldPrefix(""); //$NON-NLS-1$ setNewPrefix(""); //$NON-NLS-1$ } - setDetectRenames(dc.isRenameDetectionEnabled()); + setDetectRenames(diffCfg.isRenameDetectionEnabled()); - diffAlgorithm = DiffAlgorithm.getAlgorithm(db.getConfig().getEnum( + diffAlgorithm = DiffAlgorithm.getAlgorithm(cfg.getEnum( ConfigConstants.CONFIG_DIFF_SECTION, null, ConfigConstants.CONFIG_KEY_ALGORITHM, SupportedAlgorithm.HISTOGRAM)); - } /** @@ -330,8 +345,8 @@ public class DiffFormatter implements AutoCloseable { */ public void setDetectRenames(boolean on) { if (on && renameDetector == null) { - assertHaveRepository(); - renameDetector = new RenameDetector(db); + assertHaveReader(); + renameDetector = new RenameDetector(reader, diffCfg); } else if (!on) renameDetector = null; } @@ -387,8 +402,9 @@ public class DiffFormatter implements AutoCloseable { */ @Override public void close() { - if (reader != null) + if (reader != null && closeReader) { reader.close(); + } } /** @@ -412,7 +428,7 @@ public class DiffFormatter implements AutoCloseable { */ public List<DiffEntry> scan(AnyObjectId a, AnyObjectId b) throws IOException { - assertHaveRepository(); + assertHaveReader(); try (RevWalk rw = new RevWalk(reader)) { RevTree aTree = a != null ? rw.parseTree(a) : null; @@ -441,7 +457,7 @@ public class DiffFormatter implements AutoCloseable { * trees cannot be read or file contents cannot be read. */ public List<DiffEntry> scan(RevTree a, RevTree b) throws IOException { - assertHaveRepository(); + assertHaveReader(); AbstractTreeIterator aIterator = makeIteratorFromTreeOrNull(a); AbstractTreeIterator bIterator = makeIteratorFromTreeOrNull(b); @@ -476,7 +492,7 @@ public class DiffFormatter implements AutoCloseable { */ public List<DiffEntry> scan(AbstractTreeIterator a, AbstractTreeIterator b) throws IOException { - assertHaveRepository(); + assertHaveReader(); TreeWalk walk = new TreeWalk(reader); walk.addTree(a); @@ -674,7 +690,7 @@ public class DiffFormatter implements AutoCloseable { } private String format(AbbreviatedObjectId id) { - if (id.isComplete() && db != null) { + if (id.isComplete() && reader != null) { try { id = reader.abbreviate(id.toObjectId(), abbreviationLength); } catch (IOException cannotAbbreviate) { @@ -940,7 +956,7 @@ public class DiffFormatter implements AutoCloseable { type = PatchType.UNIFIED; } else { - assertHaveRepository(); + assertHaveReader(); byte[] aRaw, bRaw; @@ -987,9 +1003,10 @@ public class DiffFormatter implements AutoCloseable { return diffAlgorithm.diff(comparator, a, b); } - private void assertHaveRepository() { - if (db == null) - throw new IllegalStateException(JGitText.get().repositoryIsRequired); + private void assertHaveReader() { + if (reader == null) { + throw new IllegalStateException(JGitText.get().readerIsRequired); + } } private byte[] open(DiffEntry.Side side, DiffEntry entry) |