0

I'm new to JGit, so maybe I get something wrong, but I can't manage to get the result from the pull-command. By that I mean a list of files that were affected by the pull (modified/added/deleted files,....)

I tried several things, but none of them gave me the information I need:

PullResult pull_res = git.pull().setCredentialsProvider(cred).call();
MergeResult merge_res = pull_res.getMergeResult();
FetchResult fetch_res = pull_res.getFetchResult();
java.lang.System.out.println("MergeStat1: "+merge_res.getMergeStatus());
java.lang.System.out.println("####################################");
java.lang.System.out.println("MergeStat2: "+merge_res.getMergedCommits());
java.lang.System.out.println("####################################");
java.lang.System.out.println("FetchRes: "+fetch_res.getMessages());
java.lang.System.out.println("####################################");
java.lang.System.out.println("PullRes1: "+pull_res.getFetchResult());
java.lang.System.out.println("####################################");
java.lang.System.out.println("PullRes2: "+pull_res.getFetchResult().getMessages());
java.lang.System.out.println("####################################");
java.lang.System.out.println("PullRes3: "+pull_res.getFetchResult().toString());
java.lang.System.out.println("####################################");
java.lang.System.out.println("PullRes4: "+pull_res.getFetchResult().getMessages().toString());
java.lang.System.out.println("####################################");
java.lang.System.out.println("PullRes5: "+pull_res.getMergeResult());
java.lang.System.out.println("####################################");
java.lang.System.out.println("PullRes6: "+pull_res.getRebaseResult());
java.lang.System.out.println("####################################");
java.lang.System.out.println("PullRes7: "+pull_res.getFetchedFrom());

This results in the following output:

MergeStat1: Fast-forward
####################################
MergeStat2: [Lorg.eclipse.jgit.lib.ObjectId;@1....
####################################
FetchRes: 
####################################
PullRes1: org.eclipse.jgit.transport.FetchResult@3....
####################################
PullRes2: 
####################################
PullRes3: org.eclipse.jgit.transport.FetchResult@3....
####################################
PullRes4: 
####################################
PullRes5: Merge of revisions a...., 1a.. with base 1a... using strategy recursive resulted in: Fast-forward. 
####################################
PullRes6: null
####################################
PullRes7: origin

What can I do to get a list of all the affected files from that pull? (also how they were affected: modified, added, deleted..)

UPDATE

With Rüdigers answer I came to the following solution of the problem:

CanonicalTreeParser newTreeIter = new CanonicalTreeParser();
ObjectId tree = git.getRepository().resolve("HEAD^{tree}");
newTreeIter.reset(reader, tree);

UsernamePasswordCredentialsProvider cred = new UsernamePasswordCredentialsProvider(USER, PASSWORD);
PullResult pull_res = git.pull().setCredentialsProvider(cred).call();

CanonicalTreeParser oldTreeIter = new CanonicalTreeParser();
tree = git.getRepository().resolve("HEAD^{tree}");
oldTreeIter.reset(reader, tree);
DiffFormatter df = new DiffFormatter(new ByteArrayOutputStream());
df.setRepository( git.getRepository() );
List<DiffEntry> entries = df.scan(oldTreeIter, newTreeIter);

for(DiffEntry entry : entries) {
    java.lang.System.out.println(entry);
}
Alex K.
  • 707
  • 1
  • 11
  • 25

1 Answers1

2

Buffer the commit ID of the current branch before calling pull, for example using git.getRepository().resolve("HEAD").

When pull is done, read the HEAD commit ID again. Now you should be able to create a diff between the two commits.

How to show the changed files between two commits has been answered here: How to show changes between commits with JGit

See here for a detailed discussion of JGit's diff APIs: https://www.codeaffine.com/2016/06/16/jgit-diff/

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