Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions pkg/name/digest.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ type Digest struct {
Repository
digest string
original string
tag *string
}

var _ Reference = (*Digest)(nil)
Expand Down Expand Up @@ -64,6 +65,15 @@ func (d Digest) String() string {
return d.original
}

// MaybeTagStr returns the tag string (if one was provided). Use bool return value to determine if a tag was present.
func (d Digest) MaybeTagStr() (string, bool) {
if d.tag != nil {
return *d.tag, true
} else {
return "", false
}
}

// MarshalJSON formats the digest into a string for JSON serialization.
func (d Digest) MarshalJSON() ([]byte, error) {
return json.Marshal(d.String())
Expand Down Expand Up @@ -116,8 +126,17 @@ func NewDigest(name string, opts ...Option) (Digest, error) {
return Digest{}, err
}

var tagStr *string
tag, err := NewTag(base, opts...)
if err == nil {

// Check and see if the TagStr was provided in the original base
// If not then it's a default tag and should be ignored
maybeTag := tag.TagStr()
if strings.HasSuffix(base, tagDelim+maybeTag) {
tagStr = &maybeTag
}

base = tag.Repository.Name()
}

Expand All @@ -129,5 +148,6 @@ func NewDigest(name string, opts ...Option) (Digest, error) {
Repository: repo,
digest: dig,
original: name,
tag: tagStr,
}, nil
}
49 changes: 49 additions & 0 deletions pkg/name/digest_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,15 @@ func TestDigestComponents(t *testing.T) {
if actualDigest != validDigest {
t.Errorf("DigestStr() was incorrect for %v. Wanted: `%s` Got: `%s`", digest, validDigest, actualDigest)
}

expectedTagStr := ""
expectedOk := false

tagStr, ok := digest.MaybeTagStr()
if tagStr != expectedTagStr || ok != expectedOk {
t.Errorf("MaybeTagStr() was incorrect for %v. Wanted: (`%s`, `%t`) Got: (`%s`, `%t`)", digest, expectedTagStr, expectedOk, tagStr, ok)
}

}

func TestDigestScopes(t *testing.T) {
Expand All @@ -154,6 +163,46 @@ func TestDigestScopes(t *testing.T) {
}
}

func TestMaybeTagStr(t *testing.T) {
t.Parallel()

testRegistry := "gcr.io"
testRepo := "project-id/image"
testTag := "1.0"

validations := map[string]Option{"strict": StrictValidation, "weak": WeakValidation}

digestNameStrWithTag := testRegistry + "/" + testRepo + ":" + testTag + "@" + validDigest
for valName, opt := range validations {
digest, err := NewDigest(digestNameStrWithTag, opt)
if err != nil {
t.Fatalf("`%s` should be a valid Digest name with validation: `%s`, got error: %v", digestNameStrWithTag, valName, err)
}

tagStr, ok := digest.MaybeTagStr()
expectedTagStr := testTag
expectedOk := true
if tagStr != expectedTagStr || ok != expectedOk {
t.Errorf("MaybeTagStr() was incorrect for %v with validation: `%s`. Wanted: (`%s`, `%t`) Got: (`%s`, `%t`)", digest, valName, expectedTagStr, expectedOk, tagStr, ok)
}
}

digestNameStrWithoutTag := testRegistry + "/" + testRepo + "@" + validDigest
for valName, opt := range validations {
digest, err := NewDigest(digestNameStrWithoutTag, opt)
if err != nil {
t.Fatalf("`%s` should be a valid Digest name with validation: `%s`, got error: %v", digestNameStrWithoutTag, valName, err)
}

tagStr, ok := digest.MaybeTagStr()
expectedTagStr := ""
expectedOk := false
if tagStr != expectedTagStr || ok != expectedOk {
t.Errorf("MaybeTagStr() was incorrect for %v with validation: `%s`. Wanted: (`%s`, `%t`) Got: (`%s`, `%t`)", digest, valName, expectedTagStr, expectedOk, tagStr, ok)
}
}
}

func TestJSON(t *testing.T) {
t.Parallel()
digestNameStr := "gcr.io/project-id/image@" + validDigest
Expand Down