Skip to content
Open
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
38 changes: 6 additions & 32 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,12 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

<maven.version>3.8.3</maven.version>
<maven.version>3.8.8</maven.version>

<org.bouncycastle.bcpg.version>1.77</org.bouncycastle.bcpg.version>
<org.bouncycastle.bcprov.version>1.78</org.bouncycastle.bcprov.version>

<packager.version>0.21.0</packager.version>
<packager.version>0.21.1-SNAPSHOT</packager.version>
</properties>

<prerequisites>
Expand Down Expand Up @@ -113,14 +113,9 @@
</dependency>

<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcpg-jdk18on</artifactId>
<version>${org.bouncycastle.bcpg.version}</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk18on</artifactId>
<version>${org.bouncycastle.bcprov.version}</version>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.19.0</version>
</dependency>

<dependency>
Expand All @@ -130,12 +125,6 @@
<scope>provided</scope>
</dependency>

<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version>
</dependency>

<!-- EOTD -->

<dependency>
Expand All @@ -149,26 +138,11 @@

<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>32.1.2-jre</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.26.0</version>
</dependency>
<dependency>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-archiver</artifactId>
<version>4.9.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.15.1</version>
</dependency>
</dependencies>
</dependencyManagement>

Expand Down Expand Up @@ -532,7 +506,7 @@
<profile>
<id>java-10</id>
<activation>
<jdk>[1.10,</jdk>
<jdk>[1.10,)</jdk>
</activation>
<properties>
<maven.compiler.release>8</maven.compiler.release>
Expand Down
2 changes: 1 addition & 1 deletion src/it/test17-reproducible-date/verify.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ def verify() {
def result = verify()
println "Verify: " + result

def expectedMd5Sum = "cd831b22be9f30db30eb69ab35ddb3c5";
def expectedMd5Sum = "d5295483d055f6fe9d19b2c36490a997";
def md5sum = generateMD5(new File(basedir, "target/test17-1.0.0-0.200901011100.noarch.rpm"))
if (md5sum != expectedMd5Sum) {
System.out.format("RPM MD5 doesn't match - actual: %s, expected: %s%n", md5sum, expectedMd5Sum);
Expand Down
2 changes: 1 addition & 1 deletion src/it/test17-reproducible-epoch/verify.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ def verify() {
def result = verify()
println "Verify: " + result

def expectedMd5Sum = "6fc07068db044f8f73a8e6ecb01256ce";
def expectedMd5Sum = "d5e4e3cfd001f5d7a71ac6ab10744be8";
def md5sum = generateMD5(new File(basedir, "target/test17-1.0.0-0.197001010000.noarch.rpm"))
if (md5sum != expectedMd5Sum) {
System.out.format("RPM MD5 doesn't match - actual: %s, expected: %s%n", md5sum, expectedMd5Sum);
Expand Down
89 changes: 89 additions & 0 deletions src/it/test20-payload/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>de.dentrassi.maven.rpm.test</groupId>
<artifactId>test20</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>

<name>Test Package #20</name>
<description>
Test explicitly setting payload coding and payload flags
</description>

<url>http://dentrassi.de</url>

<organization>
<name>Jens Reimann</name>
<url>http://dentrassi.de</url>
</organization>

<licenses>
<license>
<name>Eclipse Public License - v 1.0</name>
<distribution>repo</distribution>
<url>https://www.eclipse.org/legal/epl-v10.html</url>
</license>
</licenses>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<skipSigning>true</skipSigning>
<!-- use a predictable timestamp -->
<project.build.outputTimestamp>2025-04-16T16:25:26.470Z</project.build.outputTimestamp>
</properties>

<build>

<plugins>
<plugin>
<groupId>de.dentrassi.maven</groupId>
<artifactId>rpm</artifactId>
<version>@project.version@</version>
<executions>
<execution>
<goals>
<goal>rpm</goal>
</goals>
<configuration>
<outputFileName>test20.rpm</outputFileName>
<attach>false</attach>
<group>Application/Misc</group>

<signature>
<keyId>${keyId}</keyId>
<keyringFile>${user.home}/.gnupg/secring.gpg</keyringFile>
<passphrase>${passphrase}</passphrase>
<hashAlgorithm>SHA1</hashAlgorithm>
<skip>${skipSigning}</skip>
</signature>

<payloadFlags>
<coding>Zstd</coding>
<level>19</level>
<threads>0</threads>
<windowLog>23</windowLog>
</payloadFlags>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>

<profiles>
<profile>
<id>sign</id>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
<properties>
<skipSigning>false</skipSigning>
</properties>
</profile>
</profiles>

</project>
16 changes: 16 additions & 0 deletions src/it/test20-payload/verify.groovy
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
def verifyPayload() {
Process proc = ['rpm', '-q', '--queryformat', '%{PAYLOADCOMPRESSOR} %{PAYLOADFLAGS}\n', basedir.toString().replace(File.separator, "/") + '/target/test20.rpm'].execute()
proc.waitFor()
return proc.in.getText().trim()
}

def actual = verifyPayload()
println "Verify payload:\n" + actual
def expected = "zstd 19T0L23"

if (actual != expected) {
System.out.format("RPM payloads don't match - actual:%n%s%nexpected:%n%s%n", actual, expected);
return false;
}

return true;
41 changes: 40 additions & 1 deletion src/main/java/de/dentrassi/rpm/builder/RpmMojo.java
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,8 @@
import org.eclipse.packager.rpm.build.*;
import org.eclipse.packager.rpm.build.RpmBuilder.PackageInformation;
import org.eclipse.packager.rpm.build.RpmBuilder.Version;
import org.eclipse.packager.rpm.coding.PayloadCoding;
import org.eclipse.packager.rpm.coding.PayloadFlags;
import org.eclipse.packager.rpm.deps.RpmDependencyFlags;
import org.eclipse.packager.rpm.signature.RsaHeaderSignatureProcessor;
import org.eclipse.packager.rpm.signature.RsaSignatureProcessor;
Expand All @@ -85,6 +87,10 @@
*/
@Mojo(name = "rpm", defaultPhase = LifecyclePhase.PACKAGE, requiresProject = true, threadSafe = true)
public class RpmMojo extends AbstractMojo {
private static final PayloadCoding DEFAULT_PAYLOAD_CODING = PayloadCoding.gzip;

private static final String DEFAULT_PAYLOAD_FLAGS = "9";

private static final String SNAPSHOT_SUFFIX = "-SNAPSHOT";

/**
Expand Down Expand Up @@ -601,6 +607,19 @@ public void setGenerateDefaultSourcePackage(final boolean generateDefaultSourceP
@Parameter(property = "rpm.signature")
Signature signature;

/**
* Optional payload flags to use for compressing the payload of the final RPM.
* <p>
* The coding must be one of the names returned by {@link PayloadCoding#values()}.
* The default coding is {@link PayloadCoding#gzip}.
* The level must be a number.
* The default level is {@code 9}.
* <p>
* Also see <a href="payload_compression.html">Payload compression</a>
*/
@Parameter(property = "rpm.payloadFlags")
PayloadFlags payloadFlags;

/**
* Disable the mojo altogether.
*
Expand Down Expand Up @@ -842,10 +861,30 @@ public void execute() throws MojoExecutionException, MojoFailureException {
testLeadFlags();

final BuilderOptions options = new BuilderOptions();
DigestAlgorithm fileDigestAlgorithm = evalDigestAlgorithm(this.fileDigestAlgorithm);
final DigestAlgorithm fileDigestAlgorithm = evalDigestAlgorithm(this.fileDigestAlgorithm);
this.logger.info("File Digest Algorithm: %s", fileDigestAlgorithm.getAlgorithm());
options.setFileDigestAlgorithm(fileDigestAlgorithm);

final PayloadCoding payloadCoding;
if (this.payloadFlags.getCoding() != null) {
payloadCoding = PayloadCoding.valueOf(this.payloadFlags.getCoding());
this.logger.info("Payload Coding: %s", payloadCoding);
} else {
payloadCoding = DEFAULT_PAYLOAD_CODING;
this.logger.info("Using default Payload Coding: %s", payloadCoding);
}

options.setPayloadCoding(payloadCoding);

if (this.payloadFlags != null && !this.payloadFlags.toString().isEmpty()) {
this.logger.info("Payload Flags: %s", this.payloadFlags);
} else {
this.payloadFlags = new PayloadFlags(payloadCoding, DEFAULT_PAYLOAD_FLAGS);
this.logger.info("Using default Payload Flags: %s", this.payloadFlags);
}

options.setPayloadFlags(this.payloadFlags);

// setup basic signature processors

final SignatureConfiguration provider;
Expand Down
37 changes: 11 additions & 26 deletions src/main/java/de/dentrassi/rpm/builder/RpmUnpackMojo.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import java.nio.file.attribute.UserPrincipalLookupService;
import java.nio.file.attribute.UserPrincipalNotFoundException;
import java.util.EnumSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Pattern;

Expand Down Expand Up @@ -383,41 +384,25 @@ private void setFileOwnership(final InputHeader<RpmTag> payloadHeader,
}

private static String getName(final InputHeader<RpmTag> payloadHeader, final RpmTag tag, final long id) {
final Object values =
payloadHeader.getEntry(tag)
.orElseThrow(() -> new IllegalStateException("RPM lacks " + tag + " lookup table"))
.getValue();

if (!(values instanceof String[])) {
throw new IllegalStateException("RPM " + tag + " header is not a list of Strings, got " +
values.getClass());
}
final List<String> names = payloadHeader.getStringList(tag);
final int size = names.size();

final String[] names = (String[]) values;
if (id < 0 || names.length <= id) {
throw new IllegalArgumentException("id out of range [0," + names.length + ']');
if (id < 0 || size <= id) {
throw new IllegalArgumentException("id out of range [0," + size + ']');
}

return names[(int) id];
return names.get((int) id);
}

private static String getLinkTarget(final InputHeader<RpmTag> payloadHeader, final long inode) {
final Object values =
payloadHeader.getEntry(RpmTag.FILE_LINKTO)
.orElseThrow(() ->
new IllegalStateException("RPM contains symbolic link, but lacks linkTo header"))
.getValue();

if (!(values instanceof String[])) {
throw new IllegalStateException("RPM linkTo header is not a list of Strings, got " + values.getClass());
}
final List<String> linkTo = payloadHeader.getStringList(RpmTag.FILE_LINKTO);
final int size = linkTo.size();

final String[] linkTo = (String[]) values;
if (inode < 0 || linkTo.length <= inode) {
throw new IllegalArgumentException("Symbolic link inode out of range [0," + linkTo.length + ']');
if (inode < 0 || size <= inode) {
throw new IllegalArgumentException("Symbolic link inode out of range [0," + size + ']');
}

return linkTo[(int) inode];
return linkTo.get((int) inode);
}

public void setRpmFile(final File rpmFile) {
Expand Down
Loading
Loading