diff --git a/internal/rpmmd/metadata.go b/internal/rpmmd/metadata.go index fd7073020..e0bfd9820 100644 --- a/internal/rpmmd/metadata.go +++ b/internal/rpmmd/metadata.go @@ -1,6 +1,8 @@ package rpmmd import ( + "fmt" + osbuild "github.com/osbuild/osbuild-composer/internal/osbuild2" ) @@ -15,6 +17,15 @@ type RPM struct { Signature *string `json:"signature"` } +// NEVRA string for the package +func (r RPM) String() string { + epoch := "" + if r.Epoch != nil { + epoch = *r.Epoch + ":" + } + return fmt.Sprintf("%s-%s%s-%s.%s", r.Name, epoch, r.Version, r.Release, r.Arch) +} + func OSBuildMetadataToRPMs(stagesMetadata map[string]osbuild.StageMetadata) []RPM { rpms := make([]RPM, 0) for _, md := range stagesMetadata { @@ -47,3 +58,17 @@ func PackageMetadataToSignature(pkg osbuild.RPMPackageMetadata) *string { } return nil } + +// Deduplicate a list of RPMs based on NEVRA string +func DeduplicateRPMs(rpms []RPM) []RPM { + rpmMap := make(map[string]struct{}, len(rpms)) + uniqueRPMs := make([]RPM, 0, len(rpms)) + + for _, rpm := range rpms { + if _, added := rpmMap[rpm.String()]; !added { + rpmMap[rpm.String()] = struct{}{} + uniqueRPMs = append(uniqueRPMs, rpm) + } + } + return uniqueRPMs +}