Skip to content

Commit e864ade

Browse files
author
Denis
committed
getBranchesDiff() updated
documentation updated
1 parent bc59c2b commit e864ade

File tree

2 files changed

+50
-37
lines changed

2 files changed

+50
-37
lines changed

README.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
# Overview
2-
Pk-vcs-git is lightweight library for execute basic Git VCS operations (merge, branch create etc). It uses [pk-vcs-api](https://github.com/ProjectKaiser/pk-vcs-api) exposing IVCS implementation for Git repositories and [JGit](https://eclipse.org/jgit/) as framework to work with Git repositories
2+
Pk-vcs-git is lightweight library for execute basic Git VCS operations (merge, branch create etc). It uses [pk-vcs-api](https://github.com/ProjectKaiser/pk-vcs-api) exposing IVCS implementation for Git repositories and [JGit](https://eclipse.org/jgit/) as framework to work with Git repositories.
3+
Features:
4+
- Branch create and remove
5+
- Branch merge returning result(success or list of conflicted files)
6+
- Commit messages list
7+
- Summarized branch changes list
8+
- Branches list
9+
- File content getting and setting
10+
- File create and remove
311

412
# Terms
513
- Workspace Home

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

Lines changed: 41 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import org.apache.commons.io.FileUtils;
2020
import org.apache.commons.io.IOUtils;
21+
import org.eclipse.jgit.api.CreateBranchCommand.SetupUpstreamMode;
2122
import org.eclipse.jgit.api.Git;
2223
import org.eclipse.jgit.api.ListBranchCommand.ListMode;
2324
import org.eclipse.jgit.api.MergeResult;
@@ -31,13 +32,12 @@
3132
import org.eclipse.jgit.lib.Ref;
3233
import org.eclipse.jgit.lib.Repository;
3334
import org.eclipse.jgit.revwalk.RevCommit;
34-
import org.eclipse.jgit.revwalk.RevTree;
3535
import org.eclipse.jgit.revwalk.RevWalk;
36+
import org.eclipse.jgit.revwalk.filter.RevFilter;
3637
import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
3738
import org.eclipse.jgit.transport.CredentialsProvider;
3839
import org.eclipse.jgit.transport.RefSpec;
3940
import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
40-
import org.eclipse.jgit.treewalk.AbstractTreeIterator;
4141
import org.eclipse.jgit.treewalk.CanonicalTreeParser;
4242

4343
import com.projectkaiser.scm.vcs.api.IVCS;
@@ -89,6 +89,7 @@ public void createBranch(String srcBranchName, String newBranchName, String comm
8989

9090
git
9191
.branchCreate()
92+
.setUpstreamMode(SetupUpstreamMode.TRACK)
9293
.setName(newBranchName)
9394
.call();
9495

@@ -391,51 +392,53 @@ public List<VCSDiffEntry> getBranchesDiff(String srcBranchName, String destBranc
391392
List<VCSDiffEntry> res = new ArrayList<>();
392393
try (IVCSLockedWorkingCopy wc = repo.getVCSLockedWorkingCopy()) {
393394
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());
398416

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+
}
410429
}
430+
411431
git.getRepository().close();
412432
return res;
413433
}
414-
} catch (GitAPIException e) {
434+
} catch (GitAPIException e) {
415435
throw new EVCSException(e);
416436
} catch (Exception e) {
417437
throw new RuntimeException(e);
418438
}
419439

420440
}
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+
439442
private VCSChangeType gitChangeTypeToVCSChangeType(ChangeType changeType) {
440443
switch (changeType) {
441444
case ADD:
@@ -474,12 +477,14 @@ public Set<String> getBranches() {
474477
public List<String> getCommitMessages(String branchName, Integer limit) {
475478
try (IVCSLockedWorkingCopy wc = repo.getVCSLockedWorkingCopy()) {
476479
try (Git git = getLocalGit(wc)) {
480+
477481
Iterable<RevCommit> logs = git
478482
.log()
479483
.add(git.getRepository().resolve("remotes/origin/"
480484
+ parseBranch(branchName)))
481485
.setMaxCount(limit)
482486
.call();
487+
483488
List<String> res = new ArrayList<>();
484489
for (RevCommit commit : logs) {
485490
res.add(commit.getFullMessage());

0 commit comments

Comments
 (0)