Source: openjdk-11
Version: 11.0.4+11-1
Severity: normal

OpenJDK generates several classes at build time with a copyright header that
look like this:

  /*
   * Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights 
reserved.
   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   *
   * This code is free software; you can redistribute it and/or modify it

The upper bound of the date range is generated dynamically using the current
date, which makes the file non reproducible.

It affects the reproducibility of the src.zip file installed by 
openjdk-11-source.

I'm attaching a patch fixing the two build tools involved in this issue
(EquivMapsGenerator and CopyrightHeaders).

Emmanuel Bourg
Description: Makes the generated copyright headers reproducible
Author: Emmanuel Bourg <ebo...@apache.org>
Forwarded: no
--- a/make/jdk/src/classes/build/tools/cldrconverter/CopyrightHeaders.java
+++ b/make/jdk/src/classes/build/tools/cldrconverter/CopyrightHeaders.java
@@ -26,6 +26,7 @@
 package build.tools.cldrconverter;
 
 import java.util.Calendar;
+import java.util.Date;
 import java.util.GregorianCalendar;
 import java.util.Locale;
 import java.util.TimeZone;
@@ -150,8 +151,14 @@
     }
 
     private static int getYear() {
-        return new 
GregorianCalendar(TimeZone.getTimeZone("America/Los_Angeles"),
-                                         Locale.US).get(Calendar.YEAR);
+        Date date = new Date();
+        if (System.getenv("SOURCE_DATE_EPOCH") != null) {
+            date = new Date(1000 * 
Long.valueOf(System.getenv("SOURCE_DATE_EPOCH")));
+        }
+
+        GregorianCalendar calendar = new 
GregorianCalendar(TimeZone.getTimeZone("UTC"), Locale.ENGLISH);
+        calendar.setTime(date);
+        return calendar.get(Calendar.YEAR);
     }
 
     // no instantiation
--- 
a/make/jdk/src/classes/build/tools/generatelsrequivmaps/EquivMapsGenerator.java
+++ 
b/make/jdk/src/classes/build/tools/generatelsrequivmaps/EquivMapsGenerator.java
@@ -33,9 +33,13 @@
 import java.time.ZoneId;
 import java.time.ZonedDateTime;
 import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.TimeZone;
 import java.util.TreeMap;
 
 /**
@@ -225,8 +229,15 @@
         + "}";
 
     private static String getOpenJDKCopyright() {
-        int year = ZonedDateTime.now(ZoneId
-                .of("America/Los_Angeles")).getYear();
+        Date date = new Date();
+        if (System.getenv("SOURCE_DATE_EPOCH") != null) {
+            date = new Date(1000 * 
Long.valueOf(System.getenv("SOURCE_DATE_EPOCH")));
+        }
+
+        GregorianCalendar calendar = new 
GregorianCalendar(TimeZone.getTimeZone("UTC"), Locale.ENGLISH);
+        calendar.setTime(date);
+
+        int year = calendar.get(Calendar.YEAR);
         return String.format(Locale.US, COPYRIGHT, year);
     }
 

Reply via email to