diff --git a/pom.xml b/pom.xml
index 581dd8e3..410ec67e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -66,13 +66,12 @@
${project.groupId}
git-commit-id-plugin-core
- 6.1.5
+ 6.2.0
- com.google.code.findbugs
- jsr305
- 3.0.2
- true
+ org.jspecify
+ jspecify
+ 1.0.0
@@ -326,8 +325,8 @@
- com.google.code.findbugs
- jsr305
+ org.jspecify
+ jspecify
diff --git a/src/main/java/pl/project13/maven/git/GitCommitIdMojo.java b/src/main/java/pl/project13/maven/git/GitCommitIdMojo.java
index 9e1557ec..d454de7e 100644
--- a/src/main/java/pl/project13/maven/git/GitCommitIdMojo.java
+++ b/src/main/java/pl/project13/maven/git/GitCommitIdMojo.java
@@ -24,6 +24,8 @@
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.time.Instant;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
import java.util.Collections;
import java.util.Date;
import java.util.List;
@@ -31,8 +33,6 @@
import java.util.Optional;
import java.util.Properties;
import java.util.function.Supplier;
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecution;
@@ -44,7 +44,8 @@
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.project.MavenProject;
import org.apache.maven.settings.Settings;
-import org.joda.time.DateTime;
+import org.jspecify.annotations.NonNull;
+import org.jspecify.annotations.Nullable;
import org.sonatype.plexus.build.incremental.BuildContext;
import pl.project13.core.CommitIdGenerationMode;
import pl.project13.core.CommitIdPropertiesOutputFormat;
@@ -1279,25 +1280,25 @@ public Supplier supplyProjectVersion() {
return () -> project.getVersion();
}
- @Nonnull
+ @NonNull
@Override
public LogInterface getLogInterface() {
return log;
}
- @Nonnull
+ @NonNull
@Override
public String getDateFormat() {
return dateFormat;
}
- @Nonnull
+ @NonNull
@Override
public String getDateFormatTimeZone() {
return dateFormatTimeZone;
}
- @Nonnull
+ @NonNull
@Override
public String getPrefixDot() {
String trimmedPrefix = prefix.trim();
@@ -1443,8 +1444,8 @@ public boolean isPerModuleVersions() {
}
private void publishToAllSystemEnvironments(
- @Nonnull LogInterface log,
- @Nonnull Properties propertiesToPublish,
+ @NonNull LogInterface log,
+ @NonNull Properties propertiesToPublish,
@Nullable Properties contextProperties) {
publishPropertiesInto(propertiesToPublish, project.getProperties());
// some plugins rely on the user properties (e.g. flatten-maven-plugin)
@@ -1505,7 +1506,44 @@ protected static Date parseOutputTimestamp(String outputTimestamp) {
// no timestamp configured
return null;
}
- return new DateTime(outputTimestamp).toDate();
+ // Normalize the timestamp to handle common variations
+ String normalized = outputTimestamp.trim();
+
+ // Handle lowercase designators
+ normalized = normalized.replace('t', 'T').replace('z', 'Z');
+
+ // Handle hours-only offsets by adding :00 minutes if needed
+ if (normalized.matches(".*[+-]\\d{2}$")) {
+ normalized = normalized.substring(0, normalized.length() - 3)
+ + normalized.substring(normalized.length() - 3) + ":00";
+ }
+
+ // Try parsing with different formatters in order of preference
+ DateTimeFormatter[] formatters = {
+ DateTimeFormatter.ISO_INSTANT, // 2022-02-12T15:30:00Z
+ DateTimeFormatter.ISO_OFFSET_DATE_TIME, // 2022-02-12T15:30+00:00
+ DateTimeFormatter.ISO_LOCAL_DATE_TIME, // 2022-02-12T15:30:00
+ DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mmZ"), // 2019-03-26T10:00-0400
+ DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ"), // 2019-03-26T10:00:00-0400
+ DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm") // 2022-02-12T15:30
+ };
+
+ for (DateTimeFormatter formatter : formatters) {
+ try {
+ if (
+ formatter == DateTimeFormatter.ISO_LOCAL_DATE_TIME
+ &&
+ (normalized.contains("+") || normalized.contains("-") || normalized.endsWith("Z"))
+ ) {
+ continue; // Skip local formatter for timestamps with timezones
+ }
+ return Date.from(Instant.from(formatter.parse(normalized)));
+ } catch (DateTimeParseException ignore) {
+ // Try next formatter
+ }
+ }
+
+ throw new IllegalArgumentException("Unable to parse timestamp: " + outputTimestamp);
}
private void publishPropertiesInto(Properties propertiesToPublish, Properties propertiesTarget) {
@@ -1536,7 +1574,7 @@ private void logProperties(LogInterface log, Properties propertiesToPublish) {
}
}
- private boolean isPomProject(@Nonnull MavenProject project) {
+ private boolean isPomProject(@NonNull MavenProject project) {
return project.getPackaging().equalsIgnoreCase("pom");
}
}
diff --git a/src/test/java/pl/project13/core/jgit/DescribeCommandIntegrationTest.java b/src/test/java/pl/project13/core/jgit/DescribeCommandIntegrationTest.java
index 58560703..2772096b 100644
--- a/src/test/java/pl/project13/core/jgit/DescribeCommandIntegrationTest.java
+++ b/src/test/java/pl/project13/core/jgit/DescribeCommandIntegrationTest.java
@@ -26,12 +26,12 @@
import java.util.Collections;
import java.util.Optional;
-import javax.annotation.Nonnull;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.ResetCommand;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
+import org.jspecify.annotations.NonNull;
import org.junit.jupiter.api.Test;
import pl.project13.log.DummyTestLoggerBridge;
import pl.project13.maven.git.AvailableGitTestRepo;
@@ -448,11 +448,11 @@ public void shouldReturnJustTheNearestTagWhenAbbrevIsZero() throws Exception {
}
}
- String abbrev(@Nonnull String id) {
+ String abbrev(@NonNull String id) {
return abbrev(id, DEFAULT_ABBREV_LEN);
}
- String abbrev(@Nonnull String id, int n) {
+ String abbrev(@NonNull String id, int n) {
return id.substring(0, n);
}
}
diff --git a/src/test/java/pl/project13/maven/git/AvailableGitTestRepo.java b/src/test/java/pl/project13/maven/git/AvailableGitTestRepo.java
index 0eb5bed3..c61c8657 100644
--- a/src/test/java/pl/project13/maven/git/AvailableGitTestRepo.java
+++ b/src/test/java/pl/project13/maven/git/AvailableGitTestRepo.java
@@ -19,7 +19,7 @@
package pl.project13.maven.git;
import java.io.File;
-import javax.annotation.Nonnull;
+import org.jspecify.annotations.NonNull;
/**
* List of available git repositories that we can use to perform tests with.
@@ -168,7 +168,7 @@ public enum AvailableGitTestRepo {
this.dir = dir;
}
- @Nonnull
+ @NonNull
public File getDir() {
return new File(dir);
}
diff --git a/src/test/java/pl/project13/maven/git/ContainsKeyCondition.java b/src/test/java/pl/project13/maven/git/ContainsKeyCondition.java
index e172a9f2..bf23b944 100644
--- a/src/test/java/pl/project13/maven/git/ContainsKeyCondition.java
+++ b/src/test/java/pl/project13/maven/git/ContainsKeyCondition.java
@@ -19,8 +19,8 @@
package pl.project13.maven.git;
import java.util.Map;
-import javax.annotation.Nonnull;
import org.assertj.core.api.Condition;
+import org.jspecify.annotations.NonNull;
class ContainsKeyCondition extends Condition