Skip to content

Commit bb08ccc

Browse files
committed
added configureReproducible( int sourceDateEpoch ) API
1 parent e42b62e commit bb08ccc

File tree

6 files changed

+74
-0
lines changed

6 files changed

+74
-0
lines changed

src/main/java/org/codehaus/plexus/archiver/AbstractArchiver.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.lang.reflect.UndeclaredThrowableException;
2323
import java.nio.charset.Charset;
2424
import java.util.ArrayList;
25+
import java.util.Calendar;
2526
import java.util.Comparator;
2627
import java.util.Date;
2728
import java.util.HashMap;
@@ -1257,4 +1258,31 @@ public String getOverrideGroupName()
12571258
{
12581259
return overrideGroupName;
12591260
}
1261+
1262+
@Override
1263+
public void configureReproducible( int sourceDateEpoch )
1264+
{
1265+
// 1. force last modified date
1266+
setLastModifiedDate( convertSourceDateEpochToDate( sourceDateEpoch ) );
1267+
1268+
// 2. sort filenames in each directory when scanning filesystem
1269+
setFilenameComparator( new Comparator<String>()
1270+
{
1271+
@Override
1272+
public int compare( String s1, String s2 )
1273+
{
1274+
return s1.compareTo( s2 );
1275+
}
1276+
} );
1277+
1278+
// 3. ignore file/directory mode from filesystem, since they may vary based on local user umask
1279+
// notice: this overrides execute bit on Unix (that is already ignored on Windows)
1280+
setFileMode( Archiver.DEFAULT_FILE_MODE );
1281+
setDirectoryMode( Archiver.DEFAULT_DIR_MODE );
1282+
}
1283+
1284+
protected Date convertSourceDateEpochToDate( int sourceDateEpoch )
1285+
{
1286+
return new Date( sourceDateEpoch * 1000L );
1287+
}
12601288
}

src/main/java/org/codehaus/plexus/archiver/Archiver.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,11 +415,15 @@ ResourceIterator getResources()
415415
Date getLastModifiedDate();
416416

417417
/**
418+
* Set filename comparator, used to sort file entries when scanning directories since File.list() does not
419+
* guarantee any order.
420+
*
418421
* @since 4.2.0
419422
*/
420423
void setFilenameComparator( Comparator<String> filenameComparator );
421424

422425
/**
426+
<<<<<<< reproducible
423427
* @since 4.2.0
424428
*/
425429
void setOverrideUid( int uid );
@@ -458,4 +462,17 @@ ResourceIterator getResources()
458462
* @since 4.2.0
459463
*/
460464
String getOverrideGroupName();
465+
466+
/**
467+
* Configure the archiver to get reproducible archives (see <a href="https://reproducible-builds.org/>Reproducible
468+
* Builds</a>). This will require reproducible archive entries order, defined entries timestamp and reproducible
469+
* entries Unix mode.
470+
*
471+
* @param sourceDateEpoch Value like SOURCE_DATE_EPOCH as
472+
* <a href="https://reproducible-builds.org/specs/source-date-epoch/">defined in Reproducible Builds</a>:
473+
* a UNIX timestamp, defined as the number of seconds, excluding leap seconds, since 01 Jan 1970 00:00:00
474+
* UTC.
475+
* @since 4.2.0
476+
*/
477+
void configureReproducible( int sourceDateEpoch );
461478
}

src/main/java/org/codehaus/plexus/archiver/diags/DelgatingArchiver.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,4 +398,11 @@ public String getOverrideGroupName()
398398
{
399399
return target.getOverrideGroupName();
400400
}
401+
402+
@Override
403+
public void configureReproducible( int sourceDateEpoch )
404+
{
405+
target.configureReproducible( sourceDateEpoch );
406+
}
407+
401408
}

src/main/java/org/codehaus/plexus/archiver/diags/NoOpArchiver.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,4 +414,10 @@ public String getOverrideGroupName()
414414
return null;
415415
}
416416

417+
@Override
418+
public void configureReproducible( int sourceDateEpoch )
419+
{
420+
421+
}
422+
417423
}

src/main/java/org/codehaus/plexus/archiver/diags/TrackingArchiver.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -468,4 +468,9 @@ public String getOverrideGroupName()
468468
{
469469
return null;
470470
}
471+
472+
@Override
473+
public void configureReproducible( int sourceDateEpoch )
474+
{
475+
}
471476
}

src/main/java/org/codehaus/plexus/archiver/zip/AbstractZipArchiver.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
import java.io.OutputStream;
2525
import java.nio.ByteBuffer;
2626
import java.nio.charset.Charset;
27+
import java.util.Calendar;
28+
import java.util.Date;
2729
import java.util.Hashtable;
2830
import java.util.Stack;
2931
import java.util.concurrent.ExecutionException;
@@ -833,4 +835,13 @@ protected String getArchiveType()
833835
return archiveType;
834836
}
835837

838+
@Override
839+
protected Date convertSourceDateEpochToDate( int sourceDateEpoch )
840+
{
841+
// timestamp of zip entries at zip storage level ignores timezone: see https://github.com/Stuk/jszip/issues/369
842+
Calendar cal = Calendar.getInstance();
843+
long zipTime = 1000L * sourceDateEpoch - ( cal.get( Calendar.ZONE_OFFSET ) + cal.get( Calendar.DST_OFFSET ) );
844+
return new Date( zipTime );
845+
}
846+
836847
}

0 commit comments

Comments
 (0)