Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@

<assertj.version>3.25.3</assertj.version>
<bouncycastle.version>1.78</bouncycastle.version>
<commons-compress.version>1.26.1</commons-compress.version>
<commons-compress.version>1.28.0</commons-compress.version>
<commons-codec.version>1.16.1</commons-codec.version>
<guava.version>33.1.0-jre</guava.version>
<junit.jupiter.version>5.10.2</junit.jupiter.version>
Expand Down
8 changes: 3 additions & 5 deletions rpm/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -36,21 +36,19 @@
<groupId>org.tukaani</groupId>
<artifactId>xz</artifactId>
</dependency>
<!-- enable to have Zstd support on local runs
<!-- enable to have Zstd support on local runs -->
<dependency>
<groupId>com.github.luben</groupId>
<artifactId>zstd-jni</artifactId>
<version>1.5.2-5</version>
<optional>true</optional>
<version>1.5.7-2</version>
<scope>test</scope>
</dependency>
-->
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
<!-- show log output during tests using logback as the slf4j backend. -->
<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import java.util.List;

import org.eclipse.packager.rpm.coding.PayloadCoding;
import org.eclipse.packager.rpm.coding.PayloadFlags;

/**
* Options which control the build process of the {@link RpmBuilder}
Expand All @@ -33,6 +34,11 @@
* </p>
*/
public class BuilderOptions {
private static final PayloadCoding DEFAULT_PAYLOAD_CODING = PayloadCoding.GZIP;

private static final PayloadFlags DEFAULT_PAYLOAD_FLAGS = new PayloadFlags(DEFAULT_PAYLOAD_CODING, 9);


private LongMode longMode = LongMode.DEFAULT;

private OpenOption[] openOptions;
Expand All @@ -41,7 +47,7 @@ public class BuilderOptions {

private PayloadCoding payloadCoding;

private String payloadFlags;
private PayloadFlags payloadFlags;

private DigestAlgorithm fileDigestAlgorithm = DigestAlgorithm.MD5;

Expand Down Expand Up @@ -98,18 +104,18 @@ public void setFileNameProvider(final RpmFileNameProvider fileNameProvider) {
}

public PayloadCoding getPayloadCoding() {
return this.payloadCoding != null ? this.payloadCoding : PayloadCoding.GZIP;
return this.payloadCoding != null ? this.payloadCoding : DEFAULT_PAYLOAD_CODING;
}

public void setPayloadCoding(final PayloadCoding payloadCoding) {
this.payloadCoding = payloadCoding;
}

public String getPayloadFlags() {
return this.payloadFlags;
public PayloadFlags getPayloadFlags() {
return (this.payloadFlags == null && this.payloadCoding == DEFAULT_PAYLOAD_CODING) ? DEFAULT_PAYLOAD_FLAGS : this.payloadFlags;
}

public void setPayloadFlags(final String payloadFlags) {
public void setPayloadFlags(final PayloadFlags payloadFlags) {
this.payloadFlags = payloadFlags;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

import org.eclipse.packager.rpm.RpmTag;
import org.eclipse.packager.rpm.coding.PayloadCoding;
import org.eclipse.packager.rpm.coding.PayloadFlags;
import org.eclipse.packager.rpm.header.Header;

public interface PayloadProvider {
Expand Down Expand Up @@ -61,7 +62,7 @@ public interface PayloadProvider {
*
* @return the compression flags for this compressed archive file, if any
*/
Optional<String> getPayloadFlags();
PayloadFlags getPayloadFlags();

/**
* The algorithm used for generating file checksum digests whose ordinal is
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,15 +39,19 @@
import org.apache.commons.compress.archivers.cpio.CpioArchiveEntry;
import org.apache.commons.compress.archivers.cpio.CpioArchiveOutputStream;
import org.apache.commons.compress.archivers.cpio.CpioConstants;
import org.apache.commons.compress.utils.CharsetNames;
import org.eclipse.packager.rpm.RpmTag;
import org.eclipse.packager.rpm.coding.PayloadCoding;
import org.eclipse.packager.rpm.coding.PayloadFlags;
import org.eclipse.packager.rpm.header.Header;

import com.google.common.io.ByteStreams;
import com.google.common.io.CountingOutputStream;

public class PayloadRecorder implements AutoCloseable {
private static final PayloadCoding DEFAULT_PAYLOAD_CODING = PayloadCoding.GZIP;

private static final PayloadFlags DEFAULT_PAYLOAD_FLAGS = new PayloadFlags(DEFAULT_PAYLOAD_CODING, 9);

public static class Result {
private final long size;

Expand Down Expand Up @@ -100,10 +104,10 @@ public void write(byte[] b, int off, int len) throws IOException {
private Finished finished;

public PayloadRecorder() throws IOException {
this(PayloadCoding.GZIP, null, DigestAlgorithm.MD5, null);
this(DEFAULT_PAYLOAD_CODING, DEFAULT_PAYLOAD_FLAGS, DigestAlgorithm.MD5, null);
}

public PayloadRecorder(final PayloadCoding payloadCoding, final String payloadFlags, final DigestAlgorithm fileDigestAlgorithm, final List<PayloadProcessor> processors) throws IOException {
public PayloadRecorder(final PayloadCoding payloadCoding, final PayloadFlags payloadFlags, final DigestAlgorithm fileDigestAlgorithm, final List<PayloadProcessor> processors) throws IOException {
this.fileDigestAlgorithm = fileDigestAlgorithm;
if (processors == null) {
this.processors = Collections.emptyList();
Expand Down Expand Up @@ -329,25 +333,24 @@ public class Finished implements AutoCloseable, PayloadProvider {

private final PayloadCoding payloadCoding;

private final Optional<String> payloadFlags;
private final PayloadFlags payloadFlags;

private Header<RpmTag> additionalHeader = new Header<>();

private Finished(final PayloadCoding payloadCoding, final String payloadFlags) throws IOException {
private Finished(final PayloadCoding payloadCoding, final PayloadFlags payloadFlags) throws IOException {
this.tempFile = Files.createTempFile("rpm-", null);

try {
final OutputStream fileStream = new BufferedOutputStream(Files.newOutputStream(this.tempFile, StandardOpenOption.WRITE, StandardOpenOption.TRUNCATE_EXISTING));
this.payloadCounter = new CountingOutputStream(new ProcessorStream(fileStream, PayloadRecorder.this::forEachCompressedData));
this.payloadCoding = payloadCoding;
this.payloadFlags = Optional.ofNullable(payloadFlags);

final OutputStream payloadStream = new ProcessorStream(this.payloadCoding.createProvider().createOutputStream(this.payloadCounter, this.payloadFlags), PayloadRecorder.this::forEachRawData);
this.payloadFlags = payloadFlags;
final OutputStream payloadStream = new ProcessorStream(this.payloadCoding.createProvider().createOutputStream(this.payloadCounter, Optional.ofNullable(this.payloadFlags)), PayloadRecorder.this::forEachRawData);
this.archiveCounter = new CountingOutputStream(payloadStream);

// setup archive stream

this.archiveStream = new CpioArchiveOutputStream(this.archiveCounter, CpioConstants.FORMAT_NEW, 4, CharsetNames.UTF_8);
this.archiveStream = new CpioArchiveOutputStream(this.archiveCounter, CpioConstants.FORMAT_NEW, 4, StandardCharsets.UTF_8.name());
} catch (final IOException e) {
Files.deleteIfExists(this.tempFile);
throw e;
Expand Down Expand Up @@ -376,7 +379,7 @@ public PayloadCoding getPayloadCoding() {
}

@Override
public Optional<String> getPayloadFlags() {
public PayloadFlags getPayloadFlags() {
return this.payloadFlags;
}

Expand Down
14 changes: 10 additions & 4 deletions rpm/src/main/java/org/eclipse/packager/rpm/build/RpmBuilder.java
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@
import org.eclipse.packager.rpm.Rpms;
import org.eclipse.packager.rpm.VerifyFlags;
import org.eclipse.packager.rpm.build.PayloadRecorder.Result;
import org.eclipse.packager.rpm.coding.PayloadCoding;
import org.eclipse.packager.rpm.coding.PayloadFlags;
import org.eclipse.packager.rpm.deps.Dependencies;
import org.eclipse.packager.rpm.deps.Dependency;
import org.eclipse.packager.rpm.deps.RpmDependencyFlags;
Expand Down Expand Up @@ -716,12 +718,16 @@ private void fillProvides() {
private void fillHeader(final PayloadRecorder.Finished finished) {
this.header.putString(RpmTag.PAYLOAD_FORMAT, "cpio");

if (finished.getPayloadCoding() != null) {
this.header.putString(RpmTag.PAYLOAD_CODING, finished.getPayloadCoding().getValue());
final PayloadCoding payloadCoding = finished.getPayloadCoding();

if (payloadCoding != PayloadCoding.NONE) {
this.header.putString(RpmTag.PAYLOAD_CODING, payloadCoding.toString());
}

if (finished.getPayloadFlags().isPresent()) {
this.header.putString(RpmTag.PAYLOAD_FLAGS, finished.getPayloadFlags().get());
final PayloadFlags payloadFlags = finished.getPayloadFlags();

if (payloadFlags != null) {
this.header.putString(RpmTag.PAYLOAD_FLAGS, payloadFlags.toString());
}

this.header.putStringArray(100, "C");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@
import org.eclipse.packager.rpm.deps.Dependency;
import org.eclipse.packager.rpm.deps.RpmDependencyFlags;

import static org.apache.commons.compress.compressors.bzip2.BZip2CompressorOutputStream.MAX_BLOCKSIZE;
import static org.apache.commons.compress.compressors.bzip2.BZip2CompressorOutputStream.MIN_BLOCKSIZE;
import static org.eclipse.packager.rpm.coding.PayloadFlags.getLevel;

public class BZip2PayloadCoding implements PayloadCodingProvider {
protected BZip2PayloadCoding() {
}
Expand All @@ -44,17 +48,11 @@ public InputStream createInputStream(final InputStream in) throws IOException {
}

@Override
public OutputStream createOutputStream(final OutputStream out, final Optional<String> optionalFlags) throws IOException {
final String flags;

final int blockSize;

if (optionalFlags.isPresent() && (flags = optionalFlags.get()).length() > 0) {
blockSize = Integer.parseInt(flags.substring(0, 1));
} else {
blockSize = BZip2CompressorOutputStream.MAX_BLOCKSIZE;
}
public OutputStream createOutputStream(final OutputStream out, final Optional<PayloadFlags> optionalPayloadFlags) throws IOException {
final boolean smallMode = optionalPayloadFlags.map(PayloadFlags::getSmallMode).orElse(false);

final int level = getLevel(optionalPayloadFlags, MIN_BLOCKSIZE, MAX_BLOCKSIZE, MAX_BLOCKSIZE);
final int blockSize = (!smallMode || level <= 2) ? level : 2;
return new BZip2CompressorOutputStream(out, blockSize);
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,16 @@
import java.io.OutputStream;
import java.util.Optional;
import java.util.function.Consumer;
import java.util.zip.Deflater;

import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream;
import org.apache.commons.compress.compressors.gzip.GzipParameters;
import org.eclipse.packager.rpm.deps.Dependency;

import static java.util.zip.Deflater.BEST_COMPRESSION;
import static java.util.zip.Deflater.DEFAULT_COMPRESSION;
import static org.eclipse.packager.rpm.coding.PayloadFlags.getLevel;

public class GzipPayloadCoding implements PayloadCodingProvider {
protected GzipPayloadCoding() {
}
Expand All @@ -44,20 +47,10 @@ public InputStream createInputStream(final InputStream in) throws IOException {
}

@Override
public OutputStream createOutputStream(final OutputStream out, final Optional<String> optionalFlags) throws IOException {
final String flags;
final int compressionLevel;

if (optionalFlags.isPresent() && (flags = optionalFlags.get()).length() > 0) {
compressionLevel = Integer.parseInt(flags.substring(0, 1));
} else {
compressionLevel = Deflater.BEST_COMPRESSION;
}

public OutputStream createOutputStream(final OutputStream out, final Optional<PayloadFlags> optionalPayloadFlags) throws IOException {
final int level = getLevel(optionalPayloadFlags, DEFAULT_COMPRESSION, BEST_COMPRESSION, DEFAULT_COMPRESSION);
final GzipParameters parameters = new GzipParameters();

parameters.setCompressionLevel(compressionLevel);

parameters.setCompressionLevel(level);
return new GzipCompressorOutputStream(out, parameters);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,12 @@
import org.apache.commons.compress.compressors.lzma.LZMACompressorOutputStream;
import org.eclipse.packager.rpm.deps.Dependency;
import org.eclipse.packager.rpm.deps.RpmDependencyFlags;
import org.tukaani.xz.LZMA2Options;

import static org.eclipse.packager.rpm.coding.PayloadFlags.getLevel;
import static org.tukaani.xz.LZMA2Options.PRESET_DEFAULT;
import static org.tukaani.xz.LZMA2Options.PRESET_MAX;
import static org.tukaani.xz.LZMA2Options.PRESET_MIN;

public class LZMAPayloadCoding implements PayloadCodingProvider {
protected LZMAPayloadCoding() {
Expand All @@ -44,7 +50,8 @@ public InputStream createInputStream(final InputStream in) throws IOException {
}

@Override
public OutputStream createOutputStream(final OutputStream out, final Optional<String> optionalFlags) throws IOException {
return new LZMACompressorOutputStream(out);
public OutputStream createOutputStream(final OutputStream out, final Optional<PayloadFlags> optionalPayloadFlags) throws IOException {
final int preset = getLevel(optionalPayloadFlags, PRESET_MIN, PRESET_MAX, PRESET_DEFAULT);
return new LZMACompressorOutputStream.Builder().setOutputStream(out).setLzma2Options(new LZMA2Options(preset)).get();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@

package org.eclipse.packager.rpm.coding;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Optional;
Expand All @@ -32,15 +31,16 @@ public String getCoding() {

@Override
public void fillRequirements(final Consumer<Dependency> requirementsConsumer) {

}

@Override
public InputStream createInputStream(final InputStream in) throws IOException {
public InputStream createInputStream(final InputStream in) {
return in;
}

@Override
public OutputStream createOutputStream(final OutputStream out, final Optional<String> optionalFlags) throws IOException {
public OutputStream createOutputStream(final OutputStream out, final Optional<PayloadFlags> optionalPayloadFlags) {
return out;
}
}
Loading