Skip to content

Commit ff72bb2

Browse files
authored
Merge pull request #416 from TheSnoozer/skip-git-invocation-correctly
The new caching should work for reactor builds with different prefixes and injectAllReactorProjects=true
2 parents 9821efc + 0c89d09 commit ff72bb2

File tree

5 files changed

+119
-34
lines changed

5 files changed

+119
-34
lines changed

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

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -436,35 +436,36 @@ public void execute() throws MojoExecutionException {
436436
Properties contextProperties = getContextProperties(project);
437437
boolean alreadyInjected = injectAllReactorProjects && contextProperties != null;
438438
if (alreadyInjected) {
439-
log.info("injectAllReactorProjects is enabled and this project already contains properties - using already computed values");
439+
log.info("injectAllReactorProjects is enabled - attempting to use the already computed values");
440440
properties = contextProperties;
441-
} else {
442-
loadGitData(properties);
443-
loadBuildData(properties);
444-
propertiesReplacer.performReplacement(properties, replacementProperties);
445-
propertiesFilterer.filter(properties, includeOnlyProperties, this.prefixDot);
446-
propertiesFilterer.filterNot(properties, excludeProperties, this.prefixDot);
447441
}
442+
443+
loadGitData(properties);
444+
loadBuildData(properties);
445+
propertiesReplacer.performReplacement(properties, replacementProperties);
446+
propertiesFilterer.filter(properties, includeOnlyProperties, this.prefixDot);
447+
propertiesFilterer.filterNot(properties, excludeProperties, this.prefixDot);
448+
448449
logProperties();
449450

450451
if (generateGitPropertiesFile) {
451452
new PropertiesFileGenerator(log, buildContext, format, prefixDot, project.getName()).maybeGeneratePropertiesFile(
452453
properties, project.getBasedir(), generateGitPropertiesFilename, sourceCharset);
453454
}
454-
if (!alreadyInjected) {
455-
publishPropertiesInto(project.getProperties());
456-
// some plugins rely on the user properties (e.g. flatten-maven-plugin)
457-
publishPropertiesInto(session.getUserProperties());
458-
459-
if (injectAllReactorProjects) {
460-
appendPropertiesToReactorProjects();
461-
}
462-
463-
if (injectIntoSysProperties) {
464-
publishPropertiesInto(System.getProperties());
465-
publishPropertiesInto(session.getSystemProperties());
466-
}
455+
456+
publishPropertiesInto(project.getProperties());
457+
// some plugins rely on the user properties (e.g. flatten-maven-plugin)
458+
publishPropertiesInto(session.getUserProperties());
459+
460+
if (injectAllReactorProjects) {
461+
appendPropertiesToReactorProjects();
467462
}
463+
464+
if (injectIntoSysProperties) {
465+
publishPropertiesInto(System.getProperties());
466+
publishPropertiesInto(session.getSystemProperties());
467+
}
468+
468469
} catch (Exception e) {
469470
handlePluginFailure(e);
470471
}
@@ -536,7 +537,7 @@ private File lookupGitDirectory() throws GitCommitIdExecutionException {
536537
private void logProperties() {
537538
for (Object key : properties.keySet()) {
538539
String keyString = key.toString();
539-
log.info("found property {}", keyString);
540+
log.info("including property {} in results", keyString);
540541
}
541542
}
542543

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,9 +242,12 @@ protected SimpleDateFormat getSimpleDateFormatWithTimeZone() {
242242
protected void maybePut(@Nonnull Properties properties, String key, SupplierEx<String> value)
243243
throws GitCommitIdExecutionException {
244244
String keyWithPrefix = prefixDot + key;
245-
if (PropertiesFilterer.isIncluded(keyWithPrefix, includeOnlyProperties, excludeProperties)) {
245+
if (properties.contains(keyWithPrefix)) {
246+
String propertyValue = properties.getProperty(keyWithPrefix);
247+
log.info("Using cached {} with value {}", keyWithPrefix, propertyValue);
248+
} else if (PropertiesFilterer.isIncluded(keyWithPrefix, includeOnlyProperties, excludeProperties)) {
246249
String propertyValue = value.get();
247-
log.info("{} {}", keyWithPrefix, propertyValue);
250+
log.info("Collected {} with value {}", keyWithPrefix, propertyValue);
248251
PropertyManager.putWithoutPrefix(properties, keyWithPrefix, propertyValue);
249252
}
250253
}

src/main/java/pl/project13/maven/git/build/BuildServerDataProvider.java

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import java.util.Map;
3131
import java.util.Properties;
3232
import java.util.TimeZone;
33+
import java.util.function.Supplier;
3334

3435
public abstract class BuildServerDataProvider {
3536

@@ -125,21 +126,37 @@ private void loadBuildVersionAndTimeData(@Nonnull Properties properties) {
125126
}
126127

127128
private void loadBuildHostData(@Nonnull Properties properties) {
128-
String buildHost = null;
129-
try {
130-
buildHost = InetAddress.getLocalHost().getHostName();
131-
} catch (UnknownHostException e) {
132-
log.info("Unable to get build host, skipping property {}. Error message: {}",
133-
GitCommitPropertyConstant.BUILD_HOST,
134-
e.getMessage());
135-
}
136-
put(properties, GitCommitPropertyConstant.BUILD_HOST, buildHost);
129+
Supplier<String> buildHostSupplier = () -> {
130+
String buildHost = null;
131+
try {
132+
// this call might be costly - try to avoid it too (similar concept as in GitDataProvider)
133+
buildHost = InetAddress.getLocalHost().getHostName();
134+
} catch (UnknownHostException e) {
135+
log.info("Unable to get build host, skipping property {}. Error message: {}",
136+
GitCommitPropertyConstant.BUILD_HOST,
137+
e.getMessage());
138+
}
139+
return buildHost;
140+
};
141+
maybePut(properties, GitCommitPropertyConstant.BUILD_HOST, buildHostSupplier);
137142
}
138143

139144
protected void put(@Nonnull Properties properties, @Nonnull String key, String value) {
140145
String keyWithPrefix = prefixDot + key;
141-
log.info("{} {}", keyWithPrefix, value);
146+
log.info("Collected {} with value {}", keyWithPrefix, value);
142147
PropertyManager.putWithoutPrefix(properties, keyWithPrefix, value);
143148
}
144149

150+
protected void maybePut(@Nonnull Properties properties, @Nonnull String key, Supplier<String> supplier) {
151+
String keyWithPrefix = prefixDot + key;
152+
if (properties.contains(keyWithPrefix)) {
153+
String propertyValue = properties.getProperty(keyWithPrefix);
154+
log.info("Using cached {} with value {}", keyWithPrefix, propertyValue);
155+
} else {
156+
String propertyValue = supplier.get();
157+
log.info("Collected {} with value {}", keyWithPrefix, propertyValue);
158+
PropertyManager.putWithoutPrefix(properties, keyWithPrefix, propertyValue);
159+
}
160+
}
161+
145162
}

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

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1568,7 +1568,45 @@ public void verifyDetachedHeadIsNotReportedAsBranch(boolean useNativeGit) throws
15681568
assertPropertyPresentAndEqual(targetProject.getProperties(), "git.branch", "master");
15691569
}
15701570

1571-
// TODO: Test that fails when trying to pass invalid data to evaluateOnCommit
1571+
@Test
1572+
@Parameters(method = "useNativeGit")
1573+
public void shouldGeneratePropertiesWithMultiplePrefixesAndReactorProject(boolean useNativeGit) throws Exception {
1574+
// given
1575+
mavenSandbox.withParentProject("my-pom-project", "pom")
1576+
.withGitRepoInParent(AvailableGitTestRepo.ON_A_TAG)
1577+
.withChildProject("my-child-module", "jar")
1578+
.create();
1579+
MavenProject targetProject = mavenSandbox.getChildProject(); // "my-child-two-module"
1580+
1581+
setProjectToExecuteMojoIn(targetProject);
1582+
GitDescribeConfig gitDescribeConfig = createGitDescribeConfig(false, 7);
1583+
gitDescribeConfig.setDirty("-dirty"); // checking if dirty works as expected
1584+
1585+
mojo.gitDescribe = gitDescribeConfig;
1586+
mojo.useNativeGit = useNativeGit;
1587+
mojo.injectAllReactorProjects = true;
1588+
1589+
List<String> prefixes = Arrays.asList("prefix-one", "prefix-two");
1590+
// when
1591+
// simulate plugin execution with multiple prefixes
1592+
// see https://github.com/git-commit-id/maven-git-commit-id-plugin/issues/137#issuecomment-418144756
1593+
for (String prefix: prefixes) {
1594+
mojo.prefix = prefix;
1595+
1596+
mojo.execute();
1597+
}
1598+
1599+
// then
1600+
// since we inject into all reactors both projects should have both properties
1601+
Properties properties = targetProject.getProperties();
1602+
for (String prefix: prefixes) {
1603+
assertPropertyPresentAndEqual(properties, prefix + ".commit.id.abbrev", "de4db35");
1604+
1605+
assertPropertyPresentAndEqual(properties, prefix + ".closest.tag.name", "v1.0.0");
1606+
1607+
assertPropertyPresentAndEqual(properties, prefix + ".closest.tag.commit.count", "0");
1608+
}
1609+
}
15721610

15731611
private GitDescribeConfig createGitDescribeConfig(boolean forceLongFormat, int abbrev) {
15741612
GitDescribeConfig gitDescribeConfig = new GitDescribeConfig();

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package pl.project13.maven.git;
1919

2020
import org.apache.commons.io.FileUtils;
21+
import org.apache.maven.execution.MavenSession;
2122
import org.apache.maven.project.MavenProject;
2223
import org.eclipse.jgit.api.Git;
2324
import org.junit.After;
@@ -26,9 +27,15 @@
2627
import javax.annotation.Nonnull;
2728
import java.io.File;
2829
import java.io.IOException;
30+
import java.util.ArrayList;
31+
import java.util.List;
2932
import java.util.Optional;
33+
import java.util.Properties;
3034
import java.util.concurrent.ThreadLocalRandom;
3135

36+
import static org.mockito.Mockito.mock;
37+
import static org.mockito.Mockito.when;
38+
3239
public abstract class GitIntegrationTest {
3340

3441
private static final String SANDBOX_DIR = "target" + File.separator + "sandbox" + File.separator;
@@ -108,11 +115,30 @@ public static void initializeMojoWithDefaults(GitCommitIdMojo mojo) {
108115
mojo.commitIdGenerationMode = "full";
109116
mojo.evaluateOnCommit = evaluateOnCommit;
110117
mojo.nativeGitTimeoutInMs = (30 * 1000);
118+
mojo.session = mockSession();
111119
}
112120

113121
public void setProjectToExecuteMojoIn(@Nonnull MavenProject project) {
114122
mojo.project = project;
115123
mojo.dotGitDirectory = new File(project.getBasedir(), ".git");
124+
mojo.reactorProjects = getReactorProjects(project);
125+
}
126+
127+
private static MavenSession mockSession() {
128+
MavenSession session = mock(MavenSession.class);
129+
when(session.getUserProperties()).thenReturn(new Properties());
130+
when(session.getSystemProperties()).thenReturn(new Properties());
131+
return session;
132+
}
133+
134+
private static List<MavenProject> getReactorProjects(@Nonnull MavenProject project) {
135+
List<MavenProject> reactorProjects = new ArrayList<>();
136+
MavenProject mavenProject = project;
137+
while (mavenProject != null) {
138+
reactorProjects.add(mavenProject);
139+
mavenProject = mavenProject.getParent();
140+
}
141+
return reactorProjects;
116142
}
117143

118144
}

0 commit comments

Comments
 (0)