|
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