Skip to content

Commit aae075a

Browse files
author
Denis
committed
getBranchesDiff fix
1 parent 5d6942a commit aae075a

File tree

2 files changed

+49
-38
lines changed

2 files changed

+49
-38
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ Features:
2121
- Hosted on [Github](https://github.com/) using username and password provided by environment variables (see below)
2222
- Generates new before and deletes after each test
2323
- Named randomly (uuid is used)
24-
- [Kohsuke Github API](http://github-api.kohsuke.org/) is used as to work with Github API
24+
- [Kohsuke Github API](http://github-api.kohsuke.org/) is used as to operate with Github API
2525

2626
# Using pk-vcs-git
2727
- Add github-hosted pk-vcs-git project as maven dependency using [jitpack.io](https://jitpack.io/). As an example, add following to gradle.build file:
@@ -62,7 +62,7 @@ Features:
6262
- LWC is obtained for each vcs operation.
6363
- `getLocalGit(IVCSLockedWorkingCopy wc)` method is used to create a Git implementation to execute vcs operations within `wc` Working Copy
6464
- If provided LWC is empty then current Test Repository is cloned into this LWC, otherwise just Git object is created
65-
- If `IVCS.setProxy()` is called then provided proxy is used to each url which contains `repoUrl`
65+
- If `IVCS.setProxy()` is called then provided proxy is used for each url which contains `repoUrl`
6666

6767
# Functional testing
6868
- Github is used for hosting the Test Repository

src/main/java/com/projectkaiser/scm/vcs/GitVCS.java

Lines changed: 47 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.projectkaiser.scm.vcs;
22

3+
import java.io.ByteArrayOutputStream;
34
import java.io.File;
45
import java.io.FileWriter;
56
import java.io.IOException;
@@ -28,12 +29,12 @@
2829
import org.eclipse.jgit.diff.DiffEntry;
2930
import org.eclipse.jgit.diff.DiffEntry.ChangeType;
3031
import org.eclipse.jgit.diff.DiffEntry.Side;
32+
import org.eclipse.jgit.diff.DiffFormatter;
3133
import org.eclipse.jgit.lib.ObjectReader;
3234
import org.eclipse.jgit.lib.Ref;
3335
import org.eclipse.jgit.lib.Repository;
3436
import org.eclipse.jgit.revwalk.RevCommit;
3537
import org.eclipse.jgit.revwalk.RevWalk;
36-
import org.eclipse.jgit.revwalk.filter.RevFilter;
3738
import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
3839
import org.eclipse.jgit.transport.CredentialsProvider;
3940
import 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

Comments
 (0)