diff --git a/internal/manifest/anaconda.go b/internal/manifest/anaconda.go index 0c2df4286..c49d0ab5e 100644 --- a/internal/manifest/anaconda.go +++ b/internal/manifest/anaconda.go @@ -27,6 +27,7 @@ type AnacondaPipeline struct { repos []rpmmd.RepoConfig packageSpecs []rpmmd.PackageSpec + kernelName string kernelVer string arch string product string @@ -46,12 +47,11 @@ func NewAnacondaPipeline(buildPipeline *BuildPipeline, arch, product, version string) *AnacondaPipeline { - kernelVer := rpmmd.GetVerStrFromPackageSpecListPanic(packages, kernelName) p := &AnacondaPipeline{ BasePipeline: NewBasePipeline("anaconda-tree", buildPipeline, nil), repos: repos, packageSpecs: packages, - kernelVer: kernelVer, + kernelName: kernelName, arch: arch, product: product, version: version, @@ -74,6 +74,20 @@ func (p *AnacondaPipeline) getPackageSpecs() []rpmmd.PackageSpec { return p.packageSpecs } +func (p *AnacondaPipeline) serializeStart() { + if p.kernelVer != "" { + panic("double call to serializeStart()") + } + p.kernelVer = rpmmd.GetVerStrFromPackageSpecListPanic(p.packageSpecs, p.kernelName) +} + +func (p *AnacondaPipeline) serializeEnd() { + if p.kernelVer == "" { + panic("serializeEnd() call when serialization not in progress") + } + p.kernelVer = "" +} + func (p *AnacondaPipeline) serialize() osbuild2.Pipeline { pipeline := p.BasePipeline.serialize() diff --git a/internal/manifest/manifest.go b/internal/manifest/manifest.go index 227871614..5225139a0 100644 --- a/internal/manifest/manifest.go +++ b/internal/manifest/manifest.go @@ -79,9 +79,15 @@ func (m Manifest) Serialize() (distro.Manifest, error) { } pipelines := make([]osbuild2.Pipeline, 0) + for _, pipeline := range m.pipelines { + pipeline.serializeStart() + } for _, pipeline := range m.pipelines { pipelines = append(pipelines, pipeline.serialize()) } + for _, pipeline := range m.pipelines { + pipeline.serializeEnd() + } return json.Marshal( osbuild2.Manifest{ diff --git a/internal/manifest/os.go b/internal/manifest/os.go index 5486e2620..65088df4f 100644 --- a/internal/manifest/os.go +++ b/internal/manifest/os.go @@ -92,6 +92,7 @@ type OSPipeline struct { partitionTable *disk.PartitionTable bootLoader BootLoader grubLegacy string + kernelName string kernelVer string } @@ -115,10 +116,6 @@ func NewOSPipeline(buildPipeline *BuildPipeline, if osTree { name = "ostree-tree" } - var kernelVer string - if kernelName != "" { - kernelVer = rpmmd.GetVerStrFromPackageSpecListPanic(packages, kernelName) - } p := &OSPipeline{ BasePipeline: NewBasePipeline(name, buildPipeline, nil), osTree: osTree, @@ -129,7 +126,7 @@ func NewOSPipeline(buildPipeline *BuildPipeline, partitionTable: partitionTable, bootLoader: bootLoader, grubLegacy: grubLegacy, - kernelVer: kernelVer, + kernelName: kernelName, Language: "C.UTF-8", Hostname: "localhost.localdomain", Timezone: "UTC", @@ -174,6 +171,26 @@ func (p *OSPipeline) getPackageSpecs() []rpmmd.PackageSpec { return p.packageSpecs } +func (p *OSPipeline) serializeStart() { + if p.kernelName == "" { + return + } + if p.kernelVer != "" { + panic("double call to serializeStart()") + } + p.kernelVer = rpmmd.GetVerStrFromPackageSpecListPanic(p.packageSpecs, p.kernelName) +} + +func (p *OSPipeline) serializeEnd() { + if p.kernelName == "" { + return + } + if p.kernelVer == "" { + panic("serializeEnd() call when serialization not in progress") + } + p.kernelVer = "" +} + func (p *OSPipeline) serialize() osbuild2.Pipeline { pipeline := p.BasePipeline.serialize() diff --git a/internal/manifest/pipeline.go b/internal/manifest/pipeline.go index 6831f0085..d23dbbdd2 100644 --- a/internal/manifest/pipeline.go +++ b/internal/manifest/pipeline.go @@ -15,6 +15,8 @@ type Pipeline interface { Name() string getBuildPackages() []string getPackageSetChain() []rpmmd.PackageSet + serializeStart() + serializeEnd() serialize() osbuild2.Pipeline getPackageSpecs() []rpmmd.PackageSpec getOSTreeCommits() []osTreeCommit @@ -79,6 +81,16 @@ func NewBasePipeline(name string, build *BuildPipeline, runner *string) BasePipe return p } +// serializeStart must be called exactly once before each call +// to serialize(). +func (p BasePipeline) serializeStart() { +} + +// serializeEnd must be called exactly once after each call to +// serialize(). +func (p BasePipeline) serializeEnd() { +} + // Serialize turns a given pipeline into an osbuild2.Pipeline object. This object is // meant to be treated as opaque and not to be modified further outside of the pipeline // package.