]> source.dussan.org Git - jgit.git/commitdiff
Remove duplicated code in DiffFormatter 84/1484/1
authorShawn O. Pearce <spearce@spearce.org>
Wed, 1 Sep 2010 01:40:10 +0000 (18:40 -0700)
committerShawn O. Pearce <spearce@spearce.org>
Wed, 1 Sep 2010 17:19:43 +0000 (10:19 -0700)
Instead of trying to stream out the header, we can drop a redundant
code path by formatting the header into a temporary buffer and then
streaming out the actual line differences later.

Its a small amount of unnecessary work to buffer the file header,
but these are typically very tiny so the cost to format and reparse
is relatively low.

Change-Id: Id14a527a74ee0bd7e07f46fdec760c22b02d5bdf
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
org.eclipse.jgit/src/org/eclipse/jgit/diff/DiffFormatter.java

index 231b8ab2089ffc674de5b424fbdfb494619e8f3c..d8429a4cd8f1ba862428ff5adf3be544520f4cc5 100644 (file)
@@ -212,33 +212,8 @@ public class DiffFormatter {
         *             be written to.
         */
        public void format(DiffEntry ent) throws IOException {
-               writeDiffHeader(out, ent);
-
-               if (ent.getOldMode() == GITLINK || ent.getNewMode() == GITLINK) {
-                       writeGitLinkDiffText(out, ent);
-               } else {
-                       if (db == null)
-                               throw new IllegalStateException(
-                                               JGitText.get().repositoryIsRequired);
-
-                       ObjectReader reader = db.newObjectReader();
-                       byte[] aRaw, bRaw;
-                       try {
-                               aRaw = open(reader, ent.getOldMode(), ent.getOldId());
-                               bRaw = open(reader, ent.getNewMode(), ent.getNewId());
-                       } finally {
-                               reader.release();
-                       }
-
-                       if (RawText.isBinary(aRaw) || RawText.isBinary(bRaw)) {
-                               out.write(encodeASCII("Binary files differ\n"));
-
-                       } else {
-                               RawText a = rawTextFactory.create(aRaw);
-                               RawText b = rawTextFactory.create(bRaw);
-                               formatEdits(a, b, new MyersDiff(a, b).getEdits());
-                       }
-               }
+               FormatResult res = createFormatResult(ent);
+               format(res.header, res.a, res.b);
        }
 
        private void writeGitLinkDiffText(OutputStream o, DiffEntry ent)
@@ -406,8 +381,8 @@ public class DiffFormatter {
                if (!head.getHunks().isEmpty())
                        end = head.getHunks().get(0).getStartOffset();
                out.write(head.getBuffer(), start, end - start);
-
-               formatEdits(a, b, head.toEditList());
+               if (head.getPatchType() == PatchType.UNIFIED)
+                       formatEdits(a, b, head.toEditList());
        }
 
        /**
@@ -603,6 +578,20 @@ public class DiffFormatter {
         */
        public FileHeader createFileHeader(DiffEntry ent) throws IOException,
                        CorruptObjectException, MissingObjectException {
+               return createFormatResult(ent).header;
+       }
+
+       private static class FormatResult {
+               FileHeader header;
+
+               RawText a;
+
+               RawText b;
+       }
+
+       private FormatResult createFormatResult(DiffEntry ent) throws IOException,
+                       CorruptObjectException, MissingObjectException {
+               final FormatResult res = new FormatResult();
                ByteArrayOutputStream buf = new ByteArrayOutputStream();
                final EditList editList;
                final FileHeader.PatchType type;
@@ -631,14 +620,15 @@ public class DiffFormatter {
                                editList = new EditList();
                                type = PatchType.BINARY;
                        } else {
-                               RawText a = rawTextFactory.create(aRaw);
-                               RawText b = rawTextFactory.create(bRaw);
-                               editList = new MyersDiff(a, b).getEdits();
+                               res.a = rawTextFactory.create(aRaw);
+                               res.b = rawTextFactory.create(bRaw);
+                               editList = new MyersDiff(res.a, res.b).getEdits();
                                type = PatchType.UNIFIED;
                        }
                }
 
-               return new FileHeader(buf.toByteArray(), editList, type);
+               res.header = new FileHeader(buf.toByteArray(), editList, type);
+               return res;
        }
 
        private int findCombinedEnd(final List<Edit> edits, final int i) {