mirror of
https://github.com/containers/skopeo.git
synced 2025-09-16 23:09:01 +00:00
fix(deps): update module github.com/containers/image/v5 to v5.32.0
Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
This commit is contained in:
81
vendor/github.com/sylabs/sif/v2/pkg/sif/add.go
generated
vendored
Normal file
81
vendor/github.com/sylabs/sif/v2/pkg/sif/add.go
generated
vendored
Normal file
@@ -0,0 +1,81 @@
|
||||
// Copyright (c) 2018-2023, Sylabs Inc. All rights reserved.
|
||||
// Copyright (c) 2017, SingularityWare, LLC. All rights reserved.
|
||||
// Copyright (c) 2017, Yannick Cote <yhcote@gmail.com> All rights reserved.
|
||||
// This software is licensed under a 3-clause BSD license. Please consult the
|
||||
// LICENSE file distributed with the sources of this project regarding your
|
||||
// rights to use or distribute this software.
|
||||
|
||||
package sif
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
)
|
||||
|
||||
// addOpts accumulates object add options.
|
||||
type addOpts struct {
|
||||
t time.Time
|
||||
}
|
||||
|
||||
// AddOpt are used to specify object add options.
|
||||
type AddOpt func(*addOpts) error
|
||||
|
||||
// OptAddDeterministic sets header/descriptor fields to values that support deterministic
|
||||
// modification of images.
|
||||
func OptAddDeterministic() AddOpt {
|
||||
return func(ao *addOpts) error {
|
||||
ao.t = time.Time{}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// OptAddWithTime specifies t as the image modification time.
|
||||
func OptAddWithTime(t time.Time) AddOpt {
|
||||
return func(ao *addOpts) error {
|
||||
ao.t = t
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// AddObject adds a new data object and its descriptor into the specified SIF file.
|
||||
//
|
||||
// By default, the image modification time is set to the current time for non-deterministic images,
|
||||
// and unset otherwise. To override this, consider using OptAddDeterministic or OptAddWithTime.
|
||||
func (f *FileImage) AddObject(di DescriptorInput, opts ...AddOpt) error {
|
||||
ao := addOpts{}
|
||||
|
||||
if !f.isDeterministic() {
|
||||
ao.t = time.Now()
|
||||
}
|
||||
|
||||
for _, opt := range opts {
|
||||
if err := opt(&ao); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
}
|
||||
|
||||
// Find an unused descriptor.
|
||||
i := 0
|
||||
for _, rd := range f.rds {
|
||||
if !rd.Used {
|
||||
break
|
||||
}
|
||||
i++
|
||||
}
|
||||
|
||||
if err := f.writeDataObject(i, di, ao.t); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
if err := f.writeDescriptors(); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
f.h.ModifiedAt = ao.t.Unix()
|
||||
|
||||
if err := f.writeHeader(); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
394
vendor/github.com/sylabs/sif/v2/pkg/sif/create.go
generated
vendored
394
vendor/github.com/sylabs/sif/v2/pkg/sif/create.go
generated
vendored
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2018-2023, Sylabs Inc. All rights reserved.
|
||||
// Copyright (c) 2018-2024, Sylabs Inc. All rights reserved.
|
||||
// Copyright (c) 2017, SingularityWare, LLC. All rights reserved.
|
||||
// Copyright (c) 2017, Yannick Cote <yhcote@gmail.com> All rights reserved.
|
||||
// This software is licensed under a 3-clause BSD license. Please consult the
|
||||
@@ -8,7 +8,6 @@
|
||||
package sif
|
||||
|
||||
import (
|
||||
"encoding"
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
"fmt"
|
||||
@@ -56,6 +55,20 @@ func writeDataObjectAt(ws io.WriteSeeker, offsetUnaligned int64, di DescriptorIn
|
||||
return nil
|
||||
}
|
||||
|
||||
// calculatedDataSize calculates the size of the data section based on the in-use descriptors.
|
||||
func (f *FileImage) calculatedDataSize() int64 {
|
||||
dataEnd := f.DataOffset()
|
||||
|
||||
f.WithDescriptors(func(d Descriptor) bool {
|
||||
if objectEnd := d.Offset() + d.Size(); dataEnd < objectEnd {
|
||||
dataEnd = objectEnd
|
||||
}
|
||||
return false
|
||||
})
|
||||
|
||||
return dataEnd - f.DataOffset()
|
||||
}
|
||||
|
||||
var (
|
||||
errInsufficientCapacity = errors.New("insufficient descriptor capacity to add data object(s) to image")
|
||||
errPrimaryPartition = errors.New("image already contains a primary partition")
|
||||
@@ -81,6 +94,8 @@ func (f *FileImage) writeDataObject(i int, di DescriptorInput, t time.Time) erro
|
||||
d := &f.rds[i]
|
||||
d.ID = uint32(i) + 1
|
||||
|
||||
f.h.DataSize = f.calculatedDataSize()
|
||||
|
||||
if err := writeDataObjectAt(f.rw, f.h.DataOffset+f.h.DataSize, di, t, d); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -321,378 +336,3 @@ func CreateContainerAtPath(path string, opts ...CreateOpt) (*FileImage, error) {
|
||||
f.closeOnUnload = true
|
||||
return f, nil
|
||||
}
|
||||
|
||||
// addOpts accumulates object add options.
|
||||
type addOpts struct {
|
||||
t time.Time
|
||||
}
|
||||
|
||||
// AddOpt are used to specify object add options.
|
||||
type AddOpt func(*addOpts) error
|
||||
|
||||
// OptAddDeterministic sets header/descriptor fields to values that support deterministic
|
||||
// modification of images.
|
||||
func OptAddDeterministic() AddOpt {
|
||||
return func(ao *addOpts) error {
|
||||
ao.t = time.Time{}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// OptAddWithTime specifies t as the image modification time.
|
||||
func OptAddWithTime(t time.Time) AddOpt {
|
||||
return func(ao *addOpts) error {
|
||||
ao.t = t
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// AddObject adds a new data object and its descriptor into the specified SIF file.
|
||||
//
|
||||
// By default, the image modification time is set to the current time for non-deterministic images,
|
||||
// and unset otherwise. To override this, consider using OptAddDeterministic or OptAddWithTime.
|
||||
func (f *FileImage) AddObject(di DescriptorInput, opts ...AddOpt) error {
|
||||
ao := addOpts{}
|
||||
|
||||
if !f.isDeterministic() {
|
||||
ao.t = time.Now()
|
||||
}
|
||||
|
||||
for _, opt := range opts {
|
||||
if err := opt(&ao); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
}
|
||||
|
||||
// Find an unused descriptor.
|
||||
i := 0
|
||||
for _, rd := range f.rds {
|
||||
if !rd.Used {
|
||||
break
|
||||
}
|
||||
i++
|
||||
}
|
||||
|
||||
if err := f.writeDataObject(i, di, ao.t); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
if err := f.writeDescriptors(); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
f.h.ModifiedAt = ao.t.Unix()
|
||||
|
||||
if err := f.writeHeader(); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// isLast return true if the data object associated with d is the last in f.
|
||||
func (f *FileImage) isLast(d *rawDescriptor) bool {
|
||||
isLast := true
|
||||
|
||||
end := d.Offset + d.Size
|
||||
f.WithDescriptors(func(d Descriptor) bool {
|
||||
isLast = d.Offset()+d.Size() <= end
|
||||
return !isLast
|
||||
})
|
||||
|
||||
return isLast
|
||||
}
|
||||
|
||||
// zeroReader is an io.Reader that returns a stream of zero-bytes.
|
||||
type zeroReader struct{}
|
||||
|
||||
func (zeroReader) Read(b []byte) (int, error) {
|
||||
for i := range b {
|
||||
b[i] = 0
|
||||
}
|
||||
return len(b), nil
|
||||
}
|
||||
|
||||
// zero overwrites the data object described by d with a stream of zero bytes.
|
||||
func (f *FileImage) zero(d *rawDescriptor) error {
|
||||
if _, err := f.rw.Seek(d.Offset, io.SeekStart); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err := io.CopyN(f.rw, zeroReader{}, d.Size)
|
||||
return err
|
||||
}
|
||||
|
||||
// truncateAt truncates f at the start of the padded data object described by d.
|
||||
func (f *FileImage) truncateAt(d *rawDescriptor) error {
|
||||
start := d.Offset + d.Size - d.SizeWithPadding
|
||||
|
||||
return f.rw.Truncate(start)
|
||||
}
|
||||
|
||||
// deleteOpts accumulates object deletion options.
|
||||
type deleteOpts struct {
|
||||
zero bool
|
||||
compact bool
|
||||
t time.Time
|
||||
}
|
||||
|
||||
// DeleteOpt are used to specify object deletion options.
|
||||
type DeleteOpt func(*deleteOpts) error
|
||||
|
||||
// OptDeleteZero specifies whether the deleted object should be zeroed.
|
||||
func OptDeleteZero(b bool) DeleteOpt {
|
||||
return func(do *deleteOpts) error {
|
||||
do.zero = b
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// OptDeleteCompact specifies whether the image should be compacted following object deletion.
|
||||
func OptDeleteCompact(b bool) DeleteOpt {
|
||||
return func(do *deleteOpts) error {
|
||||
do.compact = b
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// OptDeleteDeterministic sets header/descriptor fields to values that support deterministic
|
||||
// modification of images.
|
||||
func OptDeleteDeterministic() DeleteOpt {
|
||||
return func(do *deleteOpts) error {
|
||||
do.t = time.Time{}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// OptDeleteWithTime specifies t as the image modification time.
|
||||
func OptDeleteWithTime(t time.Time) DeleteOpt {
|
||||
return func(do *deleteOpts) error {
|
||||
do.t = t
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
var errCompactNotImplemented = errors.New("compact not implemented for non-last object")
|
||||
|
||||
// DeleteObject deletes the data object with id, according to opts.
|
||||
//
|
||||
// To zero the data region of the deleted object, use OptDeleteZero. To compact the file following
|
||||
// object deletion, use OptDeleteCompact.
|
||||
//
|
||||
// By default, the image modification time is set to the current time for non-deterministic images,
|
||||
// and unset otherwise. To override this, consider using OptDeleteDeterministic or
|
||||
// OptDeleteWithTime.
|
||||
func (f *FileImage) DeleteObject(id uint32, opts ...DeleteOpt) error {
|
||||
do := deleteOpts{}
|
||||
|
||||
if !f.isDeterministic() {
|
||||
do.t = time.Now()
|
||||
}
|
||||
|
||||
for _, opt := range opts {
|
||||
if err := opt(&do); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
}
|
||||
|
||||
d, err := f.getDescriptor(WithID(id))
|
||||
if err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
if do.compact && !f.isLast(d) {
|
||||
return fmt.Errorf("%w", errCompactNotImplemented)
|
||||
}
|
||||
|
||||
if do.zero {
|
||||
if err := f.zero(d); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
}
|
||||
|
||||
if do.compact {
|
||||
if err := f.truncateAt(d); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
f.h.DataSize -= d.SizeWithPadding
|
||||
}
|
||||
|
||||
f.h.DescriptorsFree++
|
||||
f.h.ModifiedAt = do.t.Unix()
|
||||
|
||||
// If we remove the primary partition, set the global header Arch field to HdrArchUnknown
|
||||
// to indicate that the SIF file doesn't include a primary partition and no dependency
|
||||
// on any architecture exists.
|
||||
if d.isPartitionOfType(PartPrimSys) {
|
||||
f.h.Arch = hdrArchUnknown
|
||||
}
|
||||
|
||||
// Reset rawDescripter with empty struct
|
||||
*d = rawDescriptor{}
|
||||
|
||||
if err := f.writeDescriptors(); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
if err := f.writeHeader(); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// setOpts accumulates object set options.
|
||||
type setOpts struct {
|
||||
t time.Time
|
||||
}
|
||||
|
||||
// SetOpt are used to specify object set options.
|
||||
type SetOpt func(*setOpts) error
|
||||
|
||||
// OptSetDeterministic sets header/descriptor fields to values that support deterministic
|
||||
// modification of images.
|
||||
func OptSetDeterministic() SetOpt {
|
||||
return func(so *setOpts) error {
|
||||
so.t = time.Time{}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// OptSetWithTime specifies t as the image/object modification time.
|
||||
func OptSetWithTime(t time.Time) SetOpt {
|
||||
return func(so *setOpts) error {
|
||||
so.t = t
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
var (
|
||||
errNotPartition = errors.New("data object not a partition")
|
||||
errNotSystem = errors.New("data object not a system partition")
|
||||
)
|
||||
|
||||
// SetPrimPart sets the specified system partition to be the primary one.
|
||||
//
|
||||
// By default, the image/object modification times are set to the current time for
|
||||
// non-deterministic images, and unset otherwise. To override this, consider using
|
||||
// OptSetDeterministic or OptSetWithTime.
|
||||
func (f *FileImage) SetPrimPart(id uint32, opts ...SetOpt) error {
|
||||
so := setOpts{}
|
||||
|
||||
if !f.isDeterministic() {
|
||||
so.t = time.Now()
|
||||
}
|
||||
|
||||
for _, opt := range opts {
|
||||
if err := opt(&so); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
}
|
||||
|
||||
descr, err := f.getDescriptor(WithID(id))
|
||||
if err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
if descr.DataType != DataPartition {
|
||||
return fmt.Errorf("%w", errNotPartition)
|
||||
}
|
||||
|
||||
var p partition
|
||||
if err := descr.getExtra(binaryUnmarshaler{&p}); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
// if already primary system partition, nothing to do
|
||||
if p.Parttype == PartPrimSys {
|
||||
return nil
|
||||
}
|
||||
|
||||
if p.Parttype != PartSystem {
|
||||
return fmt.Errorf("%w", errNotSystem)
|
||||
}
|
||||
|
||||
// If there is currently a primary system partition, update it.
|
||||
if d, err := f.getDescriptor(WithPartitionType(PartPrimSys)); err == nil {
|
||||
var p partition
|
||||
if err := d.getExtra(binaryUnmarshaler{&p}); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
p.Parttype = PartSystem
|
||||
|
||||
if err := d.setExtra(p); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
d.ModifiedAt = so.t.Unix()
|
||||
} else if !errors.Is(err, ErrObjectNotFound) {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
// Update the descriptor of the new primary system partition.
|
||||
p.Parttype = PartPrimSys
|
||||
|
||||
if err := descr.setExtra(p); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
descr.ModifiedAt = so.t.Unix()
|
||||
|
||||
if err := f.writeDescriptors(); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
f.h.Arch = p.Arch
|
||||
f.h.ModifiedAt = so.t.Unix()
|
||||
|
||||
if err := f.writeHeader(); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// SetMetadata sets the metadata of the data object with id to md, according to opts.
|
||||
//
|
||||
// By default, the image/object modification times are set to the current time for
|
||||
// non-deterministic images, and unset otherwise. To override this, consider using
|
||||
// OptSetDeterministic or OptSetWithTime.
|
||||
func (f *FileImage) SetMetadata(id uint32, md encoding.BinaryMarshaler, opts ...SetOpt) error {
|
||||
so := setOpts{}
|
||||
|
||||
if !f.isDeterministic() {
|
||||
so.t = time.Now()
|
||||
}
|
||||
|
||||
for _, opt := range opts {
|
||||
if err := opt(&so); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
}
|
||||
|
||||
rd, err := f.getDescriptor(WithID(id))
|
||||
if err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
if err := rd.setExtra(md); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
rd.ModifiedAt = so.t.Unix()
|
||||
|
||||
if err := f.writeDescriptors(); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
f.h.ModifiedAt = so.t.Unix()
|
||||
|
||||
if err := f.writeHeader(); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
163
vendor/github.com/sylabs/sif/v2/pkg/sif/delete.go
generated
vendored
Normal file
163
vendor/github.com/sylabs/sif/v2/pkg/sif/delete.go
generated
vendored
Normal file
@@ -0,0 +1,163 @@
|
||||
// Copyright (c) 2018-2024, Sylabs Inc. All rights reserved.
|
||||
// Copyright (c) 2017, SingularityWare, LLC. All rights reserved.
|
||||
// Copyright (c) 2017, Yannick Cote <yhcote@gmail.com> All rights reserved.
|
||||
// This software is licensed under a 3-clause BSD license. Please consult the
|
||||
// LICENSE file distributed with the sources of this project regarding your
|
||||
// rights to use or distribute this software.
|
||||
|
||||
package sif
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"time"
|
||||
)
|
||||
|
||||
// zeroReader is an io.Reader that returns a stream of zero-bytes.
|
||||
type zeroReader struct{}
|
||||
|
||||
func (zeroReader) Read(b []byte) (int, error) {
|
||||
clear(b)
|
||||
return len(b), nil
|
||||
}
|
||||
|
||||
// zero overwrites the data object described by d with a stream of zero bytes.
|
||||
func (f *FileImage) zero(d *rawDescriptor) error {
|
||||
if _, err := f.rw.Seek(d.Offset, io.SeekStart); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
_, err := io.CopyN(f.rw, zeroReader{}, d.Size)
|
||||
return err
|
||||
}
|
||||
|
||||
// deleteOpts accumulates object deletion options.
|
||||
type deleteOpts struct {
|
||||
zero bool
|
||||
compact bool
|
||||
t time.Time
|
||||
}
|
||||
|
||||
// DeleteOpt are used to specify object deletion options.
|
||||
type DeleteOpt func(*deleteOpts) error
|
||||
|
||||
// OptDeleteZero specifies whether the deleted object should be zeroed.
|
||||
func OptDeleteZero(b bool) DeleteOpt {
|
||||
return func(do *deleteOpts) error {
|
||||
do.zero = b
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// OptDeleteCompact specifies whether the image should be compacted following object deletion.
|
||||
func OptDeleteCompact(b bool) DeleteOpt {
|
||||
return func(do *deleteOpts) error {
|
||||
do.compact = b
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// OptDeleteDeterministic sets header/descriptor fields to values that support deterministic
|
||||
// modification of images.
|
||||
func OptDeleteDeterministic() DeleteOpt {
|
||||
return func(do *deleteOpts) error {
|
||||
do.t = time.Time{}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// OptDeleteWithTime specifies t as the image modification time.
|
||||
func OptDeleteWithTime(t time.Time) DeleteOpt {
|
||||
return func(do *deleteOpts) error {
|
||||
do.t = t
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// DeleteObject deletes the data object with id, according to opts. If no matching descriptor is
|
||||
// found, an error wrapping ErrObjectNotFound is returned.
|
||||
//
|
||||
// To zero the data region of the deleted object, use OptDeleteZero. To remove unused space at the
|
||||
// end of the FileImage following object deletion, use OptDeleteCompact.
|
||||
//
|
||||
// By default, the image modification time is set to the current time for non-deterministic images,
|
||||
// and unset otherwise. To override this, consider using OptDeleteDeterministic or
|
||||
// OptDeleteWithTime.
|
||||
func (f *FileImage) DeleteObject(id uint32, opts ...DeleteOpt) error {
|
||||
return f.DeleteObjects(WithID(id), opts...)
|
||||
}
|
||||
|
||||
// DeleteObjects deletes the data objects selected by fn, according to opts. If no descriptors are
|
||||
// selected by fns, an error wrapping ErrObjectNotFound is returned.
|
||||
//
|
||||
// To zero the data region of the deleted object, use OptDeleteZero. To remove unused space at the
|
||||
// end of the FileImage following object deletion, use OptDeleteCompact.
|
||||
//
|
||||
// By default, the image modification time is set to the current time for non-deterministic images,
|
||||
// and unset otherwise. To override this, consider using OptDeleteDeterministic or
|
||||
// OptDeleteWithTime.
|
||||
func (f *FileImage) DeleteObjects(fn DescriptorSelectorFunc, opts ...DeleteOpt) error {
|
||||
do := deleteOpts{}
|
||||
|
||||
if !f.isDeterministic() {
|
||||
do.t = time.Now()
|
||||
}
|
||||
|
||||
for _, opt := range opts {
|
||||
if err := opt(&do); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
}
|
||||
|
||||
var selected bool
|
||||
|
||||
if err := f.withDescriptors(fn, func(d *rawDescriptor) error {
|
||||
selected = true
|
||||
|
||||
if do.zero {
|
||||
if err := f.zero(d); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
}
|
||||
|
||||
f.h.DescriptorsFree++
|
||||
|
||||
// If we remove the primary partition, set the global header Arch field to HdrArchUnknown
|
||||
// to indicate that the SIF file doesn't include a primary partition and no dependency
|
||||
// on any architecture exists.
|
||||
if d.isPartitionOfType(PartPrimSys) {
|
||||
f.h.Arch = hdrArchUnknown
|
||||
}
|
||||
|
||||
// Reset rawDescripter with empty struct
|
||||
*d = rawDescriptor{}
|
||||
|
||||
return nil
|
||||
}); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
if !selected {
|
||||
return fmt.Errorf("%w", ErrObjectNotFound)
|
||||
}
|
||||
|
||||
f.h.ModifiedAt = do.t.Unix()
|
||||
|
||||
if do.compact {
|
||||
f.h.DataSize = f.calculatedDataSize()
|
||||
|
||||
if err := f.rw.Truncate(f.h.DataOffset + f.h.DataSize); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
}
|
||||
|
||||
if err := f.writeDescriptors(); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
if err := f.writeHeader(); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
6
vendor/github.com/sylabs/sif/v2/pkg/sif/descriptor.go
generated
vendored
6
vendor/github.com/sylabs/sif/v2/pkg/sif/descriptor.go
generated
vendored
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2018-2023, Sylabs Inc. All rights reserved.
|
||||
// Copyright (c) 2018-2024, Sylabs Inc. All rights reserved.
|
||||
// Copyright (c) 2017, SingularityWare, LLC. All rights reserved.
|
||||
// Copyright (c) 2017, Yannick Cote <yhcote@gmail.com> All rights reserved.
|
||||
// This software is licensed under a 3-clause BSD license. Please consult the
|
||||
@@ -92,7 +92,9 @@ func newOCIBlobDigest() *ociBlob {
|
||||
|
||||
// MarshalBinary encodes ob into binary format.
|
||||
func (ob *ociBlob) MarshalBinary() ([]byte, error) {
|
||||
ob.digest.Hex = hex.EncodeToString(ob.hasher.Sum(nil))
|
||||
if ob.digest.Hex == "" {
|
||||
ob.digest.Hex = hex.EncodeToString(ob.hasher.Sum(nil))
|
||||
}
|
||||
|
||||
return ob.digest.MarshalText()
|
||||
}
|
||||
|
8
vendor/github.com/sylabs/sif/v2/pkg/sif/select.go
generated
vendored
8
vendor/github.com/sylabs/sif/v2/pkg/sif/select.go
generated
vendored
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2021-2023, Sylabs Inc. All rights reserved.
|
||||
// Copyright (c) 2021-2024, Sylabs Inc. All rights reserved.
|
||||
// This software is licensed under a 3-clause BSD license. Please consult the
|
||||
// LICENSE file distributed with the sources of this project regarding your
|
||||
// rights to use or distribute this software.
|
||||
@@ -184,10 +184,16 @@ func multiSelectorFunc(fns ...DescriptorSelectorFunc) DescriptorSelectorFunc {
|
||||
}
|
||||
}
|
||||
|
||||
var errNilSelectFunc = errors.New("descriptor selector func must not be nil")
|
||||
|
||||
// withDescriptors calls onMatchFn with each in-use descriptor in f for which selectFn returns
|
||||
// true. If selectFn or onMatchFn return a non-nil error, the iteration halts, and the error is
|
||||
// returned to the caller.
|
||||
func (f *FileImage) withDescriptors(selectFn DescriptorSelectorFunc, onMatchFn func(*rawDescriptor) error) error {
|
||||
if selectFn == nil {
|
||||
return errNilSelectFunc
|
||||
}
|
||||
|
||||
for i, d := range f.rds {
|
||||
if !d.Used {
|
||||
continue
|
||||
|
220
vendor/github.com/sylabs/sif/v2/pkg/sif/set.go
generated
vendored
Normal file
220
vendor/github.com/sylabs/sif/v2/pkg/sif/set.go
generated
vendored
Normal file
@@ -0,0 +1,220 @@
|
||||
// Copyright (c) 2018-2024, Sylabs Inc. All rights reserved.
|
||||
// Copyright (c) 2017, SingularityWare, LLC. All rights reserved.
|
||||
// Copyright (c) 2017, Yannick Cote <yhcote@gmail.com> All rights reserved.
|
||||
// This software is licensed under a 3-clause BSD license. Please consult the
|
||||
// LICENSE file distributed with the sources of this project regarding your
|
||||
// rights to use or distribute this software.
|
||||
|
||||
package sif
|
||||
|
||||
import (
|
||||
"encoding"
|
||||
"errors"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
v1 "github.com/google/go-containerregistry/pkg/v1"
|
||||
)
|
||||
|
||||
// setOpts accumulates object set options.
|
||||
type setOpts struct {
|
||||
t time.Time
|
||||
}
|
||||
|
||||
// SetOpt are used to specify object set options.
|
||||
type SetOpt func(*setOpts) error
|
||||
|
||||
// OptSetDeterministic sets header/descriptor fields to values that support deterministic
|
||||
// modification of images.
|
||||
func OptSetDeterministic() SetOpt {
|
||||
return func(so *setOpts) error {
|
||||
so.t = time.Time{}
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
// OptSetWithTime specifies t as the image/object modification time.
|
||||
func OptSetWithTime(t time.Time) SetOpt {
|
||||
return func(so *setOpts) error {
|
||||
so.t = t
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
var (
|
||||
errNotPartition = errors.New("data object not a partition")
|
||||
errNotSystem = errors.New("data object not a system partition")
|
||||
)
|
||||
|
||||
// SetPrimPart sets the specified system partition to be the primary one.
|
||||
//
|
||||
// By default, the image/object modification times are set to the current time for
|
||||
// non-deterministic images, and unset otherwise. To override this, consider using
|
||||
// OptSetDeterministic or OptSetWithTime.
|
||||
func (f *FileImage) SetPrimPart(id uint32, opts ...SetOpt) error {
|
||||
so := setOpts{}
|
||||
|
||||
if !f.isDeterministic() {
|
||||
so.t = time.Now()
|
||||
}
|
||||
|
||||
for _, opt := range opts {
|
||||
if err := opt(&so); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
}
|
||||
|
||||
descr, err := f.getDescriptor(WithID(id))
|
||||
if err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
if descr.DataType != DataPartition {
|
||||
return fmt.Errorf("%w", errNotPartition)
|
||||
}
|
||||
|
||||
var p partition
|
||||
if err := descr.getExtra(binaryUnmarshaler{&p}); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
// if already primary system partition, nothing to do
|
||||
if p.Parttype == PartPrimSys {
|
||||
return nil
|
||||
}
|
||||
|
||||
if p.Parttype != PartSystem {
|
||||
return fmt.Errorf("%w", errNotSystem)
|
||||
}
|
||||
|
||||
// If there is currently a primary system partition, update it.
|
||||
if d, err := f.getDescriptor(WithPartitionType(PartPrimSys)); err == nil {
|
||||
var p partition
|
||||
if err := d.getExtra(binaryUnmarshaler{&p}); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
p.Parttype = PartSystem
|
||||
|
||||
if err := d.setExtra(p); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
d.ModifiedAt = so.t.Unix()
|
||||
} else if !errors.Is(err, ErrObjectNotFound) {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
// Update the descriptor of the new primary system partition.
|
||||
p.Parttype = PartPrimSys
|
||||
|
||||
if err := descr.setExtra(p); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
descr.ModifiedAt = so.t.Unix()
|
||||
|
||||
if err := f.writeDescriptors(); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
f.h.Arch = p.Arch
|
||||
f.h.ModifiedAt = so.t.Unix()
|
||||
|
||||
if err := f.writeHeader(); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// SetMetadata sets the metadata of the data object with id to md, according to opts.
|
||||
//
|
||||
// By default, the image/object modification times are set to the current time for
|
||||
// non-deterministic images, and unset otherwise. To override this, consider using
|
||||
// OptSetDeterministic or OptSetWithTime.
|
||||
func (f *FileImage) SetMetadata(id uint32, md encoding.BinaryMarshaler, opts ...SetOpt) error {
|
||||
so := setOpts{}
|
||||
|
||||
if !f.isDeterministic() {
|
||||
so.t = time.Now()
|
||||
}
|
||||
|
||||
for _, opt := range opts {
|
||||
if err := opt(&so); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
}
|
||||
|
||||
rd, err := f.getDescriptor(WithID(id))
|
||||
if err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
if err := rd.setExtra(md); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
rd.ModifiedAt = so.t.Unix()
|
||||
|
||||
if err := f.writeDescriptors(); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
f.h.ModifiedAt = so.t.Unix()
|
||||
|
||||
if err := f.writeHeader(); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// SetOCIBlobDigest updates the digest of the OCI blob object with id to h, according to opts.
|
||||
//
|
||||
// By default, the image/object modification times are set to the current time for
|
||||
// non-deterministic images, and unset otherwise. To override this, consider using
|
||||
// OptSetDeterministic or OptSetWithTime.
|
||||
func (f *FileImage) SetOCIBlobDigest(id uint32, h v1.Hash, opts ...SetOpt) error {
|
||||
rd, err := f.getDescriptor(WithID(id))
|
||||
if err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
if got := rd.DataType; got != DataOCIRootIndex && got != DataOCIBlob {
|
||||
return &unexpectedDataTypeError{got, []DataType{DataOCIRootIndex, DataOCIBlob}}
|
||||
}
|
||||
|
||||
so := setOpts{}
|
||||
|
||||
if !f.isDeterministic() {
|
||||
so.t = time.Now()
|
||||
}
|
||||
|
||||
for _, opt := range opts {
|
||||
if err := opt(&so); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
}
|
||||
|
||||
md := &ociBlob{
|
||||
digest: h,
|
||||
}
|
||||
if err := rd.setExtra(md); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
rd.ModifiedAt = so.t.Unix()
|
||||
|
||||
if err := f.writeDescriptors(); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
f.h.ModifiedAt = so.t.Unix()
|
||||
|
||||
if err := f.writeHeader(); err != nil {
|
||||
return fmt.Errorf("%w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
Reference in New Issue
Block a user