11package com .projectkaiser .scm .vcs ;
22
3+ import java .io .ByteArrayOutputStream ;
34import java .io .File ;
45import java .io .FileWriter ;
56import java .io .IOException ;
2829import org .eclipse .jgit .diff .DiffEntry ;
2930import org .eclipse .jgit .diff .DiffEntry .ChangeType ;
3031import org .eclipse .jgit .diff .DiffEntry .Side ;
32+ import org .eclipse .jgit .diff .DiffFormatter ;
3133import org .eclipse .jgit .lib .ObjectReader ;
3234import org .eclipse .jgit .lib .Ref ;
3335import org .eclipse .jgit .lib .Repository ;
3436import org .eclipse .jgit .revwalk .RevCommit ;
3537import org .eclipse .jgit .revwalk .RevWalk ;
36- import org .eclipse .jgit .revwalk .filter .RevFilter ;
3738import org .eclipse .jgit .storage .file .FileRepositoryBuilder ;
3839import org .eclipse .jgit .transport .CredentialsProvider ;
3940import org .eclipse .jgit .transport .RefSpec ;
@@ -91,9 +92,9 @@ public void createBranch(String srcBranchName, String newBranchName, String comm
9192 git
9293 .checkout ()
9394 .setCreateBranch (git .getRepository ().exactRef ("refs/heads/" +
94- parseBranch (srcBranchName )) == null )
95- .setStartPoint ("origin/" + parseBranch (srcBranchName ))
96- .setName (parseBranch (srcBranchName ))
95+ getRealBranchName (srcBranchName )) == null )
96+ .setStartPoint ("origin/" + getRealBranchName (srcBranchName ))
97+ .setName (getRealBranchName (srcBranchName ))
9798 .call (); // switch to master
9899
99100 git
@@ -125,7 +126,7 @@ public void createBranch(String srcBranchName, String newBranchName, String comm
125126 }
126127 }
127128
128- private String parseBranch (String branchName ) {
129+ private String getRealBranchName (String branchName ) {
129130 return branchName == null ? MASTER_BRANCH_NAME : branchName ;
130131 }
131132
@@ -217,13 +218,13 @@ public VCSMergeResult merge(String srcBranchName, String dstBranchName, String c
217218
218219 git
219220 .checkout ()
220- .setCreateBranch (git .getRepository ().exactRef ("refs/heads/" + parseBranch (dstBranchName )) == null )
221- .setName (parseBranch (dstBranchName ))
221+ .setCreateBranch (git .getRepository ().exactRef ("refs/heads/" + getRealBranchName (dstBranchName )) == null )
222+ .setName (getRealBranchName (dstBranchName ))
222223 .call ();
223224
224225 MergeResult mr = git
225226 .merge ()
226- .include (git .getRepository ().findRef ("origin/" + parseBranch (srcBranchName )))
227+ .include (git .getRepository ().findRef ("origin/" + getRealBranchName (srcBranchName )))
227228 .setMessage (commitMessage )
228229 .call ();
229230
@@ -305,7 +306,7 @@ public String getRepoUrl() {
305306 public String getFileContent (String branchName , String fileRelativePath , String encoding ) {
306307 try (IVCSLockedWorkingCopy wc = repo .getVCSLockedWorkingCopy ()) {
307308 try (Git git = getLocalGit (wc )) {
308- String bn = parseBranch (branchName );
309+ String bn = getRealBranchName (branchName );
309310 git
310311 .pull ()
311312 .setCredentialsProvider (credentials )
@@ -341,7 +342,7 @@ public void setFileContent(String branchName, String filePath, String content, S
341342 try {
342343 try (IVCSLockedWorkingCopy wc = repo .getVCSLockedWorkingCopy ()) {
343344 try (Git git = getLocalGit (wc )) {
344- String bn = parseBranch (branchName );
345+ String bn = getRealBranchName (branchName );
345346
346347 git
347348 .pull ()
@@ -395,48 +396,59 @@ public void setFileContent(String branchName, String filePath, String content, S
395396 public String getFileContent (String branchName , String filePath ) {
396397 return getFileContent (branchName , filePath , StandardCharsets .UTF_8 .name ());
397398 }
398-
399+
399400 @ Override
400401 public List <VCSDiffEntry > getBranchesDiff (String srcBranchName , String dstBranchName ) {
401402 List <VCSDiffEntry > res = new ArrayList <>();
402403 try (IVCSLockedWorkingCopy wc = repo .getVCSLockedWorkingCopy ()) {
403404 try (Git git = getLocalGit (wc )) {
404405 try (RevWalk walk = new RevWalk (git .getRepository ())) {
405-
406- RevCommit srcHeadCommit = walk .parseCommit (git .getRepository ().resolve ("remotes/origin/"
407- + parseBranch (srcBranchName )));
408406 RevCommit destHeadCommit = walk .parseCommit (git .getRepository ().resolve ("remotes/origin/"
409- + parseBranch (dstBranchName )));
407+ + getRealBranchName (dstBranchName )));
408+
409+ ObjectReader reader = git .getRepository ().newObjectReader ();
410410
411- List <RevCommit > startPoints = new ArrayList <RevCommit >();
412- walk .setRevFilter (RevFilter .MERGE_BASE );
413- startPoints .add (destHeadCommit );
414- startPoints .add (srcHeadCommit );
415-
416- walk .markStart (startPoints );
417- RevCommit forkPoint = walk .next ();
411+ git
412+ .pull ()
413+ .setCredentialsProvider (credentials )
414+ .call ();
418415
419- ObjectReader reader = git .getRepository ().newObjectReader ();
420- CanonicalTreeParser srcTreeIter = new CanonicalTreeParser ();
421- srcTreeIter .reset (reader , srcHeadCommit .getTree ());
422-
423- CanonicalTreeParser destTreeIter = new CanonicalTreeParser ();
424- destTreeIter .reset (reader , forkPoint .getTree ());
425-
416+ git
417+ .checkout ()
418+ .setCreateBranch (git .getRepository ().exactRef ("refs/heads/" + getRealBranchName (dstBranchName )) == null )
419+ .setName (getRealBranchName (dstBranchName ))
420+ .setStartPoint (destHeadCommit )
421+ .call ();
422+
423+ git
424+ .merge ()
425+ .include (git .getRepository ().findRef ("origin/" + getRealBranchName (srcBranchName )))
426+ .setCommit (false )
427+ .call ();
428+
429+ CanonicalTreeParser srcTreeIter = new CanonicalTreeParser ();
430+ srcTreeIter .reset (reader , destHeadCommit .getTree ());
431+
426432 List <DiffEntry > diffs = git
427433 .diff ()
428- .setNewTree (srcTreeIter )
429- .setOldTree (destTreeIter )
434+ .setOldTree (srcTreeIter )
430435 .call ();
431436
432437 for (DiffEntry diffEntry : diffs ) {
433438 VCSDiffEntry vcsEntry = new VCSDiffEntry (
434439 diffEntry .getPath (diffEntry .getChangeType () == ChangeType .ADD ? Side .NEW : Side .OLD ),
435440 gitChangeTypeToVCSChangeType (diffEntry .getChangeType ()));
441+
442+
443+ ByteArrayOutputStream baos = new ByteArrayOutputStream ();
444+ try (DiffFormatter formatter = new DiffFormatter (baos )) {
445+ formatter .setRepository (git .getRepository ());
446+ formatter .format (diffEntry );
447+ }
448+ vcsEntry .setUnifiedDiff (baos .toString ("UTF-8" ));
436449 res .add (vcsEntry );
437450 }
438451 }
439-
440452 git .getRepository ().close ();
441453 return res ;
442454 }
@@ -445,9 +457,8 @@ public List<VCSDiffEntry> getBranchesDiff(String srcBranchName, String dstBranch
445457 } catch (Exception e ) {
446458 throw new RuntimeException (e );
447459 }
448-
449460 }
450-
461+
451462 private VCSChangeType gitChangeTypeToVCSChangeType (ChangeType changeType ) {
452463 switch (changeType ) {
453464 case ADD :
@@ -490,7 +501,7 @@ public List<String> getCommitMessages(String branchName, Integer limit) {
490501 Iterable <RevCommit > logs = git
491502 .log ()
492503 .add (git .getRepository ().resolve ("remotes/origin/"
493- + parseBranch (branchName )))
504+ + getRealBranchName (branchName )))
494505 .setMaxCount (limit )
495506 .call ();
496507
@@ -517,7 +528,7 @@ public String getVCSTypeString() {
517528 public void removeFile (String branchName , String filePath , String commitMessage ) {
518529 try (IVCSLockedWorkingCopy wc = repo .getVCSLockedWorkingCopy ()) {
519530 try (Git git = getLocalGit (wc )) {
520- String bn = parseBranch (branchName );
531+ String bn = getRealBranchName (branchName );
521532 git
522533 .pull ()
523534 .setCredentialsProvider (credentials )
0 commit comments