|
18 | 18 |
|
19 | 19 | import org.apache.commons.io.FileUtils; |
20 | 20 | import org.apache.commons.io.IOUtils; |
| 21 | +import org.eclipse.jgit.api.CreateBranchCommand.SetupUpstreamMode; |
21 | 22 | import org.eclipse.jgit.api.Git; |
22 | 23 | import org.eclipse.jgit.api.ListBranchCommand.ListMode; |
23 | 24 | import org.eclipse.jgit.api.MergeResult; |
|
31 | 32 | import org.eclipse.jgit.lib.Ref; |
32 | 33 | import org.eclipse.jgit.lib.Repository; |
33 | 34 | import org.eclipse.jgit.revwalk.RevCommit; |
34 | | -import org.eclipse.jgit.revwalk.RevTree; |
35 | 35 | import org.eclipse.jgit.revwalk.RevWalk; |
| 36 | +import org.eclipse.jgit.revwalk.filter.RevFilter; |
36 | 37 | import org.eclipse.jgit.storage.file.FileRepositoryBuilder; |
37 | 38 | import org.eclipse.jgit.transport.CredentialsProvider; |
38 | 39 | import org.eclipse.jgit.transport.RefSpec; |
39 | 40 | import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider; |
40 | | -import org.eclipse.jgit.treewalk.AbstractTreeIterator; |
41 | 41 | import org.eclipse.jgit.treewalk.CanonicalTreeParser; |
42 | 42 |
|
43 | 43 | import com.projectkaiser.scm.vcs.api.IVCS; |
@@ -89,6 +89,7 @@ public void createBranch(String srcBranchName, String newBranchName, String comm |
89 | 89 |
|
90 | 90 | git |
91 | 91 | .branchCreate() |
| 92 | + .setUpstreamMode(SetupUpstreamMode.TRACK) |
92 | 93 | .setName(newBranchName) |
93 | 94 | .call(); |
94 | 95 |
|
@@ -391,51 +392,53 @@ public List<VCSDiffEntry> getBranchesDiff(String srcBranchName, String destBranc |
391 | 392 | List<VCSDiffEntry> res = new ArrayList<>(); |
392 | 393 | try (IVCSLockedWorkingCopy wc = repo.getVCSLockedWorkingCopy()) { |
393 | 394 | try (Git git = getLocalGit(wc)) { |
394 | | - AbstractTreeIterator oldTreeParser = prepareTreeParser(git.getRepository(), "refs/heads/" |
395 | | - + parseBranch(destBranchName)); |
396 | | - AbstractTreeIterator newTreeParser = prepareTreeParser(git.getRepository(), "refs/heads/" |
397 | | - + parseBranch(srcBranchName)); |
| 395 | + try (RevWalk walk = new RevWalk(git.getRepository())) { |
| 396 | + |
| 397 | + RevCommit srcHeadCommit = walk.parseCommit(git.getRepository().resolve("remotes/origin/" |
| 398 | + + parseBranch(srcBranchName))); |
| 399 | + RevCommit destHeadCommit = walk.parseCommit(git.getRepository().resolve("remotes/origin/" |
| 400 | + + parseBranch(destBranchName))); |
| 401 | + |
| 402 | + List<RevCommit> startPoints = new ArrayList<RevCommit>(); |
| 403 | + walk.setRevFilter(RevFilter.MERGE_BASE); |
| 404 | + startPoints.add(destHeadCommit); |
| 405 | + startPoints.add(srcHeadCommit); |
| 406 | + |
| 407 | + walk.markStart(startPoints); |
| 408 | + RevCommit forkPoint = walk.next(); |
| 409 | + |
| 410 | + ObjectReader reader = git.getRepository().newObjectReader(); |
| 411 | + CanonicalTreeParser srcTreeIter = new CanonicalTreeParser(); |
| 412 | + srcTreeIter.reset(reader, srcHeadCommit.getTree()); |
| 413 | + |
| 414 | + CanonicalTreeParser destTreeIter = new CanonicalTreeParser(); |
| 415 | + destTreeIter.reset(reader, forkPoint.getTree()); |
398 | 416 |
|
399 | | - List<DiffEntry> diff = git |
400 | | - .diff() |
401 | | - .setOldTree(oldTreeParser) |
402 | | - .setNewTree(newTreeParser) |
403 | | - .call(); |
404 | | - |
405 | | - for (DiffEntry diffEntry : diff) { |
406 | | - VCSDiffEntry vcsEntry = new VCSDiffEntry( |
407 | | - diffEntry.getPath(diffEntry.getChangeType() == ChangeType.ADD ? Side.NEW : Side.OLD), |
408 | | - gitChangeTypeToVCSChangeType(diffEntry.getChangeType())); |
409 | | - res.add(vcsEntry); |
| 417 | + List<DiffEntry> diffs = git |
| 418 | + .diff() |
| 419 | + .setNewTree(srcTreeIter) |
| 420 | + .setOldTree(destTreeIter) |
| 421 | + .call(); |
| 422 | + |
| 423 | + for (DiffEntry diffEntry : diffs) { |
| 424 | + VCSDiffEntry vcsEntry = new VCSDiffEntry( |
| 425 | + diffEntry.getPath(diffEntry.getChangeType() == ChangeType.ADD ? Side.NEW : Side.OLD), |
| 426 | + gitChangeTypeToVCSChangeType(diffEntry.getChangeType())); |
| 427 | + res.add(vcsEntry); |
| 428 | + } |
410 | 429 | } |
| 430 | + |
411 | 431 | git.getRepository().close(); |
412 | 432 | return res; |
413 | 433 | } |
414 | | - } catch (GitAPIException e) { |
| 434 | + } catch (GitAPIException e) { |
415 | 435 | throw new EVCSException(e); |
416 | 436 | } catch (Exception e) { |
417 | 437 | throw new RuntimeException(e); |
418 | 438 | } |
419 | 439 |
|
420 | 440 | } |
421 | | - |
422 | | - private AbstractTreeIterator prepareTreeParser(Repository repository, String ref) throws Exception { |
423 | | - Ref head = repository.exactRef(ref); |
424 | | - try (RevWalk walk = new RevWalk(repository)) { |
425 | | - RevCommit commit = walk.parseCommit(head.getObjectId()); |
426 | | - RevTree tree = walk.parseTree(commit.getTree().getId()); |
427 | | - |
428 | | - CanonicalTreeParser oldTreeParser = new CanonicalTreeParser(); |
429 | | - try (ObjectReader oldReader = repository.newObjectReader()) { |
430 | | - oldTreeParser.reset(oldReader, tree.getId()); |
431 | | - } |
432 | | - |
433 | | - walk.dispose(); |
434 | | - |
435 | | - return oldTreeParser; |
436 | | - } |
437 | | - } |
438 | | - |
| 441 | + |
439 | 442 | private VCSChangeType gitChangeTypeToVCSChangeType(ChangeType changeType) { |
440 | 443 | switch (changeType) { |
441 | 444 | case ADD: |
@@ -474,12 +477,14 @@ public Set<String> getBranches() { |
474 | 477 | public List<String> getCommitMessages(String branchName, Integer limit) { |
475 | 478 | try (IVCSLockedWorkingCopy wc = repo.getVCSLockedWorkingCopy()) { |
476 | 479 | try (Git git = getLocalGit(wc)) { |
| 480 | + |
477 | 481 | Iterable<RevCommit> logs = git |
478 | 482 | .log() |
479 | 483 | .add(git.getRepository().resolve("remotes/origin/" |
480 | 484 | + parseBranch(branchName))) |
481 | 485 | .setMaxCount(limit) |
482 | 486 | .call(); |
| 487 | + |
483 | 488 | List<String> res = new ArrayList<>(); |
484 | 489 | for (RevCommit commit : logs) { |
485 | 490 | res.add(commit.getFullMessage()); |
|
0 commit comments