@@ -43,6 +43,7 @@ public static void write(UnifiedDiff diff, Function<String, List<String>> origin
4343 }, contextSize );
4444 }
4545
46+ // Pass null for originalLinesProvider to compute original lines. MUST have 0 context
4647 public static void write (UnifiedDiff diff , Function <String , List <String >> originalLinesProvider , Consumer <String > writer , int contextSize ) throws IOException {
4748 writer .accept (diff .getHeader ());
4849
@@ -61,7 +62,7 @@ public static void write(UnifiedDiff diff, Function<String, List<String>> origin
6162 writer .accept ("+++ " + file .getToFile ());
6263 }
6364
64- List <String > originalLines = originalLinesProvider .apply (file .getFromFile ());
65+ List <String > originalLines = originalLinesProvider == null ? null : originalLinesProvider .apply (file .getFromFile ());
6566
6667 List <AbstractDelta <String >> deltas = new ArrayList <>();
6768
@@ -76,7 +77,7 @@ public static void write(UnifiedDiff diff, Function<String, List<String>> origin
7677 // position.
7778 // And if it is, add it to the current set
7879 AbstractDelta <String > nextDelta = patchDeltas .get (i );
79- if ((position + delta .getSource ().size () + contextSize ) >= (nextDelta
80+ if (originalLines != null && (position + delta .getSource ().size () + contextSize ) >= (nextDelta
8081 .getSource ().getPosition () - contextSize )) {
8182 deltas .add (nextDelta );
8283 } else {
@@ -136,7 +137,7 @@ private static void processDeltas(Consumer<String> writer,
136137 revTotal ++;
137138 }
138139 // output the first Delta
139- getDeltaText (txt -> buffer .add (txt ), curDelta );
140+ getDeltaText (txt -> buffer .add (txt ), curDelta , origLines == null );
140141 origTotal += curDelta .getSource ().getLines ().size ();
141142 revTotal += curDelta .getTarget ().getLines ().size ();
142143
@@ -152,7 +153,7 @@ private static void processDeltas(Consumer<String> writer,
152153 origTotal ++;
153154 revTotal ++;
154155 }
155- getDeltaText (txt -> buff
8000
er .add (txt ), nextDelta ); // output the Delta
156+ getDeltaText (txt -> buffer .add (txt ), nextDelta , origLines == null ); // output the Delta
156157 origTotal += nextDelta .getSource ().getLines ().size ();
157158 revTotal += nextDelta .getTarget ().getLines ().size ();
158159 curDelta = nextDelta ;
@@ -176,6 +177,9 @@ private static void processDeltas(Consumer<String> writer,
176177 writer .accept (txt );
177178 });
178179 }
180+
181+ private static final com .github .difflib .text .DiffRowGenerator ROW_GENERATOR =
182+ com .github .difflib .text .DiffRowGenerator .create ().reportLinesUnchanged (true ).build ();
179183
180184 /**
181185 * getDeltaText returns the lines to be added to the Unified Diff text from the Delta parameter
@@ -184,12 +188,48 @@ private static void processDeltas(Consumer<String> writer,
184188 * @return list of String lines of code.
185189 * @author Bill James (tankerbay@gmail.com)
186190 */
187- private static void getDeltaText (Consumer <String > writer , AbstractDelta <String > delta ) {
188- for (String line : delta .getSource ().getLines ()) {
189- writer .accept ("-" + line );
190- }
191- for (String line : delta .getTarget ().getLines ()) {
192- writer .accept ("+" + line );
191+ private static void getDeltaText (Consumer <String > writer , AbstractDelta <String > delta , boolean split ) {
192+ if (split ) {
193+ try {
194+ List <com .github .difflib .text .DiffRow > rows = ROW_GENERATOR .generateDiffRows (delta .getSource ().getLines (), delta .getTarget ().getLines ());
195+ int changeIdx = -1 ;
196+ for (int i = 0 ; i < rows .size (); i ++) {
197+ com .github .difflib .text .DiffRow row = rows .get (i );
198+ if (changeIdx != -1 && row .getTag () != com .github .difflib .text .DiffRow .Tag .CHANGE ) {
199+ for (int j = changeIdx ; j < i ; j ++)
200+ writer .accept ("+" + rows .get (j ).getNewLine ());
201+ changeIdx = -1 ;
202+ }
203+ switch (row .getTag ()) {
204+ case EQUAL :
205+ writer .accept (" " + row .getOldLine ());
206+ break ;
207+ case INSERT :
208+ writer .accept ("+" + row .getNewLine ());
209+ break ;
210+ case DELETE :
211+ writer .accept ("-" + row .getOldLine ());
212+ break ;
213+ case CHANGE :
214+ if (changeIdx == -1 ) changeIdx = i ;
215+ writer .accept ("-" + row .getOldLine ());
216+ break ;
217+ }
218+ }
219+ if (changeIdx != -1 ) {
220+ for (int j = changeIdx ; j < rows .size (); j ++)
221+ writer .accept ("+" + rows .get (j ).getNewLine ());
222+ }
223+ } catch (com .github .difflib .algorithm .DiffException e ) {
224+ throw new RuntimeException (e );
225+ }
226+ } else {
227+ for (String line : delta .getSource ().getLines ()) {
228+ writer .accept ("-" + line );
229+ }
230+ for (String line : delta .getTarget ().getLines ()) {
231+ writer .accept ("+" + line );
232+ }
193233 }
194234 }
195235
0 commit comments