Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JGit - How to reuse the DiffFormatter

Tags:

java

jgit

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?

like image 922
nantitv Avatar asked Jan 03 '19 09:01

nantitv


1 Answers

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.

like image 102
Rüdiger Herrmann Avatar answered Oct 22 '22 07:10

Rüdiger Herrmann