@@ -1257,4 +1257,45 @@ public String getOverrideGroupName()
1257
1257
{
1258
1258
return overrideGroupName ;
1259
1259
}
1260
+
1261
+ @ Override
1262
+ public void configureReproducible ( Date lastModifiedDate )
1263
+ {
1264
+ // 1. force last modified date
1265
+ setLastModifiedDate ( normalizeLastModifiedDate ( lastModifiedDate ) );
1266
+
1267
+ // 2. sort filenames in each directory when scanning filesystem
1268
+ setFilenameComparator ( new Comparator <String >()
1269
+ {
1270
+ @ Override
1271
+ public int compare ( String s1 , String s2 )
1272
+ {
1273
+ return s1 .compareTo ( s2 );
1274
+ }
1275
+ } );
1276
+
1277
+ // 3. ignore file/directory mode from filesystem, since they may vary based on local user umask
1278
+ // notice: this overrides execute bit on Unix (that is already ignored on Windows)
1279
+ setFileMode ( Archiver .DEFAULT_FILE_MODE );
1280
+ setDirectoryMode ( Archiver .DEFAULT_DIR_MODE );
1281
+
1282
+ // 4. ignore uid/gid from filesystem (for tar)
1283
+ setOverrideUid ( 0 );
1284
+ setOverrideUserName ( "root" ); // is it possible to avoid this, like "tar --numeric-owner"?
1285
+ setOverrideGid ( 0 );
1286
+ setOverrideGroupName ( "root" );
1287
+ }
1288
+
1289
+ /**
1290
+ * Normalize last modified time value to get reproducible archive entries, based on
1291
+ * archive binary format (tar uses UTC timestamp but zip uses local time then requires
1292
+ * tweaks to make the value reproducible whatever the current timezone is).
1293
+ *
1294
+ * @param lastModifiedDate
1295
+ * @return
1296
+ */
1297
+ protected Date normalizeLastModifiedDate ( Date lastModifiedDate )
1298
+ {
1299
+ return lastModifiedDate ;
1300
+ }
1260
1301
}
0 commit comments