1 package com.proalpha.pds.gitutils.common;
3 import java.io.IOException;
4 import java.lang.reflect.InvocationTargetException;
7 import org.eclipse.jgit.api.DiffCommand;
8 import org.eclipse.jgit.api.errors.GitAPIException;
9 import org.eclipse.jgit.diff.DiffEntry;
10 import org.eclipse.jgit.lib.ObjectId;
11 import org.eclipse.jgit.lib.ObjectReader;
12 import org.eclipse.jgit.lib.Repository;
13 import org.eclipse.jgit.revwalk.RevCommit;
14 import org.eclipse.jgit.revwalk.RevTree;
15 import org.eclipse.jgit.revwalk.RevWalk;
16 import org.eclipse.jgit.treewalk.AbstractTreeIterator;
17 import org.eclipse.jgit.treewalk.CanonicalTreeParser;
18 import org.eclipse.jgit.treewalk.filter.PathSuffixFilter;
19 import org.slf4j.Logger;
20 import org.slf4j.LoggerFactory;
22 import com.proalpha.git.PaGit;
26 private DiffCommand cmd;
27 private String dbCommit;
28 private String artifactsCommit;
29 private String targetRefName;
30 private String newHead;
31 private List<DiffEntry> pdiDiffList;
32 private List<DiffEntry> stateInfoDiffList;
33 private boolean isAssembliesXmlChanged;
36 boolean updateSourceRef,
boolean updateTargetRef, String dbCommit, String artifactsCommit) {
37 super(repository, remote, sourceRef, targetRef, updateSourceRef, updateTargetRef);
38 this.dbCommit = dbCommit;
39 this.artifactsCommit = artifactsCommit;
40 this.isAssembliesXmlChanged =
false;
44 boolean updateSourceRef,
boolean updateTargetRef, String dbCommit) {
45 super(repository, remote, sourceRef, targetRef, updateSourceRef, updateTargetRef);
46 this.dbCommit = dbCommit;
47 this.artifactsCommit = dbCommit;
48 this.isAssembliesXmlChanged =
false;
52 super(repository, targetRef);
55 private final Logger logger = LoggerFactory.getLogger(
DiffOperation.class);
63 public void run() throws InvocationTargetException {
65 if (logger.isInfoEnabled())
66 logger.info(
"Get diff between selected commits");
71 targetRefName = this.targetRef;
72 if (this.updateTargetRef)
75 targetRefName =
"remotes/" + this.remote +
"/" + this.targetRef;
76 if (this.updateTargetRef)
79 targetRefName =
"remotes/" + this.remote +
"/" + this.sourceRef;
80 if (this.updateSourceRef)
84 newHead = PaGit.getInstance().getGit().getRepository().findRef(targetRefName).getObjectId().getName();
86 logger.info(
"New head is {}", newHead);
88 this.pdiDiffList = executeCommand(this.dbCommit, targetRefName,
".pdi");
89 this.stateInfoDiffList = executeCommand(this.artifactsCommit, targetRefName,
".state_info");
90 this.isAssembliesXmlChanged = !executeCommand(this.artifactsCommit, targetRefName,
"assemblies.xml").isEmpty();
92 }
catch (IOException e) {
94 logger.info(e.getMessage());
96 }
catch (GitAPIException e) {
100 PaGit.getInstance().close();
105 private List<DiffEntry> executeCommand(String commitId, String refName, String pathFilter)
106 throws GitAPIException, IOException {
109 AbstractTreeIterator oldTreeParser = prepareTreeParserWithCommitId(repository, commitId);
110 AbstractTreeIterator newTreeParser = prepareTreeParserWithRef(repository, refName);
113 cmd = PaGit.getInstance().getGit().diff().setOldTree(oldTreeParser).setNewTree(newTreeParser)
114 .setShowNameAndStatusOnly(
true).setPathFilter(PathSuffixFilter.create(pathFilter));
116 List<DiffEntry> diffList = cmd.call();
119 if (logger.isDebugEnabled()) {
120 for (DiffEntry entry : diffList) {
121 logger.debug(
"Entry: {}", entry);
127 private static AbstractTreeIterator prepareTreeParserWithRef(Repository repository, String ref)
throws IOException {
128 ObjectId treeId = repository.resolve(ref +
"^{tree}");
129 try (RevWalk walk =
new RevWalk(repository)) {
130 RevTree tree = walk.parseTree(treeId);
132 CanonicalTreeParser treeParser =
new CanonicalTreeParser();
133 try (ObjectReader reader = repository.newObjectReader()) {
134 treeParser.reset(reader, tree.getId());
143 private static AbstractTreeIterator prepareTreeParserWithCommitId(Repository repository, String objectId)
148 try (RevWalk walk =
new RevWalk(repository)) {
149 RevCommit commit = walk.parseCommit(ObjectId.fromString(objectId));
150 RevTree tree = walk.parseTree(commit.getTree().getId());
152 CanonicalTreeParser treeParser =
new CanonicalTreeParser();
153 try (ObjectReader reader = repository.newObjectReader()) {
154 treeParser.reset(reader, tree.getId());
163 public String getDbCommit() {
167 public String getArtifactsCommit() {
168 return artifactsCommit;
171 public String getTargetRefName() {
172 return targetRefName;
175 public String getNewHead() {
179 public List<DiffEntry> getPdiDiffList() {
183 public List<DiffEntry> getStateInfoDiffList() {
184 return stateInfoDiffList;
187 public boolean isAssembliesXmlChanged() {
188 return isAssembliesXmlChanged;
boolean isServerBranch(String ref)
boolean tryFetch(String ref)
boolean isLocalBranch(String ref)