Skip to content

Commit c714120

Browse files
author
TheSnoozer
committed
#221: use gitDescribeConfig to determine the git.closest.tag.name and git.closest.tag.count
1 parent b3da4a4 commit c714120

5 files changed

Lines changed: 141 additions & 68 deletions

File tree

src/main/java/pl/project13/jgit/DescribeCommand.java

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,8 @@ public DescribeResult call() throws GitAPIException {
255255
ObjectReader objectReader = repo.newObjectReader();
256256

257257
// get tags
258-
Map<ObjectId, List<String>> tagObjectIdToName = findTagObjectIds(repo, tagsFlag);
258+
String matchPattern = createMatchPattern();
259+
Map<ObjectId, List<String>> tagObjectIdToName = jGitCommon.findTagObjectIds(repo, tagsFlag, matchPattern);
259260

260261
// get current commit
261262
RevCommit headCommit = findHeadObjectId(repo);
@@ -344,28 +345,7 @@ static boolean hasTags(ObjectId headCommit, @NotNull Map<ObjectId, List<String>>
344345
}
345346

346347
RevCommit findHeadObjectId(@NotNull Repository repo) throws RuntimeException {
347-
try {
348-
ObjectId headId = repo.resolve("HEAD");
349-
350-
RevWalk walk = new RevWalk(repo);
351-
RevCommit headCommit = walk.lookupCommit(headId);
352-
walk.dispose();
353-
354-
log.info("HEAD is [{}]", headCommit.getName());
355-
return headCommit;
356-
} catch (IOException ex) {
357-
throw new RuntimeException("Unable to obtain HEAD commit!", ex);
358-
}
359-
}
360-
361-
// git commit id -> its tag (or tags)
362-
private Map<ObjectId, List<String>> findTagObjectIds(@NotNull Repository repo, boolean tagsFlag) {
363-
String matchPattern = createMatchPattern();
364-
Map<ObjectId, List<DatedRevTag>> commitIdsToTags = jGitCommon.getCommitIdsToTags(repo, tagsFlag, matchPattern);
365-
Map<ObjectId, List<String>> commitIdsToTagNames = jGitCommon.transformRevTagsMapToDateSortedTagNames(commitIdsToTags);
366-
log.info("Created map: [{}]", commitIdsToTagNames);
367-
368-
return commitIdsToTagNames;
348+
return jGitCommon.findHeadObjectId(repo);
369349
}
370350

371351
private String createMatchPattern() {

src/main/java/pl/project13/jgit/JGitCommon.java

Lines changed: 49 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.eclipse.jgit.api.Status;
2626
import org.eclipse.jgit.api.errors.GitAPIException;
2727
import org.eclipse.jgit.errors.IncorrectObjectTypeException;
28+
import org.eclipse.jgit.lib.Constants;
2829
import org.eclipse.jgit.lib.ObjectId;
2930
import org.eclipse.jgit.lib.Ref;
3031
import org.eclipse.jgit.lib.Repository;
@@ -40,7 +41,9 @@
4041
import com.google.common.base.Predicate;
4142
import com.google.common.collect.Collections2;
4243
import com.google.common.collect.Lists;
44+
import pl.project13.maven.git.GitDescribeConfig;
4345
import pl.project13.maven.git.log.LoggerBridge;
46+
import pl.project13.maven.git.util.Pair;
4447

4548
public class JGitCommon {
4649

@@ -81,61 +84,65 @@ private Collection<String> getTags(final Git git, final ObjectId headId, final R
8184
return tags;
8285
}
8386

84-
public String getClosestTagName(@NotNull Repository repo) {
85-
Map<ObjectId, List<DatedRevTag>> map = getClosestTagAsMap(repo);
86-
for (Map.Entry<ObjectId, List<DatedRevTag>> entry : map.entrySet()) {
87-
return trimFullTagName(entry.getValue().get(0).tagName);
88-
}
89-
return "";
87+
public String getClosestTagName(@NotNull Repository repo, GitDescribeConfig gitDescribe) {
88+
// TODO: Why does some tests fail when it gets headCommit from JGitprovider?
89+
RevCommit headCommit = findHeadObjectId(repo);
90+
Pair<RevCommit, String> pair = getClosestRevCommit(repo, headCommit, gitDescribe);
91+
return pair.second;
9092
}
9193

92-
public String getClosestTagCommitCount(@NotNull Repository repo, RevCommit headCommit) {
93-
HashMap<ObjectId, List<String>> map = transformRevTagsMapToDateSortedTagNames(getClosestTagAsMap(repo));
94-
ObjectId obj = (ObjectId) map.keySet().toArray()[0];
95-
96-
try (RevWalk walk = new RevWalk(repo)) {
97-
RevCommit commit = walk.lookupCommit(obj);
98-
walk.dispose();
99-
100-
int distance = distanceBetween(repo, headCommit, commit);
101-
return String.valueOf(distance);
102-
}
94+
public String getClosestTagCommitCount(@NotNull Repository repo, GitDescribeConfig gitDescribe) {
95+
// TODO: Why does some tests fail when it gets headCommit from JGitprovider?
96+
RevCommit headCommit = findHeadObjectId(repo);
97+
Pair<RevCommit, String> pair = getClosestRevCommit(repo, headCommit, gitDescribe);
98+
RevCommit revCommit = pair.first;
99+
int distance = distanceBetween(repo, headCommit, revCommit);
100+
return String.valueOf(distance);
103101
}
104102

105-
private Map<ObjectId, List<DatedRevTag>> getClosestTagAsMap(@NotNull Repository repo) {
106-
Map<ObjectId, List<DatedRevTag>> mapWithClosestTagOnly = new HashMap<>();
103+
private Pair<RevCommit, String> getClosestRevCommit(@NotNull Repository repo, RevCommit headCommit, GitDescribeConfig gitDescribe) {
104+
boolean includeLightweightTags = false;
107105
String matchPattern = ".*";
108-
Map<ObjectId, List<DatedRevTag>> commitIdsToTags = getCommitIdsToTags(repo, true, matchPattern);
109-
LinkedHashMap<ObjectId, List<DatedRevTag>> sortedCommitIdsToTags = sortByDatedRevTag(commitIdsToTags);
110-
111-
for (Map.Entry<ObjectId, List<DatedRevTag>> entry: sortedCommitIdsToTags.entrySet()) {
112-
mapWithClosestTagOnly.put(entry.getKey(), entry.getValue());
113-
break;
106+
if (gitDescribe != null) {
107+
includeLightweightTags = gitDescribe.getTags();
108+
if (!"*".equals(gitDescribe.getMatch())) {
109+
matchPattern = gitDescribe.getMatch();
110+
}
114111
}
112+
Map<ObjectId, List<String>> tagObjectIdToName = findTagObjectIds(repo, includeLightweightTags, matchPattern);
113+
if (tagObjectIdToName.containsKey(headCommit)) {
114+
String tagName = tagObjectIdToName.get(headCommit).iterator().next();
115+
return Pair.of(headCommit, tagName);
116+
}
117+
List<RevCommit> commits = findCommitsUntilSomeTag(repo, headCommit, tagObjectIdToName);
118+
RevCommit revCommit = commits.get(0);
119+
String tagName = tagObjectIdToName.get(revCommit).iterator().next();
115120

116-
return mapWithClosestTagOnly;
121+
return Pair.of(revCommit, tagName);
117122
}
118123

119-
private LinkedHashMap<ObjectId, List<DatedRevTag>> sortByDatedRevTag(Map<ObjectId, List<DatedRevTag>> map) {
120-
List<Map.Entry<ObjectId, List<DatedRevTag>>> list = new ArrayList<>(map.entrySet());
124+
protected Map<ObjectId, List<String>> findTagObjectIds(@NotNull Repository repo, boolean includeLightweightTags, String matchPattern) {
125+
Map<ObjectId, List<DatedRevTag>> commitIdsToTags = getCommitIdsToTags(repo, includeLightweightTags, matchPattern);
126+
Map<ObjectId, List<String>> commitIdsToTagNames = transformRevTagsMapToDateSortedTagNames(commitIdsToTags);
127+
log.info("Created map: [{}]", commitIdsToTagNames);
121128

122-
Collections.sort(list, new Comparator<Map.Entry<ObjectId, List<DatedRevTag>>>() {
123-
public int compare(Map.Entry<ObjectId, List<DatedRevTag>> m1, Map.Entry<ObjectId, List<DatedRevTag>> m2) {
124-
// we need to sort the DatedRevTags to a commit first, otherwise we may get problems when we have two tags for the same commit
125-
Collections.sort(m1.getValue(), datedRevTagComparator());
126-
Collections.sort(m2.getValue(), datedRevTagComparator());
129+
return commitIdsToTagNames;
130+
}
127131

128-
DatedRevTag datedRevTag1 = m1.getValue().get(0);
129-
DatedRevTag datedRevTag2 = m2.getValue().get(0);
130-
return datedRevTagComparator().compare(datedRevTag1,datedRevTag2);
131-
}
132-
});
132+
protected RevCommit findHeadObjectId(@NotNull Repository repo) throws RuntimeException {
133+
try {
134+
ObjectId headId = repo.resolve(Constants.HEAD);
133135

134-
LinkedHashMap<ObjectId, List<DatedRevTag>> result = new LinkedHashMap<>();
135-
for (Map.Entry<ObjectId, List<DatedRevTag>> entry : list) {
136-
result.put(entry.getKey(), entry.getValue());
136+
try (RevWalk walk = new RevWalk(repo)) {
137+
RevCommit headCommit = walk.lookupCommit(headId);
138+
walk.dispose();
139+
140+
log.info("HEAD is [{}]", headCommit.getName());
141+
return headCommit;
142+
}
143+
} catch (IOException ex) {
144+
throw new RuntimeException("Unable to obtain HEAD commit!", ex);
137145
}
138-
return result;
139146
}
140147

141148
protected Map<ObjectId, List<DatedRevTag>> getCommitIdsToTags(@NotNull Repository repo, boolean includeLightweightTags, String matchPattern) {

src/main/java/pl/project13/maven/git/JGitProvider.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ public String getTags() throws GitCommitIdExecutionException {
187187
public String getClosestTagName() throws GitCommitIdExecutionException {
188188
Repository repo = getGitRepository();
189189
try {
190-
return jGitCommon.getClosestTagName(repo);
190+
return jGitCommon.getClosestTagName(repo, gitDescribe);
191191
} catch (Throwable t) {
192192
// could not find any tags to describe
193193
}
@@ -198,7 +198,7 @@ public String getClosestTagName() throws GitCommitIdExecutionException {
198198
public String getClosestTagCommitCount() throws GitCommitIdExecutionException {
199199
Repository repo = getGitRepository();
200200
try {
201-
return jGitCommon.getClosestTagCommitCount(repo, headCommit);
201+
return jGitCommon.getClosestTagCommitCount(repo, gitDescribe);
202202
} catch (Throwable t) {
203203
// could not find any tags to describe
204204
}

src/main/java/pl/project13/maven/git/NativeGitProvider.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,19 @@ public String getRemoteOriginUrl() throws GitCommitIdExecutionException {
212212
@Override
213213
public String getClosestTagName() throws GitCommitIdExecutionException {
214214
try {
215-
return runGitCommand(canonical, "describe --abbrev=0 --tags");
215+
StringBuilder argumentsForGitDescribe = new StringBuilder();
216+
argumentsForGitDescribe.append("describe --abbrev=0");
217+
if (gitDescribe != null) {
218+
if (gitDescribe.getTags()) {
219+
argumentsForGitDescribe.append(" --tags");
220+
}
221+
222+
final String matchOption = gitDescribe.getMatch();
223+
if (matchOption != null && !matchOption.isEmpty()) {
224+
argumentsForGitDescribe.append(" --match=").append(matchOption);
225+
}
226+
}
227+
return runGitCommand(canonical, argumentsForGitDescribe.toString());
216228
} catch (NativeCommandException ignore) {
217229
// could not find any tags to describe
218230
}

src/test/java/pl/project13/maven/git/GitCommitIdMojoIntegrationTest.java

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -869,6 +869,80 @@ public void testDetectDirtyWorkingDirectory(boolean useNativeGit) throws Excepti
869869
assertThat(properties).includes(entry("git.commit.id.describe", "0b0181b" + dirtySuffix)); // assert dirtySuffix at the end!
870870
}
871871

872+
@Test
873+
@Parameters(method = "useNativeGit")
874+
public void shouldGenerateClosestTagInformationWithExcludeLightweightTagsForClosestTag(boolean useNativeGit) throws Exception {
875+
// given
876+
mavenSandbox
877+
.withParentProject("my-jar-project", "jar")
878+
.withNoChildProject()
879+
.withGitRepoInParent(AvailableGitTestRepo.WITH_LIGHTWEIGHT_TAG_BEFORE_ANNOTATED_TAG)
880+
.create();
881+
882+
MavenProject targetProject = mavenSandbox.getParentProject();
883+
setProjectToExecuteMojoIn(targetProject);
884+
885+
GitDescribeConfig gitDescribe = createGitDescribeConfig(true, 9);
886+
gitDescribe.setDirty("-customDirtyMark");
887+
gitDescribe.setTags(false); // exclude lightweight tags
888+
889+
alterMojoSettings("gitDescribe", gitDescribe);
890+
alterMojoSettings("useNativeGit", useNativeGit);
891+
892+
// when
893+
mojo.execute();
894+
895+
// then
896+
assertThat(targetProject.getProperties().stringPropertyNames()).contains("git.commit.id.abbrev");
897+
assertThat(targetProject.getProperties().getProperty("git.commit.id.abbrev")).isEqualTo("b6a73ed");
898+
899+
assertThat(targetProject.getProperties().stringPropertyNames()).contains("git.commit.id.describe");
900+
assertThat(targetProject.getProperties().getProperty("git.commit.id.describe")).isEqualTo("annotated-tag-2-gb6a73ed74-customDirtyMark");
901+
902+
assertThat(targetProject.getProperties().stringPropertyNames()).contains("git.closest.tag.name");
903+
assertThat(targetProject.getProperties().getProperty("git.closest.tag.name")).isEqualTo("annotated-tag");
904+
905+
assertThat(targetProject.getProperties().stringPropertyNames()).contains("git.closest.tag.commit.count");
906+
assertThat(targetProject.getProperties().getProperty("git.closest.tag.commit.count")).isEqualTo("2");
907+
}
908+
909+
@Test
910+
@Parameters(method = "useNativeGit")
911+
public void shouldGenerateClosestTagInformationWithIncludeLightweightTagsForClosestTag(boolean useNativeGit) throws Exception {
912+
// given
913+
mavenSandbox
914+
.withParentProject("my-jar-project", "jar")
915+
.withNoChildProject()
916+
.withGitRepoInParent(AvailableGitTestRepo.WITH_LIGHTWEIGHT_TAG_BEFORE_ANNOTATED_TAG)
917+
.create();
918+
919+
MavenProject targetProject = mavenSandbox.getParentProject();
920+
setProjectToExecuteMojoIn(targetProject);
921+
922+
GitDescribeConfig gitDescribe = createGitDescribeConfig(true, 9);
923+
gitDescribe.setDirty("-customDirtyMark");
924+
gitDescribe.setTags(true); // include lightweight tags
925+
926+
alterMojoSettings("gitDescribe", gitDescribe);
927+
alterMojoSettings("useNativeGit", useNativeGit);
928+
929+
// when
930+
mojo.execute();
931+
932+
// then
933+
assertThat(targetProject.getProperties().stringPropertyNames()).contains("git.commit.id.abbrev");
934+
assertThat(targetProject.getProperties().getProperty("git.commit.id.abbrev")).isEqualTo("b6a73ed");
935+
936+
assertThat(targetProject.getProperties().stringPropertyNames()).contains("git.commit.id.describe");
937+
assertThat(targetProject.getProperties().getProperty("git.commit.id.describe")).isEqualTo("lightweight-tag-1-gb6a73ed74-customDirtyMark");
938+
939+
assertThat(targetProject.getProperties().stringPropertyNames()).contains("git.closest.tag.name");
940+
assertThat(targetProject.getProperties().getProperty("git.closest.tag.name")).isEqualTo("lightweight-tag");
941+
942+
assertThat(targetProject.getProperties().stringPropertyNames()).contains("git.closest.tag.commit.count");
943+
assertThat(targetProject.getProperties().getProperty("git.closest.tag.commit.count")).isEqualTo("1");
944+
}
945+
872946
private GitDescribeConfig createGitDescribeConfig(boolean forceLongFormat, int abbrev) {
873947
GitDescribeConfig gitDescribeConfig = new GitDescribeConfig();
874948
gitDescribeConfig.setTags(true);

0 commit comments

Comments
 (0)