mirror of
https://github.com/regclient/regclient.git
synced 2025-07-30 20:03:04 +03:00
Cleanup links in "deprecated" comments
Signed-off-by: Brandon Mitchell <git@bmitch.net>
This commit is contained in:
@ -15,7 +15,7 @@ import (
|
|||||||
"github.com/regclient/regclient/types/ref"
|
"github.com/regclient/regclient/types/ref"
|
||||||
)
|
)
|
||||||
|
|
||||||
// WithBuildArgRm removes a build arg from the config history
|
// WithBuildArgRm removes a build arg from the config history.
|
||||||
func WithBuildArgRm(arg string, value *regexp.Regexp) Opts {
|
func WithBuildArgRm(arg string, value *regexp.Regexp) Opts {
|
||||||
return func(dc *dagConfig, dm *dagManifest) error {
|
return func(dc *dagConfig, dm *dagManifest) error {
|
||||||
dc.stepsOCIConfig = append(dc.stepsOCIConfig, func(ctx context.Context, rc *regclient.RegClient, rSrc, rTgt ref.Ref, doc *dagOCIConfig) error {
|
dc.stepsOCIConfig = append(dc.stepsOCIConfig, func(ctx context.Context, rc *regclient.RegClient, rSrc, rTgt ref.Ref, doc *dagOCIConfig) error {
|
||||||
@ -54,7 +54,7 @@ func WithBuildArgRm(arg string, value *regexp.Regexp) Opts {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithConfigTimestamp sets the timestamp on the config entries based on options
|
// WithConfigTimestamp sets the timestamp on the config entries based on options.
|
||||||
func WithConfigTimestamp(optTime OptTime) Opts {
|
func WithConfigTimestamp(optTime OptTime) Opts {
|
||||||
return func(dc *dagConfig, dm *dagManifest) error {
|
return func(dc *dagConfig, dm *dagManifest) error {
|
||||||
if optTime.Set.IsZero() && optTime.FromLabel == "" {
|
if optTime.Set.IsZero() && optTime.FromLabel == "" {
|
||||||
@ -161,9 +161,9 @@ func WithConfigTimestamp(optTime OptTime) Opts {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithConfigTimestampFromLabel sets the max timestamp in the config to match a label value
|
// WithConfigTimestampFromLabel sets the max timestamp in the config to match a label value.
|
||||||
//
|
//
|
||||||
// Deprecated: replace with WithConfigTimestamp
|
// Deprecated: replace with [WithConfigTimestamp].
|
||||||
func WithConfigTimestampFromLabel(label string) Opts {
|
func WithConfigTimestampFromLabel(label string) Opts {
|
||||||
return func(dc *dagConfig, dm *dagManifest) error {
|
return func(dc *dagConfig, dm *dagManifest) error {
|
||||||
dc.stepsOCIConfig = append(dc.stepsOCIConfig, func(c context.Context, rc *regclient.RegClient, rSrc, rTgt ref.Ref, doc *dagOCIConfig) error {
|
dc.stepsOCIConfig = append(dc.stepsOCIConfig, func(c context.Context, rc *regclient.RegClient, rSrc, rTgt ref.Ref, doc *dagOCIConfig) error {
|
||||||
@ -202,9 +202,9 @@ func WithConfigTimestampFromLabel(label string) Opts {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithConfigTimestampMax sets the max timestamp on any config objects
|
// WithConfigTimestampMax sets the max timestamp on any config objects.
|
||||||
//
|
//
|
||||||
// Deprecated: replace with WithConfigTimestamp
|
// Deprecated: replace with [WithConfigTimestamp].
|
||||||
func WithConfigTimestampMax(t time.Time) Opts {
|
func WithConfigTimestampMax(t time.Time) Opts {
|
||||||
return WithConfigTimestamp(OptTime{
|
return WithConfigTimestamp(OptTime{
|
||||||
Set: t,
|
Set: t,
|
||||||
@ -212,7 +212,7 @@ func WithConfigTimestampMax(t time.Time) Opts {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithExposeAdd defines an exposed port in the image config
|
// WithExposeAdd defines an exposed port in the image config.
|
||||||
func WithExposeAdd(port string) Opts {
|
func WithExposeAdd(port string) Opts {
|
||||||
return func(dc *dagConfig, dm *dagManifest) error {
|
return func(dc *dagConfig, dm *dagManifest) error {
|
||||||
dc.stepsOCIConfig = append(dc.stepsOCIConfig, func(ctx context.Context, rc *regclient.RegClient, rSrc, rTgt ref.Ref, doc *dagOCIConfig) error {
|
dc.stepsOCIConfig = append(dc.stepsOCIConfig, func(ctx context.Context, rc *regclient.RegClient, rSrc, rTgt ref.Ref, doc *dagOCIConfig) error {
|
||||||
@ -236,7 +236,7 @@ func WithExposeAdd(port string) Opts {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithExposeRm deletes an exposed from the image config
|
// WithExposeRm deletes an exposed from the image config.
|
||||||
func WithExposeRm(port string) Opts {
|
func WithExposeRm(port string) Opts {
|
||||||
return func(dc *dagConfig, dm *dagManifest) error {
|
return func(dc *dagConfig, dm *dagManifest) error {
|
||||||
dc.stepsOCIConfig = append(dc.stepsOCIConfig, func(ctx context.Context, rc *regclient.RegClient, rSrc, rTgt ref.Ref, doc *dagOCIConfig) error {
|
dc.stepsOCIConfig = append(dc.stepsOCIConfig, func(ctx context.Context, rc *regclient.RegClient, rSrc, rTgt ref.Ref, doc *dagOCIConfig) error {
|
||||||
@ -260,7 +260,7 @@ func WithExposeRm(port string) Opts {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithLabel sets or deletes a label from the image config
|
// WithLabel sets or deletes a label from the image config.
|
||||||
func WithLabel(name, value string) Opts {
|
func WithLabel(name, value string) Opts {
|
||||||
return func(dc *dagConfig, dm *dagManifest) error {
|
return func(dc *dagConfig, dm *dagManifest) error {
|
||||||
// extract the list for platforms to update from the name
|
// extract the list for platforms to update from the name
|
||||||
@ -321,7 +321,7 @@ func WithLabel(name, value string) Opts {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithVolumeAdd defines a volume in the image config
|
// WithVolumeAdd defines a volume in the image config.
|
||||||
func WithVolumeAdd(volume string) Opts {
|
func WithVolumeAdd(volume string) Opts {
|
||||||
return func(dc *dagConfig, dm *dagManifest) error {
|
return func(dc *dagConfig, dm *dagManifest) error {
|
||||||
dc.stepsOCIConfig = append(dc.stepsOCIConfig, func(ctx context.Context, rc *regclient.RegClient, rSrc, rTgt ref.Ref, doc *dagOCIConfig) error {
|
dc.stepsOCIConfig = append(dc.stepsOCIConfig, func(ctx context.Context, rc *regclient.RegClient, rSrc, rTgt ref.Ref, doc *dagOCIConfig) error {
|
||||||
@ -345,7 +345,7 @@ func WithVolumeAdd(volume string) Opts {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithVolumeRm deletes a volume from the image config
|
// WithVolumeRm deletes a volume from the image config.
|
||||||
func WithVolumeRm(volume string) Opts {
|
func WithVolumeRm(volume string) Opts {
|
||||||
return func(dc *dagConfig, dm *dagManifest) error {
|
return func(dc *dagConfig, dm *dagManifest) error {
|
||||||
dc.stepsOCIConfig = append(dc.stepsOCIConfig, func(ctx context.Context, rc *regclient.RegClient, rSrc, rTgt ref.Ref, doc *dagOCIConfig) error {
|
dc.stepsOCIConfig = append(dc.stepsOCIConfig, func(ctx context.Context, rc *regclient.RegClient, rSrc, rTgt ref.Ref, doc *dagOCIConfig) error {
|
||||||
|
22
mod/layer.go
22
mod/layer.go
@ -42,7 +42,7 @@ func WithLayerReproducible() Opts {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// WithLayerRmCreatedBy deletes a layer based on a regex of the created by field
|
// WithLayerRmCreatedBy deletes a layer based on a regex of the created by field
|
||||||
// in the config history for that layer
|
// in the config history for that layer.
|
||||||
func WithLayerRmCreatedBy(re regexp.Regexp) Opts {
|
func WithLayerRmCreatedBy(re regexp.Regexp) Opts {
|
||||||
return func(dc *dagConfig, dm *dagManifest) error {
|
return func(dc *dagConfig, dm *dagManifest) error {
|
||||||
dc.stepsManifest = append(dc.stepsManifest, func(c context.Context, rc *regclient.RegClient, rSrc, rTgt ref.Ref, dm *dagManifest) error {
|
dc.stepsManifest = append(dc.stepsManifest, func(c context.Context, rc *regclient.RegClient, rSrc, rTgt ref.Ref, dm *dagManifest) error {
|
||||||
@ -125,7 +125,7 @@ func WithLayerRmIndex(index int) Opts {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithLayerStripFile removes a file from within the layer tar
|
// WithLayerStripFile removes a file from within the layer tar.
|
||||||
func WithLayerStripFile(file string) Opts {
|
func WithLayerStripFile(file string) Opts {
|
||||||
file = strings.Trim(file, "/")
|
file = strings.Trim(file, "/")
|
||||||
fileRE := regexp.MustCompile("^/?" + regexp.QuoteMeta(file) + "(/.*)?$")
|
fileRE := regexp.MustCompile("^/?" + regexp.QuoteMeta(file) + "(/.*)?$")
|
||||||
@ -140,7 +140,7 @@ func WithLayerStripFile(file string) Opts {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithLayerTimestamp sets the timestamp on files in the layers based on options
|
// WithLayerTimestamp sets the timestamp on files in the layers based on options.
|
||||||
func WithLayerTimestamp(optTime OptTime) Opts {
|
func WithLayerTimestamp(optTime OptTime) Opts {
|
||||||
return func(dc *dagConfig, dm *dagManifest) error {
|
return func(dc *dagConfig, dm *dagManifest) error {
|
||||||
if optTime.Set.IsZero() && optTime.FromLabel == "" {
|
if optTime.Set.IsZero() && optTime.FromLabel == "" {
|
||||||
@ -275,9 +275,9 @@ func layerGetBaseRef(c context.Context, rc *regclient.RegClient, r ref.Ref, m ma
|
|||||||
return dl, nil
|
return dl, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithLayerTimestampFromLabel sets the max layer timestamp based on a label in the image
|
// WithLayerTimestampFromLabel sets the max layer timestamp based on a label in the image.
|
||||||
//
|
//
|
||||||
// Deprecated: replace with WithLayerTimestamp
|
// Deprecated: replace with [WithLayerTimestamp].
|
||||||
func WithLayerTimestampFromLabel(label string) Opts {
|
func WithLayerTimestampFromLabel(label string) Opts {
|
||||||
t := time.Time{}
|
t := time.Time{}
|
||||||
return func(dc *dagConfig, dm *dagManifest) error {
|
return func(dc *dagConfig, dm *dagManifest) error {
|
||||||
@ -329,9 +329,9 @@ func WithLayerTimestampFromLabel(label string) Opts {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithLayerTimestampMax ensures no file timestamps are after specified time
|
// WithLayerTimestampMax ensures no file timestamps are after specified time.
|
||||||
//
|
//
|
||||||
// Deprecated: replace with WithLayerTimestamp
|
// Deprecated: replace with [WithLayerTimestamp].
|
||||||
func WithLayerTimestampMax(t time.Time) Opts {
|
func WithLayerTimestampMax(t time.Time) Opts {
|
||||||
return WithLayerTimestamp(OptTime{
|
return WithLayerTimestamp(OptTime{
|
||||||
Set: t,
|
Set: t,
|
||||||
@ -339,7 +339,7 @@ func WithLayerTimestampMax(t time.Time) Opts {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithFileTarTime processes a tar file within a layer and adjusts the timestamps according to optTime
|
// WithFileTarTime processes a tar file within a layer and adjusts the timestamps according to optTime.
|
||||||
func WithFileTarTime(name string, optTime OptTime) Opts {
|
func WithFileTarTime(name string, optTime OptTime) Opts {
|
||||||
name = strings.TrimPrefix(name, "/")
|
name = strings.TrimPrefix(name, "/")
|
||||||
return func(dc *dagConfig, dm *dagManifest) error {
|
return func(dc *dagConfig, dm *dagManifest) error {
|
||||||
@ -480,9 +480,9 @@ func WithFileTarTime(name string, optTime OptTime) Opts {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithFileTarTimeMax processes a tar file within a layer and rewrites the contents with a max timestamp
|
// WithFileTarTimeMax processes a tar file within a layer and rewrites the contents with a max timestamp.
|
||||||
//
|
//
|
||||||
// Deprecated: replace with WithFileTarTime
|
// Deprecated: replace with [WithFileTarTime].
|
||||||
func WithFileTarTimeMax(name string, t time.Time) Opts {
|
func WithFileTarTimeMax(name string, t time.Time) Opts {
|
||||||
return WithFileTarTime(name, OptTime{
|
return WithFileTarTime(name, OptTime{
|
||||||
Set: t,
|
Set: t,
|
||||||
@ -496,7 +496,7 @@ type tmpReader struct {
|
|||||||
filename string
|
filename string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read for tmpReader passes through the read and deletes the tmp file when the read completes
|
// Read for tmpReader passes through the read and deletes the tmp file when the read completes.
|
||||||
func (t *tmpReader) Read(p []byte) (int, error) {
|
func (t *tmpReader) Read(p []byte) (int, error) {
|
||||||
if t.file == nil {
|
if t.file == nil {
|
||||||
return 0, io.EOF
|
return 0, io.EOF
|
||||||
|
@ -91,7 +91,7 @@ func WithAnnotation(name, value string) Opts {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithAnnotationOCIBase adds annotations for the base image
|
// WithAnnotationOCIBase adds annotations for the base image.
|
||||||
func WithAnnotationOCIBase(rBase ref.Ref, dBase digest.Digest) Opts {
|
func WithAnnotationOCIBase(rBase ref.Ref, dBase digest.Digest) Opts {
|
||||||
return func(dc *dagConfig, dm *dagManifest) error {
|
return func(dc *dagConfig, dm *dagManifest) error {
|
||||||
dc.stepsManifest = append(dc.stepsManifest, func(ctx context.Context, rc *regclient.RegClient, rSrc, rTgt ref.Ref, dm *dagManifest) error {
|
dc.stepsManifest = append(dc.stepsManifest, func(ctx context.Context, rc *regclient.RegClient, rSrc, rTgt ref.Ref, dm *dagManifest) error {
|
||||||
@ -157,7 +157,7 @@ func WithAnnotationOCIBase(rBase ref.Ref, dBase digest.Digest) Opts {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithLabelToAnnotation copies image config labels to manifest annotations
|
// WithLabelToAnnotation copies image config labels to manifest annotations.
|
||||||
func WithLabelToAnnotation() Opts {
|
func WithLabelToAnnotation() Opts {
|
||||||
return func(dc *dagConfig, dm *dagManifest) error {
|
return func(dc *dagConfig, dm *dagManifest) error {
|
||||||
dc.stepsManifest = append(dc.stepsManifest, func(c context.Context, rc *regclient.RegClient, rSrc, rTgt ref.Ref, dm *dagManifest) error {
|
dc.stepsManifest = append(dc.stepsManifest, func(c context.Context, rc *regclient.RegClient, rSrc, rTgt ref.Ref, dm *dagManifest) error {
|
||||||
@ -209,7 +209,7 @@ func WithLabelToAnnotation() Opts {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithManifestToDocker converts the manifest to Docker schema2 media types
|
// WithManifestToDocker converts the manifest to Docker schema2 media types.
|
||||||
func WithManifestToDocker() Opts {
|
func WithManifestToDocker() Opts {
|
||||||
return func(dc *dagConfig, dm *dagManifest) error {
|
return func(dc *dagConfig, dm *dagManifest) error {
|
||||||
dc.stepsManifest = append(dc.stepsManifest, func(c context.Context, rc *regclient.RegClient, rSrc, rTgt ref.Ref, dm *dagManifest) error {
|
dc.stepsManifest = append(dc.stepsManifest, func(c context.Context, rc *regclient.RegClient, rSrc, rTgt ref.Ref, dm *dagManifest) error {
|
||||||
@ -281,7 +281,7 @@ func WithManifestToDocker() Opts {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithManifestToOCI converts the manifest to OCI media types
|
// WithManifestToOCI converts the manifest to OCI media types.
|
||||||
func WithManifestToOCI() Opts {
|
func WithManifestToOCI() Opts {
|
||||||
return func(dc *dagConfig, dm *dagManifest) error {
|
return func(dc *dagConfig, dm *dagManifest) error {
|
||||||
dc.stepsManifest = append(dc.stepsManifest, func(c context.Context, rc *regclient.RegClient, rSrc, rTgt ref.Ref, dm *dagManifest) error {
|
dc.stepsManifest = append(dc.stepsManifest, func(c context.Context, rc *regclient.RegClient, rSrc, rTgt ref.Ref, dm *dagManifest) error {
|
||||||
@ -345,7 +345,7 @@ const (
|
|||||||
dockerReferenceDigest = "vnd.docker.reference.digest"
|
dockerReferenceDigest = "vnd.docker.reference.digest"
|
||||||
)
|
)
|
||||||
|
|
||||||
// WithManifestToOCIReferrers converts other referrer types to OCI subject/referrers
|
// WithManifestToOCIReferrers converts other referrer types to OCI subject/referrers.
|
||||||
func WithManifestToOCIReferrers() Opts {
|
func WithManifestToOCIReferrers() Opts {
|
||||||
return func(dc *dagConfig, dm *dagManifest) error {
|
return func(dc *dagConfig, dm *dagManifest) error {
|
||||||
dc.stepsManifest = append(dc.stepsManifest, func(c context.Context, rc *regclient.RegClient, rSrc, rTgt ref.Ref, dm *dagManifest) error {
|
dc.stepsManifest = append(dc.stepsManifest, func(c context.Context, rc *regclient.RegClient, rSrc, rTgt ref.Ref, dm *dagManifest) error {
|
||||||
@ -422,7 +422,7 @@ func WithManifestToOCIReferrers() Opts {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithExternalURLsRm strips external URLs from descriptors and adjusts media type to match
|
// WithExternalURLsRm strips external URLs from descriptors and adjusts media type to match.
|
||||||
func WithExternalURLsRm() Opts {
|
func WithExternalURLsRm() Opts {
|
||||||
return func(dc *dagConfig, dm *dagManifest) error {
|
return func(dc *dagConfig, dm *dagManifest) error {
|
||||||
dc.stepsManifest = append(dc.stepsManifest, func(ctx context.Context, rc *regclient.RegClient, rSrc, rTgt ref.Ref, dm *dagManifest) error {
|
dc.stepsManifest = append(dc.stepsManifest, func(ctx context.Context, rc *regclient.RegClient, rSrc, rTgt ref.Ref, dm *dagManifest) error {
|
||||||
@ -489,6 +489,7 @@ func WithExternalURLsRm() Opts {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WithRebase attempts to rebase the image using OCI annotations identifying the base image.
|
||||||
func WithRebase() Opts {
|
func WithRebase() Opts {
|
||||||
return func(dc *dagConfig, dm *dagManifest) error {
|
return func(dc *dagConfig, dm *dagManifest) error {
|
||||||
ma, ok := dm.m.(manifest.Annotator)
|
ma, ok := dm.m.(manifest.Annotator)
|
||||||
@ -522,7 +523,7 @@ func WithRebase() Opts {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithRebaseRefs swaps the base image layers from the old to the new reference
|
// WithRebaseRefs swaps the base image layers from the old to the new reference.
|
||||||
func WithRebaseRefs(rOld, rNew ref.Ref) Opts {
|
func WithRebaseRefs(rOld, rNew ref.Ref) Opts {
|
||||||
// cache old and new manifests, variable is nil until first pulled
|
// cache old and new manifests, variable is nil until first pulled
|
||||||
return func(dc *dagConfig, dm *dagManifest) error {
|
return func(dc *dagConfig, dm *dagManifest) error {
|
||||||
|
@ -20,7 +20,7 @@ import (
|
|||||||
// Opts defines options for Apply
|
// Opts defines options for Apply
|
||||||
type Opts func(*dagConfig, *dagManifest) error
|
type Opts func(*dagConfig, *dagManifest) error
|
||||||
|
|
||||||
// OptTime defines time settings for WithConfigTimestamp and WithLayerTimestamp
|
// OptTime defines time settings for [WithConfigTimestamp] and [WithLayerTimestamp].
|
||||||
type OptTime struct {
|
type OptTime struct {
|
||||||
Set time.Time // time to set, this or FromLabel are required
|
Set time.Time // time to set, this or FromLabel are required
|
||||||
FromLabel string // label from which to extract set time
|
FromLabel string // label from which to extract set time
|
||||||
@ -43,7 +43,7 @@ var (
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// Apply applies a set of modifications to an image (manifest, configs, and layers)
|
// Apply applies a set of modifications to an image (manifest, configs, and layers).
|
||||||
func Apply(ctx context.Context, rc *regclient.RegClient, rSrc ref.Ref, opts ...Opts) (ref.Ref, error) {
|
func Apply(ctx context.Context, rc *regclient.RegClient, rSrc ref.Ref, opts ...Opts) (ref.Ref, error) {
|
||||||
// check for the various types of mods (manifest, config, layer)
|
// check for the various types of mods (manifest, config, layer)
|
||||||
// some may span like copying layers from config to manifest
|
// some may span like copying layers from config to manifest
|
||||||
|
14
regclient.go
14
regclient.go
@ -40,7 +40,7 @@ type RegClient struct {
|
|||||||
fs rwfs.RWFS
|
fs rwfs.RWFS
|
||||||
}
|
}
|
||||||
|
|
||||||
// Opt functions are used to configure NewRegClient.
|
// Opt functions are used by [New] to create a [*RegClient].
|
||||||
type Opt func(*RegClient)
|
type Opt func(*RegClient)
|
||||||
|
|
||||||
// New returns a registry client.
|
// New returns a registry client.
|
||||||
@ -97,7 +97,7 @@ func New(opts ...Opt) *RegClient {
|
|||||||
|
|
||||||
// WithBlobLimit sets the max size for chunked blob uploads which get stored in memory.
|
// WithBlobLimit sets the max size for chunked blob uploads which get stored in memory.
|
||||||
//
|
//
|
||||||
// Deprecated: replace with WithRegOpts(reg.WithBlobLimit(limit)).
|
// Deprecated: replace with WithRegOpts(reg.WithBlobLimit(limit)), see [WithRegOpts] and [reg.WithBlobLimit].
|
||||||
func WithBlobLimit(limit int64) Opt {
|
func WithBlobLimit(limit int64) Opt {
|
||||||
return func(rc *RegClient) {
|
return func(rc *RegClient) {
|
||||||
rc.regOpts = append(rc.regOpts, reg.WithBlobLimit(limit))
|
rc.regOpts = append(rc.regOpts, reg.WithBlobLimit(limit))
|
||||||
@ -106,7 +106,7 @@ func WithBlobLimit(limit int64) Opt {
|
|||||||
|
|
||||||
// WithBlobSize overrides default blob sizes.
|
// WithBlobSize overrides default blob sizes.
|
||||||
//
|
//
|
||||||
// Deprecated: replace with WithRegOpts(reg.WithBlobSize(chunk, max)).
|
// Deprecated: replace with WithRegOpts(reg.WithBlobSize(chunk, max)), see [WithRegOpts] and [reg.WithBlobSize].
|
||||||
func WithBlobSize(chunk, max int64) Opt {
|
func WithBlobSize(chunk, max int64) Opt {
|
||||||
return func(rc *RegClient) {
|
return func(rc *RegClient) {
|
||||||
rc.regOpts = append(rc.regOpts, reg.WithBlobSize(chunk, max))
|
rc.regOpts = append(rc.regOpts, reg.WithBlobSize(chunk, max))
|
||||||
@ -115,7 +115,7 @@ func WithBlobSize(chunk, max int64) Opt {
|
|||||||
|
|
||||||
// WithCertDir adds a path of certificates to trust similar to Docker's /etc/docker/certs.d.
|
// WithCertDir adds a path of certificates to trust similar to Docker's /etc/docker/certs.d.
|
||||||
//
|
//
|
||||||
// Deprecated: replace with WithRegOpts(reg.WithCertDirs(path)).
|
// Deprecated: replace with WithRegOpts(reg.WithCertDirs(path)), see [WithRegOpts] and [reg.WithCertDirs].
|
||||||
func WithCertDir(path ...string) Opt {
|
func WithCertDir(path ...string) Opt {
|
||||||
return func(rc *RegClient) {
|
return func(rc *RegClient) {
|
||||||
rc.regOpts = append(rc.regOpts, reg.WithCertDirs(path))
|
rc.regOpts = append(rc.regOpts, reg.WithCertDirs(path))
|
||||||
@ -131,7 +131,7 @@ func WithConfigHost(configHost ...config.Host) Opt {
|
|||||||
|
|
||||||
// WithConfigHosts adds a list of config host settings.
|
// WithConfigHosts adds a list of config host settings.
|
||||||
//
|
//
|
||||||
// Deprecated: replace with WithConfigHost.
|
// Deprecated: replace with [WithConfigHost].
|
||||||
func WithConfigHosts(configHosts []config.Host) Opt {
|
func WithConfigHosts(configHosts []config.Host) Opt {
|
||||||
return WithConfigHost(configHosts...)
|
return WithConfigHost(configHosts...)
|
||||||
}
|
}
|
||||||
@ -182,7 +182,7 @@ func WithRegOpts(opts ...reg.Opts) Opt {
|
|||||||
|
|
||||||
// WithRetryDelay specifies the time permitted for retry delays.
|
// WithRetryDelay specifies the time permitted for retry delays.
|
||||||
//
|
//
|
||||||
// Deprecated: replace with WithRegOpts(reg.WithDelay(delayInit, delayMax)).
|
// Deprecated: replace with WithRegOpts(reg.WithDelay(delayInit, delayMax)), see [WithRegOpts] and [reg.WithDelay].
|
||||||
func WithRetryDelay(delayInit, delayMax time.Duration) Opt {
|
func WithRetryDelay(delayInit, delayMax time.Duration) Opt {
|
||||||
return func(rc *RegClient) {
|
return func(rc *RegClient) {
|
||||||
rc.regOpts = append(rc.regOpts, reg.WithDelay(delayInit, delayMax))
|
rc.regOpts = append(rc.regOpts, reg.WithDelay(delayInit, delayMax))
|
||||||
@ -191,7 +191,7 @@ func WithRetryDelay(delayInit, delayMax time.Duration) Opt {
|
|||||||
|
|
||||||
// WithRetryLimit specifies the number of retries for non-fatal errors.
|
// WithRetryLimit specifies the number of retries for non-fatal errors.
|
||||||
//
|
//
|
||||||
// Deprecated: replace with WithRegOpts(reg.WithRetryLimit(retryLimit)).
|
// Deprecated: replace with WithRegOpts(reg.WithRetryLimit(retryLimit)), see [WithRegOpts] and [reg.WithRetryLimit].
|
||||||
func WithRetryLimit(retryLimit int) Opt {
|
func WithRetryLimit(retryLimit int) Opt {
|
||||||
return func(rc *RegClient) {
|
return func(rc *RegClient) {
|
||||||
rc.regOpts = append(rc.regOpts, reg.WithRetryLimit(retryLimit))
|
rc.regOpts = append(rc.regOpts, reg.WithRetryLimit(retryLimit))
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Package scheme defines the interface for various reference schemes
|
// Package scheme defines the interface for various reference schemes.
|
||||||
package scheme
|
package scheme
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@ -14,43 +14,43 @@ import (
|
|||||||
"github.com/regclient/regclient/types/tag"
|
"github.com/regclient/regclient/types/tag"
|
||||||
)
|
)
|
||||||
|
|
||||||
// API is used to interface between different methods to store images
|
// API is used to interface between different methods to store images.
|
||||||
type API interface {
|
type API interface {
|
||||||
// BlobDelete removes a blob from the repository
|
// BlobDelete removes a blob from the repository.
|
||||||
BlobDelete(ctx context.Context, r ref.Ref, d types.Descriptor) error
|
BlobDelete(ctx context.Context, r ref.Ref, d types.Descriptor) error
|
||||||
// BlobGet retrieves a blob, returning a reader
|
// BlobGet retrieves a blob, returning a reader.
|
||||||
BlobGet(ctx context.Context, r ref.Ref, d types.Descriptor) (blob.Reader, error)
|
BlobGet(ctx context.Context, r ref.Ref, d types.Descriptor) (blob.Reader, error)
|
||||||
// BlobHead verifies the existence of a blob, the reader contains the headers but no body to read
|
// BlobHead verifies the existence of a blob, the reader contains the headers but no body to read.
|
||||||
BlobHead(ctx context.Context, r ref.Ref, d types.Descriptor) (blob.Reader, error)
|
BlobHead(ctx context.Context, r ref.Ref, d types.Descriptor) (blob.Reader, error)
|
||||||
// BlobMount attempts to perform a server side copy of the blob
|
// BlobMount attempts to perform a server side copy of the blob.
|
||||||
BlobMount(ctx context.Context, refSrc ref.Ref, refTgt ref.Ref, d types.Descriptor) error
|
BlobMount(ctx context.Context, refSrc ref.Ref, refTgt ref.Ref, d types.Descriptor) error
|
||||||
// BlobPut sends a blob to the repository, returns the digest and size when successful
|
// BlobPut sends a blob to the repository, returns the digest and size when successful.
|
||||||
BlobPut(ctx context.Context, r ref.Ref, d types.Descriptor, rdr io.Reader) (types.Descriptor, error)
|
BlobPut(ctx context.Context, r ref.Ref, d types.Descriptor, rdr io.Reader) (types.Descriptor, error)
|
||||||
|
|
||||||
// ManifestDelete removes a manifest, including all tags that point to that manifest
|
// ManifestDelete removes a manifest, including all tags that point to that manifest.
|
||||||
ManifestDelete(ctx context.Context, r ref.Ref, opts ...ManifestOpts) error
|
ManifestDelete(ctx context.Context, r ref.Ref, opts ...ManifestOpts) error
|
||||||
// ManifestGet retrieves a manifest from a repository
|
// ManifestGet retrieves a manifest from a repository.
|
||||||
ManifestGet(ctx context.Context, r ref.Ref) (manifest.Manifest, error)
|
ManifestGet(ctx context.Context, r ref.Ref) (manifest.Manifest, error)
|
||||||
// ManifestHead gets metadata about the manifest (existence, digest, mediatype, size)
|
// ManifestHead gets metadata about the manifest (existence, digest, mediatype, size).
|
||||||
ManifestHead(ctx context.Context, r ref.Ref) (manifest.Manifest, error)
|
ManifestHead(ctx context.Context, r ref.Ref) (manifest.Manifest, error)
|
||||||
// ManifestPut sends a manifest to the repository
|
// ManifestPut sends a manifest to the repository.
|
||||||
ManifestPut(ctx context.Context, r ref.Ref, m manifest.Manifest, opts ...ManifestOpts) error
|
ManifestPut(ctx context.Context, r ref.Ref, m manifest.Manifest, opts ...ManifestOpts) error
|
||||||
|
|
||||||
// ReferrerList returns a list of referrers to a given reference
|
// ReferrerList returns a list of referrers to a given reference.
|
||||||
ReferrerList(ctx context.Context, r ref.Ref, opts ...ReferrerOpts) (referrer.ReferrerList, error)
|
ReferrerList(ctx context.Context, r ref.Ref, opts ...ReferrerOpts) (referrer.ReferrerList, error)
|
||||||
|
|
||||||
// TagDelete removes a tag from the repository
|
// TagDelete removes a tag from the repository.
|
||||||
TagDelete(ctx context.Context, r ref.Ref) error
|
TagDelete(ctx context.Context, r ref.Ref) error
|
||||||
// TagList returns a list of tags from the repository
|
// TagList returns a list of tags from the repository.
|
||||||
TagList(ctx context.Context, r ref.Ref, opts ...TagOpts) (*tag.List, error)
|
TagList(ctx context.Context, r ref.Ref, opts ...TagOpts) (*tag.List, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Closer is used to check if a scheme implements the Close API
|
// Closer is used to check if a scheme implements the Close API.
|
||||||
type Closer interface {
|
type Closer interface {
|
||||||
Close(ctx context.Context, r ref.Ref) error
|
Close(ctx context.Context, r ref.Ref) error
|
||||||
}
|
}
|
||||||
|
|
||||||
// GCLocker is used to indicate locking is available for GC management
|
// GCLocker is used to indicate locking is available for GC management.
|
||||||
type GCLocker interface {
|
type GCLocker interface {
|
||||||
// GCLock a reference to prevent GC from triggering during a put, locks are not exclusive.
|
// GCLock a reference to prevent GC from triggering during a put, locks are not exclusive.
|
||||||
GCLock(r ref.Ref)
|
GCLock(r ref.Ref)
|
||||||
@ -59,81 +59,81 @@ type GCLocker interface {
|
|||||||
GCUnlock(r ref.Ref)
|
GCUnlock(r ref.Ref)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Throttler is used to indicate the scheme implements Throttle
|
// Throttler is used to indicate the scheme implements Throttle.
|
||||||
type Throttler interface {
|
type Throttler interface {
|
||||||
Throttle(r ref.Ref, put bool) []*throttle.Throttle
|
Throttle(r ref.Ref, put bool) []*throttle.Throttle
|
||||||
}
|
}
|
||||||
|
|
||||||
// ManifestConfig is used by schemes to import ManifestOpts
|
// ManifestConfig is used by schemes to import [ManifestOpts].
|
||||||
type ManifestConfig struct {
|
type ManifestConfig struct {
|
||||||
CheckReferrers bool
|
CheckReferrers bool
|
||||||
Child bool // used when pushing a child of a manifest list, skips indexing in ocidir
|
Child bool // used when pushing a child of a manifest list, skips indexing in ocidir
|
||||||
Manifest manifest.Manifest
|
Manifest manifest.Manifest
|
||||||
}
|
}
|
||||||
|
|
||||||
// ManifestOpts is used to set options on manifest APIs
|
// ManifestOpts is used to set options on manifest APIs.
|
||||||
type ManifestOpts func(*ManifestConfig)
|
type ManifestOpts func(*ManifestConfig)
|
||||||
|
|
||||||
// WithManifestCheckReferrers is used when deleting a manifest
|
// WithManifestCheckReferrers is used when deleting a manifest.
|
||||||
// It indicates the manifest should be fetched and referrers should be deleted if defined
|
// It indicates the manifest should be fetched and referrers should be deleted if defined.
|
||||||
func WithManifestCheckReferrers() ManifestOpts {
|
func WithManifestCheckReferrers() ManifestOpts {
|
||||||
return func(config *ManifestConfig) {
|
return func(config *ManifestConfig) {
|
||||||
config.CheckReferrers = true
|
config.CheckReferrers = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithManifestChild indicates the API call is on a child manifest
|
// WithManifestChild indicates the API call is on a child manifest.
|
||||||
// This is used internally when copying multi-platform manifests
|
// This is used internally when copying multi-platform manifests.
|
||||||
// This bypasses tracking of an untagged digest in ocidir which is needed for garbage collection
|
// This bypasses tracking of an untagged digest in ocidir which is needed for garbage collection.
|
||||||
func WithManifestChild() ManifestOpts {
|
func WithManifestChild() ManifestOpts {
|
||||||
return func(config *ManifestConfig) {
|
return func(config *ManifestConfig) {
|
||||||
config.Child = true
|
config.Child = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithManifest is used to pass the manifest to a method to avoid an extra GET request
|
// WithManifest is used to pass the manifest to a method to avoid an extra GET request.
|
||||||
// This is used on a delete to check for referrers
|
// This is used on a delete to check for referrers.
|
||||||
func WithManifest(m manifest.Manifest) ManifestOpts {
|
func WithManifest(m manifest.Manifest) ManifestOpts {
|
||||||
return func(mc *ManifestConfig) {
|
return func(mc *ManifestConfig) {
|
||||||
mc.Manifest = m
|
mc.Manifest = m
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReferrerConfig is used by schemes to import ReferrerOpts
|
// ReferrerConfig is used by schemes to import [ReferrerOpts].
|
||||||
type ReferrerConfig struct {
|
type ReferrerConfig struct {
|
||||||
MatchOpt types.MatchOpt // filter/sort results
|
MatchOpt types.MatchOpt // filter/sort results
|
||||||
Platform string // get referrers for a specific platform
|
Platform string // get referrers for a specific platform
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReferrerOpts is used to set options on referrer APIs
|
// ReferrerOpts is used to set options on referrer APIs.
|
||||||
type ReferrerOpts func(*ReferrerConfig)
|
type ReferrerOpts func(*ReferrerConfig)
|
||||||
|
|
||||||
// WithReferrerMatchOpt filters results using MatchOpt
|
// WithReferrerMatchOpt filters results using [types.MatchOpt].
|
||||||
func WithReferrerMatchOpt(mo types.MatchOpt) ReferrerOpts {
|
func WithReferrerMatchOpt(mo types.MatchOpt) ReferrerOpts {
|
||||||
return func(config *ReferrerConfig) {
|
return func(config *ReferrerConfig) {
|
||||||
config.MatchOpt = mo
|
config.MatchOpt = mo
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithReferrerPlatform gets referrers for a single platform from a multi-platform manifest
|
// WithReferrerPlatform gets referrers for a single platform from a multi-platform manifest.
|
||||||
func WithReferrerPlatform(p string) ReferrerOpts {
|
func WithReferrerPlatform(p string) ReferrerOpts {
|
||||||
return func(config *ReferrerConfig) {
|
return func(config *ReferrerConfig) {
|
||||||
config.Platform = p
|
config.Platform = p
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithReferrerAT filters by a specific artifactType value
|
// WithReferrerAT filters by a specific artifactType value.
|
||||||
//
|
//
|
||||||
// Deprecated: replace with WithReferrerMatchOpt
|
// Deprecated: replace with [WithReferrerMatchOpt].
|
||||||
func WithReferrerAT(at string) ReferrerOpts {
|
func WithReferrerAT(at string) ReferrerOpts {
|
||||||
return func(config *ReferrerConfig) {
|
return func(config *ReferrerConfig) {
|
||||||
config.MatchOpt.ArtifactType = at
|
config.MatchOpt.ArtifactType = at
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithReferrerAnnotations filters by a list of annotations, all of which must match
|
// WithReferrerAnnotations filters by a list of annotations, all of which must match.
|
||||||
//
|
//
|
||||||
// Deprecated: replace with WithReferrerMatchOpt
|
// Deprecated: replace with [WithReferrerMatchOpt].
|
||||||
func WithReferrerAnnotations(annotations map[string]string) ReferrerOpts {
|
func WithReferrerAnnotations(annotations map[string]string) ReferrerOpts {
|
||||||
return func(config *ReferrerConfig) {
|
return func(config *ReferrerConfig) {
|
||||||
if config.MatchOpt.Annotations == nil {
|
if config.MatchOpt.Annotations == nil {
|
||||||
@ -148,7 +148,7 @@ func WithReferrerAnnotations(annotations map[string]string) ReferrerOpts {
|
|||||||
|
|
||||||
// WithReferrerSort orders the resulting referrers listing according to a specified annotation.
|
// WithReferrerSort orders the resulting referrers listing according to a specified annotation.
|
||||||
//
|
//
|
||||||
// Deprecated: replace with WithReferrerMatchOpt
|
// Deprecated: replace with [WithReferrerMatchOpt].
|
||||||
func WithReferrerSort(annotation string, desc bool) ReferrerOpts {
|
func WithReferrerSort(annotation string, desc bool) ReferrerOpts {
|
||||||
return func(config *ReferrerConfig) {
|
return func(config *ReferrerConfig) {
|
||||||
config.MatchOpt.SortAnnotation = annotation
|
config.MatchOpt.SortAnnotation = annotation
|
||||||
@ -156,7 +156,7 @@ func WithReferrerSort(annotation string, desc bool) ReferrerOpts {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReferrerFilter filters the referrer list according to the config
|
// ReferrerFilter filters the referrer list according to the config.
|
||||||
func ReferrerFilter(config ReferrerConfig, rlIn referrer.ReferrerList) referrer.ReferrerList {
|
func ReferrerFilter(config ReferrerConfig, rlIn referrer.ReferrerList) referrer.ReferrerList {
|
||||||
return referrer.ReferrerList{
|
return referrer.ReferrerList{
|
||||||
Subject: rlIn.Subject,
|
Subject: rlIn.Subject,
|
||||||
@ -167,50 +167,50 @@ func ReferrerFilter(config ReferrerConfig, rlIn referrer.ReferrerList) referrer.
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// RepoConfig is used by schemes to import RepoOpts
|
// RepoConfig is used by schemes to import [RepoOpts].
|
||||||
type RepoConfig struct {
|
type RepoConfig struct {
|
||||||
Limit int
|
Limit int
|
||||||
Last string
|
Last string
|
||||||
}
|
}
|
||||||
|
|
||||||
// RepoOpts is used to set options on repo APIs
|
// RepoOpts is used to set options on repo APIs.
|
||||||
type RepoOpts func(*RepoConfig)
|
type RepoOpts func(*RepoConfig)
|
||||||
|
|
||||||
// WithRepoLimit passes a maximum number of repositories to return to the repository list API
|
// WithRepoLimit passes a maximum number of repositories to return to the repository list API.
|
||||||
// Registries may ignore this
|
// Registries may ignore this.
|
||||||
func WithRepoLimit(l int) RepoOpts {
|
func WithRepoLimit(l int) RepoOpts {
|
||||||
return func(config *RepoConfig) {
|
return func(config *RepoConfig) {
|
||||||
config.Limit = l
|
config.Limit = l
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithRepoLast passes the last received repository for requesting the next batch of repositories
|
// WithRepoLast passes the last received repository for requesting the next batch of repositories.
|
||||||
// Registries may ignore this
|
// Registries may ignore this.
|
||||||
func WithRepoLast(l string) RepoOpts {
|
func WithRepoLast(l string) RepoOpts {
|
||||||
return func(config *RepoConfig) {
|
return func(config *RepoConfig) {
|
||||||
config.Last = l
|
config.Last = l
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TagConfig is used by schemes to import TagOpts
|
// TagConfig is used by schemes to import [TagOpts].
|
||||||
type TagConfig struct {
|
type TagConfig struct {
|
||||||
Limit int
|
Limit int
|
||||||
Last string
|
Last string
|
||||||
}
|
}
|
||||||
|
|
||||||
// TagOpts is used to set options on tag APIs
|
// TagOpts is used to set options on tag APIs.
|
||||||
type TagOpts func(*TagConfig)
|
type TagOpts func(*TagConfig)
|
||||||
|
|
||||||
// WithTagLimit passes a maximum number of tags to return to the tag list API
|
// WithTagLimit passes a maximum number of tags to return to the tag list API.
|
||||||
// Registries may ignore this
|
// Registries may ignore this.
|
||||||
func WithTagLimit(limit int) TagOpts {
|
func WithTagLimit(limit int) TagOpts {
|
||||||
return func(t *TagConfig) {
|
return func(t *TagConfig) {
|
||||||
t.Limit = limit
|
t.Limit = limit
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithTagLast passes the last received tag for requesting the next batch of tags
|
// WithTagLast passes the last received tag for requesting the next batch of tags.
|
||||||
// Registries may ignore this
|
// Registries may ignore this.
|
||||||
func WithTagLast(last string) TagOpts {
|
func WithTagLast(last string) TagOpts {
|
||||||
return func(t *TagConfig) {
|
return func(t *TagConfig) {
|
||||||
t.Last = last
|
t.Last = last
|
||||||
|
@ -31,21 +31,21 @@ func (c *BCommon) GetDescriptor() types.Descriptor {
|
|||||||
|
|
||||||
// Digest returns the provided or calculated digest of the blob.
|
// Digest returns the provided or calculated digest of the blob.
|
||||||
//
|
//
|
||||||
// Deprecated: Digest should be replaced by GetDescriptor().Digest.
|
// Deprecated: Digest should be replaced by GetDescriptor().Digest, see [GetDescriptor].
|
||||||
func (c *BCommon) Digest() digest.Digest {
|
func (c *BCommon) Digest() digest.Digest {
|
||||||
return c.desc.Digest
|
return c.desc.Digest
|
||||||
}
|
}
|
||||||
|
|
||||||
// Length returns the provided or calculated length of the blob.
|
// Length returns the provided or calculated length of the blob.
|
||||||
//
|
//
|
||||||
// Deprecated: Length should be replaced by GetDescriptor().Size.
|
// Deprecated: Length should be replaced by GetDescriptor().Size, see [GetDescriptor].
|
||||||
func (c *BCommon) Length() int64 {
|
func (c *BCommon) Length() int64 {
|
||||||
return c.desc.Size
|
return c.desc.Size
|
||||||
}
|
}
|
||||||
|
|
||||||
// MediaType returns the Content-Type header received from the registry.
|
// MediaType returns the Content-Type header received from the registry.
|
||||||
//
|
//
|
||||||
// Deprecated: MediaType should be replaced by GetDescriptor().MediaType.
|
// Deprecated: MediaType should be replaced by GetDescriptor().MediaType, see [GetDescriptor].
|
||||||
func (c *BCommon) MediaType() string {
|
func (c *BCommon) MediaType() string {
|
||||||
return c.desc.MediaType
|
return c.desc.MediaType
|
||||||
}
|
}
|
||||||
|
@ -17,9 +17,9 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// MediaTypeDocker1Manifest deprecated media type for docker schema1 manifests
|
// MediaTypeDocker1Manifest deprecated media type for docker schema1 manifests.
|
||||||
MediaTypeDocker1Manifest = "application/vnd.docker.distribution.manifest.v1+json"
|
MediaTypeDocker1Manifest = "application/vnd.docker.distribution.manifest.v1+json"
|
||||||
// MediaTypeDocker1ManifestSigned is a deprecated schema1 manifest with jws signing
|
// MediaTypeDocker1ManifestSigned is a deprecated schema1 manifest with jws signing.
|
||||||
MediaTypeDocker1ManifestSigned = "application/vnd.docker.distribution.manifest.v1+prettyjws"
|
MediaTypeDocker1ManifestSigned = "application/vnd.docker.distribution.manifest.v1+prettyjws"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -10,7 +10,7 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
// crypto libraries included for go-digest
|
// Crypto libraries are included for go-digest.
|
||||||
_ "crypto/sha256"
|
_ "crypto/sha256"
|
||||||
_ "crypto/sha512"
|
_ "crypto/sha512"
|
||||||
|
|
||||||
@ -36,40 +36,44 @@ type Manifest interface {
|
|||||||
RawHeaders() (http.Header, error)
|
RawHeaders() (http.Header, error)
|
||||||
SetOrig(interface{}) error
|
SetOrig(interface{}) error
|
||||||
|
|
||||||
// Deprecated: GetConfig should be accessed using Imager interface
|
// Deprecated: GetConfig should be accessed using [Imager] interface.
|
||||||
GetConfig() (types.Descriptor, error)
|
GetConfig() (types.Descriptor, error)
|
||||||
// Deprecated: GetLayers should be accessed using Imager interface
|
// Deprecated: GetLayers should be accessed using [Imager] interface.
|
||||||
GetLayers() ([]types.Descriptor, error)
|
GetLayers() ([]types.Descriptor, error)
|
||||||
|
|
||||||
// Deprecated: GetManifestList should be accessed using Indexer interface
|
// Deprecated: GetManifestList should be accessed using [Indexer] interface.
|
||||||
GetManifestList() ([]types.Descriptor, error)
|
GetManifestList() ([]types.Descriptor, error)
|
||||||
|
|
||||||
// Deprecated: GetConfigDigest should be replaced with GetConfig
|
// Deprecated: GetConfigDigest should be replaced with [GetConfig].
|
||||||
GetConfigDigest() (digest.Digest, error)
|
GetConfigDigest() (digest.Digest, error)
|
||||||
// Deprecated: GetDigest should be replaced with GetDescriptor().Digest
|
// Deprecated: GetDigest should be replaced with GetDescriptor().Digest, see [GetDescriptor].
|
||||||
GetDigest() digest.Digest
|
GetDigest() digest.Digest
|
||||||
// Deprecated: GetMediaType should be replaced with GetDescriptor().MediaType
|
// Deprecated: GetMediaType should be replaced with GetDescriptor().MediaType, see [GetDescriptor].
|
||||||
GetMediaType() string
|
GetMediaType() string
|
||||||
// Deprecated: GetPlatformDesc method should be replaced with manifest.GetPlatformDesc function
|
// Deprecated: GetPlatformDesc method should be replaced with [manifest.GetPlatformDesc].
|
||||||
GetPlatformDesc(p *platform.Platform) (*types.Descriptor, error)
|
GetPlatformDesc(p *platform.Platform) (*types.Descriptor, error)
|
||||||
// Deprecated: GetPlatformList method should be replaced with manifest.GetPlatformList function
|
// Deprecated: GetPlatformList method should be replaced with [manifest.GetPlatformList].
|
||||||
GetPlatformList() ([]*platform.Platform, error)
|
GetPlatformList() ([]*platform.Platform, error)
|
||||||
// Deprecated: GetRateLimit method should be replaced with manifest.GetRateLimit function
|
// Deprecated: GetRateLimit method should be replaced with [manifest.GetRateLimit].
|
||||||
GetRateLimit() types.RateLimit
|
GetRateLimit() types.RateLimit
|
||||||
// Deprecated: HasRateLimit method should be replaced with manifest.HasRateLimit function
|
// Deprecated: HasRateLimit method should be replaced with [manifest.HasRateLimit].
|
||||||
HasRateLimit() bool
|
HasRateLimit() bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Annotator is used by manifests that support annotations.
|
||||||
|
// Note this will work for Docker manifests despite the spec not officially supporting it.
|
||||||
type Annotator interface {
|
type Annotator interface {
|
||||||
GetAnnotations() (map[string]string, error)
|
GetAnnotations() (map[string]string, error)
|
||||||
SetAnnotation(key, val string) error
|
SetAnnotation(key, val string) error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Indexer is used by manifests that contain a manifest list.
|
||||||
type Indexer interface {
|
type Indexer interface {
|
||||||
GetManifestList() ([]types.Descriptor, error)
|
GetManifestList() ([]types.Descriptor, error)
|
||||||
SetManifestList(dl []types.Descriptor) error
|
SetManifestList(dl []types.Descriptor) error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Imager is used by manifests packaging an image.
|
||||||
type Imager interface {
|
type Imager interface {
|
||||||
GetConfig() (types.Descriptor, error)
|
GetConfig() (types.Descriptor, error)
|
||||||
GetLayers() ([]types.Descriptor, error)
|
GetLayers() ([]types.Descriptor, error)
|
||||||
@ -77,6 +81,7 @@ type Imager interface {
|
|||||||
SetLayers(dl []types.Descriptor) error
|
SetLayers(dl []types.Descriptor) error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Subjecter is used by manifests that may have a subject field.
|
||||||
type Subjecter interface {
|
type Subjecter interface {
|
||||||
GetSubject() (*types.Descriptor, error)
|
GetSubject() (*types.Descriptor, error)
|
||||||
SetSubject(d *types.Descriptor) error
|
SetSubject(d *types.Descriptor) error
|
||||||
@ -91,7 +96,7 @@ type manifestConfig struct {
|
|||||||
}
|
}
|
||||||
type Opts func(*manifestConfig)
|
type Opts func(*manifestConfig)
|
||||||
|
|
||||||
// New creates a new manifest based on provided options
|
// New creates a new manifest based on provided options.
|
||||||
func New(opts ...Opts) (Manifest, error) {
|
func New(opts ...Opts) (Manifest, error) {
|
||||||
mc := manifestConfig{}
|
mc := manifestConfig{}
|
||||||
for _, opt := range opts {
|
for _, opt := range opts {
|
||||||
@ -123,54 +128,54 @@ func New(opts ...Opts) (Manifest, error) {
|
|||||||
return fromCommon(c)
|
return fromCommon(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithDesc specifies the descriptor for the manifest
|
// WithDesc specifies the descriptor for the manifest.
|
||||||
func WithDesc(desc types.Descriptor) Opts {
|
func WithDesc(desc types.Descriptor) Opts {
|
||||||
return func(mc *manifestConfig) {
|
return func(mc *manifestConfig) {
|
||||||
mc.desc = desc
|
mc.desc = desc
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithHeader provides the headers from the response when pulling the manifest
|
// WithHeader provides the headers from the response when pulling the manifest.
|
||||||
func WithHeader(header http.Header) Opts {
|
func WithHeader(header http.Header) Opts {
|
||||||
return func(mc *manifestConfig) {
|
return func(mc *manifestConfig) {
|
||||||
mc.header = header
|
mc.header = header
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithOrig provides the original manifest variable
|
// WithOrig provides the original manifest variable.
|
||||||
func WithOrig(orig interface{}) Opts {
|
func WithOrig(orig interface{}) Opts {
|
||||||
return func(mc *manifestConfig) {
|
return func(mc *manifestConfig) {
|
||||||
mc.orig = orig
|
mc.orig = orig
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithRaw provides the manifest bytes or HTTP response body
|
// WithRaw provides the manifest bytes or HTTP response body.
|
||||||
func WithRaw(raw []byte) Opts {
|
func WithRaw(raw []byte) Opts {
|
||||||
return func(mc *manifestConfig) {
|
return func(mc *manifestConfig) {
|
||||||
mc.raw = raw
|
mc.raw = raw
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithRef provides the reference used to get the manifest
|
// WithRef provides the reference used to get the manifest.
|
||||||
func WithRef(r ref.Ref) Opts {
|
func WithRef(r ref.Ref) Opts {
|
||||||
return func(mc *manifestConfig) {
|
return func(mc *manifestConfig) {
|
||||||
mc.r = r
|
mc.r = r
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetDigest returns the digest from the manifest descriptor
|
// GetDigest returns the digest from the manifest descriptor.
|
||||||
func GetDigest(m Manifest) digest.Digest {
|
func GetDigest(m Manifest) digest.Digest {
|
||||||
d := m.GetDescriptor()
|
d := m.GetDescriptor()
|
||||||
return d.Digest
|
return d.Digest
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetMediaType returns the media type from the manifest descriptor
|
// GetMediaType returns the media type from the manifest descriptor.
|
||||||
func GetMediaType(m Manifest) string {
|
func GetMediaType(m Manifest) string {
|
||||||
d := m.GetDescriptor()
|
d := m.GetDescriptor()
|
||||||
return d.MediaType
|
return d.MediaType
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPlatformDesc returns the descriptor for a specific platform from an index
|
// GetPlatformDesc returns the descriptor for a specific platform from an index.
|
||||||
func GetPlatformDesc(m Manifest, p *platform.Platform) (*types.Descriptor, error) {
|
func GetPlatformDesc(m Manifest, p *platform.Platform) (*types.Descriptor, error) {
|
||||||
dl, err := m.GetManifestList()
|
dl, err := m.GetManifestList()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -186,7 +191,7 @@ func GetPlatformDesc(m Manifest, p *platform.Platform) (*types.Descriptor, error
|
|||||||
return &d, nil
|
return &d, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetPlatformList returns the list of platforms from an index
|
// GetPlatformList returns the list of platforms from an index.
|
||||||
func GetPlatformList(m Manifest) ([]*platform.Platform, error) {
|
func GetPlatformList(m Manifest) ([]*platform.Platform, error) {
|
||||||
dl, err := m.GetManifestList()
|
dl, err := m.GetManifestList()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -201,7 +206,7 @@ func GetPlatformList(m Manifest) ([]*platform.Platform, error) {
|
|||||||
return l, nil
|
return l, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetRateLimit returns the current rate limit seen in headers
|
// GetRateLimit returns the current rate limit seen in headers.
|
||||||
func GetRateLimit(m Manifest) types.RateLimit {
|
func GetRateLimit(m Manifest) types.RateLimit {
|
||||||
rl := types.RateLimit{}
|
rl := types.RateLimit{}
|
||||||
header, err := m.RawHeaders()
|
header, err := m.RawHeaders()
|
||||||
@ -248,12 +253,13 @@ func GetRateLimit(m Manifest) types.RateLimit {
|
|||||||
return rl
|
return rl
|
||||||
}
|
}
|
||||||
|
|
||||||
// HasRateLimit indicates whether the rate limit is set and available
|
// HasRateLimit indicates whether the rate limit is set and available.
|
||||||
func HasRateLimit(m Manifest) bool {
|
func HasRateLimit(m Manifest) bool {
|
||||||
rl := GetRateLimit(m)
|
rl := GetRateLimit(m)
|
||||||
return rl.Set
|
return rl.Set
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// OCIIndexFromAny converts manifest lists to an OCI index.
|
||||||
func OCIIndexFromAny(orig interface{}) (v1.Index, error) {
|
func OCIIndexFromAny(orig interface{}) (v1.Index, error) {
|
||||||
ociI := v1.Index{
|
ociI := v1.Index{
|
||||||
Versioned: v1.IndexSchemaVersion,
|
Versioned: v1.IndexSchemaVersion,
|
||||||
@ -271,6 +277,7 @@ func OCIIndexFromAny(orig interface{}) (v1.Index, error) {
|
|||||||
return ociI, nil
|
return ociI, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// OCIIndexToAny converts from an OCI index back to the manifest list.
|
||||||
func OCIIndexToAny(ociI v1.Index, origP interface{}) error {
|
func OCIIndexToAny(ociI v1.Index, origP interface{}) error {
|
||||||
// reflect is used to handle both *interface{} and *Manifest
|
// reflect is used to handle both *interface{} and *Manifest
|
||||||
rv := reflect.ValueOf(origP)
|
rv := reflect.ValueOf(origP)
|
||||||
@ -298,6 +305,7 @@ func OCIIndexToAny(ociI v1.Index, origP interface{}) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// OCIManifestFromAny converts an image manifest to an OCI manifest.
|
||||||
func OCIManifestFromAny(orig interface{}) (v1.Manifest, error) {
|
func OCIManifestFromAny(orig interface{}) (v1.Manifest, error) {
|
||||||
ociM := v1.Manifest{
|
ociM := v1.Manifest{
|
||||||
Versioned: v1.ManifestSchemaVersion,
|
Versioned: v1.ManifestSchemaVersion,
|
||||||
@ -317,6 +325,7 @@ func OCIManifestFromAny(orig interface{}) (v1.Manifest, error) {
|
|||||||
return ociM, nil
|
return ociM, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// OCIManifestToAny converts an OCI manifest back to the image manifest.
|
||||||
func OCIManifestToAny(ociM v1.Manifest, origP interface{}) error {
|
func OCIManifestToAny(ociM v1.Manifest, origP interface{}) error {
|
||||||
// reflect is used to handle both *interface{} and *Manifest
|
// reflect is used to handle both *interface{} and *Manifest
|
||||||
rv := reflect.ValueOf(origP)
|
rv := reflect.ValueOf(origP)
|
||||||
@ -435,6 +444,7 @@ func fromOrig(c common, orig interface{}) (Manifest, error) {
|
|||||||
return m, nil
|
return m, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// fromCommon is used to create a manifest when the underlying manifest struct is not provided.
|
||||||
func fromCommon(c common) (Manifest, error) {
|
func fromCommon(c common) (Manifest, error) {
|
||||||
var err error
|
var err error
|
||||||
var m Manifest
|
var m Manifest
|
||||||
|
@ -3,47 +3,47 @@ package types
|
|||||||
import "strings"
|
import "strings"
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// MediaTypeDocker1Manifest deprecated media type for docker schema1 manifests
|
// MediaTypeDocker1Manifest deprecated media type for docker schema1 manifests.
|
||||||
MediaTypeDocker1Manifest = "application/vnd.docker.distribution.manifest.v1+json"
|
MediaTypeDocker1Manifest = "application/vnd.docker.distribution.manifest.v1+json"
|
||||||
// MediaTypeDocker1ManifestSigned is a deprecated schema1 manifest with jws signing
|
// MediaTypeDocker1ManifestSigned is a deprecated schema1 manifest with jws signing.
|
||||||
MediaTypeDocker1ManifestSigned = "application/vnd.docker.distribution.manifest.v1+prettyjws"
|
MediaTypeDocker1ManifestSigned = "application/vnd.docker.distribution.manifest.v1+prettyjws"
|
||||||
// MediaTypeDocker2Manifest is the media type when pulling manifests from a v2 registry
|
// MediaTypeDocker2Manifest is the media type when pulling manifests from a v2 registry.
|
||||||
MediaTypeDocker2Manifest = "application/vnd.docker.distribution.manifest.v2+json"
|
MediaTypeDocker2Manifest = "application/vnd.docker.distribution.manifest.v2+json"
|
||||||
// MediaTypeDocker2ManifestList is the media type when pulling a manifest list from a v2 registry
|
// MediaTypeDocker2ManifestList is the media type when pulling a manifest list from a v2 registry.
|
||||||
MediaTypeDocker2ManifestList = "application/vnd.docker.distribution.manifest.list.v2+json"
|
MediaTypeDocker2ManifestList = "application/vnd.docker.distribution.manifest.list.v2+json"
|
||||||
// MediaTypeDocker2ImageConfig is for the configuration json object media type
|
// MediaTypeDocker2ImageConfig is for the configuration json object media type.
|
||||||
MediaTypeDocker2ImageConfig = "application/vnd.docker.container.image.v1+json"
|
MediaTypeDocker2ImageConfig = "application/vnd.docker.container.image.v1+json"
|
||||||
// MediaTypeOCI1Artifact EXPERIMENTAL OCI v1 artifact media type
|
// MediaTypeOCI1Artifact EXPERIMENTAL OCI v1 artifact media type.
|
||||||
MediaTypeOCI1Artifact = "application/vnd.oci.artifact.manifest.v1+json"
|
MediaTypeOCI1Artifact = "application/vnd.oci.artifact.manifest.v1+json"
|
||||||
// MediaTypeOCI1Manifest OCI v1 manifest media type
|
// MediaTypeOCI1Manifest OCI v1 manifest media type.
|
||||||
MediaTypeOCI1Manifest = "application/vnd.oci.image.manifest.v1+json"
|
MediaTypeOCI1Manifest = "application/vnd.oci.image.manifest.v1+json"
|
||||||
// MediaTypeOCI1ManifestList OCI v1 manifest list media type
|
// MediaTypeOCI1ManifestList OCI v1 manifest list media type.
|
||||||
MediaTypeOCI1ManifestList = "application/vnd.oci.image.index.v1+json"
|
MediaTypeOCI1ManifestList = "application/vnd.oci.image.index.v1+json"
|
||||||
// MediaTypeOCI1ImageConfig OCI v1 configuration json object media type
|
// MediaTypeOCI1ImageConfig OCI v1 configuration json object media type.
|
||||||
MediaTypeOCI1ImageConfig = "application/vnd.oci.image.config.v1+json"
|
MediaTypeOCI1ImageConfig = "application/vnd.oci.image.config.v1+json"
|
||||||
// MediaTypeDocker2LayerGzip is the default compressed layer for docker schema2
|
// MediaTypeDocker2LayerGzip is the default compressed layer for docker schema2.
|
||||||
MediaTypeDocker2LayerGzip = "application/vnd.docker.image.rootfs.diff.tar.gzip"
|
MediaTypeDocker2LayerGzip = "application/vnd.docker.image.rootfs.diff.tar.gzip"
|
||||||
// MediaTypeDocker2ForeignLayer is the default compressed layer for foreign layers in docker schema2
|
// MediaTypeDocker2ForeignLayer is the default compressed layer for foreign layers in docker schema2.
|
||||||
MediaTypeDocker2ForeignLayer = "application/vnd.docker.image.rootfs.foreign.diff.tar.gzip"
|
MediaTypeDocker2ForeignLayer = "application/vnd.docker.image.rootfs.foreign.diff.tar.gzip"
|
||||||
// MediaTypeOCI1Layer is the uncompressed layer for OCIv1
|
// MediaTypeOCI1Layer is the uncompressed layer for OCIv1.
|
||||||
MediaTypeOCI1Layer = "application/vnd.oci.image.layer.v1.tar"
|
MediaTypeOCI1Layer = "application/vnd.oci.image.layer.v1.tar"
|
||||||
// MediaTypeOCI1LayerGzip is the gzip compressed layer for OCI v1
|
// MediaTypeOCI1LayerGzip is the gzip compressed layer for OCI v1.
|
||||||
MediaTypeOCI1LayerGzip = "application/vnd.oci.image.layer.v1.tar+gzip"
|
MediaTypeOCI1LayerGzip = "application/vnd.oci.image.layer.v1.tar+gzip"
|
||||||
// MediaTypeOCI1LayerZstd is the zstd compressed layer for OCI v1
|
// MediaTypeOCI1LayerZstd is the zstd compressed layer for OCI v1.
|
||||||
MediaTypeOCI1LayerZstd = "application/vnd.oci.image.layer.v1.tar+zstd"
|
MediaTypeOCI1LayerZstd = "application/vnd.oci.image.layer.v1.tar+zstd"
|
||||||
// MediaTypeOCI1ForeignLayer is the foreign layer for OCI v1
|
// MediaTypeOCI1ForeignLayer is the foreign layer for OCI v1.
|
||||||
MediaTypeOCI1ForeignLayer = "application/vnd.oci.image.layer.nondistributable.v1.tar"
|
MediaTypeOCI1ForeignLayer = "application/vnd.oci.image.layer.nondistributable.v1.tar"
|
||||||
// MediaTypeOCI1ForeignLayerGzip is the gzip compressed foreign layer for OCI v1
|
// MediaTypeOCI1ForeignLayerGzip is the gzip compressed foreign layer for OCI v1.
|
||||||
MediaTypeOCI1ForeignLayerGzip = "application/vnd.oci.image.layer.nondistributable.v1.tar+gzip"
|
MediaTypeOCI1ForeignLayerGzip = "application/vnd.oci.image.layer.nondistributable.v1.tar+gzip"
|
||||||
// MediaTypeOCI1ForeignLayerZstd is the zstd compressed foreign layer for OCI v1
|
// MediaTypeOCI1ForeignLayerZstd is the zstd compressed foreign layer for OCI v1.
|
||||||
MediaTypeOCI1ForeignLayerZstd = "application/vnd.oci.image.layer.nondistributable.v1.tar+zstd"
|
MediaTypeOCI1ForeignLayerZstd = "application/vnd.oci.image.layer.nondistributable.v1.tar+zstd"
|
||||||
// MediaTypeOCI1Empty is used for blobs containing the empty JSON data `{}`
|
// MediaTypeOCI1Empty is used for blobs containing the empty JSON data `{}`.
|
||||||
MediaTypeOCI1Empty = "application/vnd.oci.empty.v1+json"
|
MediaTypeOCI1Empty = "application/vnd.oci.empty.v1+json"
|
||||||
// MediaTypeBuildkitCacheConfig is used by buildkit cache images
|
// MediaTypeBuildkitCacheConfig is used by buildkit cache images.
|
||||||
MediaTypeBuildkitCacheConfig = "application/vnd.buildkit.cacheconfig.v0"
|
MediaTypeBuildkitCacheConfig = "application/vnd.buildkit.cacheconfig.v0"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MediaTypeBase cleans the Content-Type header to return only the lower case base media type
|
// MediaTypeBase cleans the Content-Type header to return only the lower case base media type.
|
||||||
func MediaTypeBase(orig string) string {
|
func MediaTypeBase(orig string) string {
|
||||||
base, _, _ := strings.Cut(orig, ";")
|
base, _, _ := strings.Cut(orig, ";")
|
||||||
return strings.TrimSpace(strings.ToLower(base))
|
return strings.TrimSpace(strings.ToLower(base))
|
||||||
|
Reference in New Issue
Block a user