File use-changelog-date-as-pom.properties-timestamp.patch of Package maven-plugin-bundle

commit 7ece2fe5f74f89acfaa7df46024025f9b5804a99
Author: Bernhard M. Wiedemann <bwiedemann@suse.de>
Date:   Thu Nov 14 14:28:14 2019 +0100

    [maven-release-plugin] Allow to override build date with SOURCE_DATE_EPOCH
    
    in order to make builds reproducible.
    See https://reproducible-builds.org/ for why this is good
    and https://reproducible-builds.org/specs/source-date-epoch/
    for the definition of this variable.
    
    Based on https://salsa.debian.org/java-team/maven-bundle-plugin/blob/master/debian/patches/use-changelog-date-as-pom.properties-timestamp.patch
    by Emmanuel Bourg <ebourg@apache.org>

diff --git a/tools/maven-bundle-plugin/src/main/java/org/apache/felix/bundleplugin/BundlePlugin.java b/tools/maven-bundle-plugin/src/main/java/org/apache/felix/bundleplugin/BundlePlugin.java
index b0dac50b7..8326bde85 100644
--- a/tools/maven-bundle-plugin/src/main/java/org/apache/felix/bundleplugin/BundlePlugin.java
+++ b/tools/maven-bundle-plugin/src/main/java/org/apache/felix/bundleplugin/BundlePlugin.java
@@ -32,6 +32,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Date;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -1561,6 +1562,19 @@ public class BundlePlugin extends AbstractMojo
     }
 
 
+    private static Date getReproducibleBuildDate() {
+        String envVariable = System.getenv("SOURCE_DATE_EPOCH");
+        if (envVariable == null) {
+            return null;
+        }
+        try {
+            return new Date(Long.parseLong(envVariable)*1000);
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+
     /**
      * @param jar
      * @throws IOException
@@ -1579,7 +1593,8 @@ public class BundlePlugin extends AbstractMojo
             jar.putResource( path + "/pom.xml", new FileResource( pomFile ) );
         }
 
-        Properties p = new Properties();
+        java.util.Date buildDate = getReproducibleBuildDate();
+        Properties p = buildDate == null ? new Properties() : new TimestampedProperties(buildDate);
         p.put( "version", currentProject.getVersion() );
         p.put( "groupId", currentProject.getGroupId() );
         p.put( "artifactId", currentProject.getArtifactId() );
diff --git a/tools/maven-bundle-plugin/src/main/java/org/apache/felix/bundleplugin/TimestampedProperties.java b/tools/maven-bundle-plugin/src/main/java/org/apache/felix/bundleplugin/TimestampedProperties.java
new file mode 100644
index 000000000..d30ac2e91
--- /dev/null
+++ b/tools/maven-bundle-plugin/src/main/java/org/apache/felix/bundleplugin/TimestampedProperties.java
@@ -0,0 +1,48 @@
+package org.apache.felix.bundleplugin;
+
+import java.io.*;
+import java.text.*;
+import java.util.*;
+import java.util.regex.*;
+
+/**
+ * Properties file timestamped with a specified date.
+ */
+class TimestampedProperties extends Properties
+{
+    private Date date;
+
+    public TimestampedProperties(Date date) {
+        this.date = date;
+    }
+
+    @Override
+    public void store(OutputStream out, String comments) throws IOException {
+        store(new OutputStreamWriter(out, "ISO-8859-1"), comments);
+    }
+
+    @Override
+    public void store(Writer out, String comments) throws IOException {
+        // store the properties file in memory
+        StringWriter buffer = new StringWriter();
+        super.store(buffer, comments);
+
+        // Replace the date on the second line of the file
+        SimpleDateFormat fmt = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.ENGLISH);
+        fmt.setTimeZone(TimeZone.getTimeZone("UTC"));
+        String[] lines = buffer.toString().split(Pattern.quote(System.getProperty("line.separator")));
+        lines[1] = "#" + fmt.format(date);
+
+        // write the file
+        BufferedWriter writer = new BufferedWriter(out);
+        try {
+            for (String line : lines) {
+                writer.write(line);
+                writer.newLine();
+            }
+            writer.flush();
+        } finally {
+            writer.close();
+        }
+    }
+}
openSUSE Build Service is sponsored by