MCPcopy
hub / github.com/helm/helm / ValidateReference

Method ValidateReference

pkg/registry/client.go:845–910  ·  view source on GitHub ↗

ValidateReference for path and version

(ref, version string, u *url.URL)

Source from the content-addressed store, hash-verified

843
844// ValidateReference for path and version
845func (c *Client) ValidateReference(ref, version string, u *url.URL) (string, *url.URL, error) {
846 var tag string
847
848 registryReference, err := newReference(u.Host + u.Path)
849 if err != nil {
850 return "", nil, err
851 }
852
853 if version == "" {
854 // Use OCI URI tag as default
855 version = registryReference.Tag
856 } else {
857 if registryReference.Tag != "" && registryReference.Tag != version {
858 return "", nil, fmt.Errorf("chart reference and version mismatch: %s is not %s", version, registryReference.Tag)
859 }
860 }
861
862 if registryReference.Digest != "" {
863 if version == "" {
864 // Install by digest only
865 return "", u, nil
866 }
867 u.Path = fmt.Sprintf("%s@%s", registryReference.Repository, registryReference.Digest)
868
869 // Validate the tag if it was specified
870 path := registryReference.Registry + "/" + registryReference.Repository + ":" + version
871 desc, err := c.Resolve(path)
872 if err != nil {
873 // The resource does not have to be tagged when digest is specified
874 return "", u, nil
875 }
876 if desc.Digest.String() != registryReference.Digest {
877 return "", nil, fmt.Errorf("chart reference digest mismatch: %s is not %s", desc.Digest.String(), registryReference.Digest)
878 }
879 return registryReference.Digest, u, nil
880 }
881
882 // Evaluate whether an explicit version has been provided. Otherwise, determine version to use
883 _, errSemVer := semver.NewVersion(version)
884 if errSemVer == nil {
885 tag = version
886 } else {
887 // Retrieve list of repository tags
888 tags, err := c.Tags(strings.TrimPrefix(ref, OCIScheme+"://"))
889 if err != nil {
890 return "", nil, err
891 }
892 if len(tags) == 0 {
893 return "", nil, fmt.Errorf("unable to locate any tags in provided repository: %s", ref)
894 }
895
896 // Determine if version provided
897 // If empty, try to get the highest available tag
898 // If exact version, try to find it
899 // If semver constraint string, try to find a match
900 tag, err = GetTagMatchingVersionOrConstraint(tags, version)
901 if err != nil {
902 return "", nil, err

Callers 1

ResolveChartVersionMethod · 0.80

Calls 5

ResolveMethod · 0.95
TagsMethod · 0.95
newReferenceFunction · 0.85
StringMethod · 0.45

Tested by

no test coverage detected