7

It's a followup question of jgit - git diff based on file extension.

I am trying to add the formatted diff to List<String> but If I try to use same DiffFormatter as below then previous entries getting appended to the next one.

List<String> changes = new LinkedList<>();
            try (OutputStream outputStream = new ByteArrayOutputStream();
                    DiffFormatter diffFormatter = new DiffFormatter(outputStream)) {
                diffFormatter.setRepository(git1.getRepository());
                TreeFilter treeFilter = PathSuffixFilter.create(".txt");
                diffFormatter.setPathFilter(treeFilter);
                List<DiffEntry> entries = diffFormatter.scan(newTree, oldTree);
                for (DiffEntry diffEntry : entries) {
                    diffFormatter.format(diffEntry);
                    changes.add(outputStream.toString());
                    diffFormatter.flush();
                }
            }

Therefore I forced to create a DIffFormatter for every diff entry.

Is there a better way to create List<String> from List<DiffEntry> without creating a new DiffFormatter every time?

nantitv
  • 3,539
  • 4
  • 38
  • 61
  • You're using ByteArrayOutputStream here. I think if you called OutputStream.reset() right after your diffFormatter.flush() line, you would get each entry individually rather than getting a cumulative result as you processed them. – froggythefrog Jul 20 '20 at 16:42

1 Answers1

2

The cause for the previous entries getting appended is that the same output stream is used. Calling outputStream.toString() returns a string of all the bytes that have been written so far. Hence each calling toString within the for loop will return all previously created diffs, plus the current one.

I see two ways of solving this issue:

  • Use a separate DiffFormatter within the for loop for each diff entry.

  • Implement a custom OutputStream that allows to discard previously written content.

Rüdiger Herrmann
  • 20,512
  • 11
  • 62
  • 79