You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by hb...@apache.org on 2019/10/05 17:21:16 UTC

[maven-archiver] 01/01: MSHARED-837 add an API to configure outputTimestamp

This is an automated email from the ASF dual-hosted git repository.

hboutemy pushed a commit to branch MSHARED-837
in repository https://gitbox.apache.org/repos/asf/maven-archiver.git

commit 5f07f227aa89e0bb4163c125a46fbd4c78445301
Author: Hervé Boutemy <hb...@apache.org>
AuthorDate: Sat Oct 5 19:21:05 2019 +0200

    MSHARED-837 add an API to configure outputTimestamp
---
 pom.xml                                            |  2 +-
 .../org/apache/maven/archiver/MavenArchiver.java   | 52 ++++++++++++++++++++++
 .../apache/maven/archiver/MavenArchiverTest.java   | 18 ++++++++
 3 files changed, 71 insertions(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 56386f9..616797d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -93,7 +93,7 @@
     <dependency>
       <groupId>org.codehaus.plexus</groupId>
       <artifactId>plexus-archiver</artifactId>
-      <version>4.1.0</version>
+      <version>4.2.0-SNAPSHOT</version>
     </dependency>
     <!--
       ! plexus-archiver needs this, or else maven-artifact will
diff --git a/src/main/java/org/apache/maven/archiver/MavenArchiver.java b/src/main/java/org/apache/maven/archiver/MavenArchiver.java
index 521f5c2..82cd3a9 100644
--- a/src/main/java/org/apache/maven/archiver/MavenArchiver.java
+++ b/src/main/java/org/apache/maven/archiver/MavenArchiver.java
@@ -42,8 +42,12 @@ import org.apache.maven.shared.utils.StringUtils;
 import javax.lang.model.SourceVersion;
 import java.io.File;
 import java.io.IOException;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
@@ -758,4 +762,52 @@ public class MavenArchiver
         this.buildJdkSpecDefaultEntry = buildJdkSpecDefaultEntry;
     }
 
+    /**
+     * Parse output timestamp configured for Reproducible Builds' archive entries, formatted as ISO-8601
+     * <code>yyyy-MM-dd'T'HH:mm:ssX</code>.
+     *
+     * @param outputTimestamp the value of <code>${project.build.outputTimestamp}</code> (may be <code>null</code>)
+     * @return the parsed timestamp, may be <code>null</code> if <code>null</code> input or input contains only 1
+     *         character
+     * @since 3.4.1
+     */
+    public Date parseOutputTimestamp( String outputTimestamp )
+    {
+        if ( outputTimestamp == null || outputTimestamp.length() < 2 )
+        {
+            // no timestamp configured (1 character configuration is useful to override a full value during pom
+            // inheritance)
+            return null;
+        }
+
+        DateFormat df = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ssX" ); 
+        try
+        {
+            return df.parse( outputTimestamp );
+        }
+        catch ( ParseException pe )
+        {
+            throw new IllegalArgumentException( "Invalid project.build.outputTimestamp value '" + outputTimestamp + "'",
+                                                pe );
+        }
+    }
+
+    /**
+     * Configure Reproducible Builds archive creation if a timestamp is provided.
+     *
+     * @param outputTimestamp the value of <code>${project.build.outputTimestamp}</code> (may be <code>null</code>)
+     * @return the parsed timestamp
+     * @since 3.4.1
+     * @see #parseOutputTimestamp
+     * @see Archiver#configureReproducible
+     */
+    public Date configureReproducible( String outputTimestamp )
+    {
+        Date outputDate = parseOutputTimestamp( outputTimestamp );
+        if ( outputDate != null )
+        {
+            getArchiver().configureReproducible( outputDate );
+        }
+        return outputDate;
+    }
 }
diff --git a/src/test/java/org/apache/maven/archiver/MavenArchiverTest.java b/src/test/java/org/apache/maven/archiver/MavenArchiverTest.java
index 6e0e81e..609383a 100644
--- a/src/test/java/org/apache/maven/archiver/MavenArchiverTest.java
+++ b/src/test/java/org/apache/maven/archiver/MavenArchiverTest.java
@@ -1503,4 +1503,22 @@ public class MavenArchiverTest
         }
 
     }
+
+    @Test
+    public void testParseOutputTimestamp()
+    {
+        MavenArchiver archiver = new MavenArchiver();
+        
+        assertNull( archiver.parseOutputTimestamp( null ) );
+        assertNull( archiver.parseOutputTimestamp( "" ) );
+        assertNull( archiver.parseOutputTimestamp( "." ) );
+        assertNull( archiver.parseOutputTimestamp( " " ) );
+        assertNull( archiver.parseOutputTimestamp( "_" ) );
+
+        assertEquals( 1570300662000L, archiver.parseOutputTimestamp( "2019-10-05T18:37:42Z" ).getTime() );
+        assertEquals( 1570300662000L, archiver.parseOutputTimestamp( "2019-10-05T20:37:42+02:00" ).getTime() );
+        assertEquals( 1570300662000L, archiver.parseOutputTimestamp( "2019-10-05T16:37:42-02:00" ).getTime() );
+        assertEquals( 1570300662000L, archiver.parseOutputTimestamp( "2019-10-05T20:37:42+0200" ).getTime() );
+        assertEquals( 1570300662000L, archiver.parseOutputTimestamp( "2019-10-05T16:37:42-0200" ).getTime() );
+    }
 }