reference.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package registry
  2. import (
  3. "strings"
  4. "github.com/docker/distribution/digest"
  5. )
  6. // Reference represents a tag or digest within a repository
  7. type Reference interface {
  8. // HasDigest returns whether the reference has a verifiable
  9. // content addressable reference which may be considered secure.
  10. HasDigest() bool
  11. // ImageName returns an image name for the given repository
  12. ImageName(string) string
  13. // Returns a string representation of the reference
  14. String() string
  15. }
  16. type tagReference struct {
  17. tag string
  18. }
  19. func (tr tagReference) HasDigest() bool {
  20. return false
  21. }
  22. func (tr tagReference) ImageName(repo string) string {
  23. return repo + ":" + tr.tag
  24. }
  25. func (tr tagReference) String() string {
  26. return tr.tag
  27. }
  28. type digestReference struct {
  29. digest digest.Digest
  30. }
  31. func (dr digestReference) HasDigest() bool {
  32. return true
  33. }
  34. func (dr digestReference) ImageName(repo string) string {
  35. return repo + "@" + dr.String()
  36. }
  37. func (dr digestReference) String() string {
  38. return dr.digest.String()
  39. }
  40. // ParseReference parses a reference into either a digest or tag reference
  41. func ParseReference(ref string) Reference {
  42. if strings.Contains(ref, ":") {
  43. dgst, err := digest.ParseDigest(ref)
  44. if err == nil {
  45. return digestReference{digest: dgst}
  46. }
  47. }
  48. return tagReference{tag: ref}
  49. }
  50. // DigestReference creates a digest reference using a digest
  51. func DigestReference(dgst digest.Digest) Reference {
  52. return digestReference{digest: dgst}
  53. }