func ParseReference()

in lambda/s3/transport.go [51:89]


func ParseReference(refString string) (types.ImageReference, error) {
	if refString == "" {
		return nil, errors.New("s3 reference cannot be empty")
	}
	parts := strings.SplitN(refString, ":", 2)
	s3uri, err := tarfile.ParseS3Uri("s3:" + parts[0])
	if err != nil {
		return nil, err
	}
	var nt reference.NamedTagged
	sourceIndex := -1

	if len(parts) == 2 {
		// A :tag or :@index was specified.
		if len(parts[1]) > 0 && parts[1][0] == '@' {
			i, err := strconv.Atoi(parts[1][1:])
			if err != nil {
				return nil, errors.Wrapf(err, "Invalid source index %s", parts[1])
			}
			if i < 0 {
				return nil, errors.Errorf("Invalid source index @%d: must not be negative", i)
			}
			sourceIndex = i
		} else {
			ref, err := reference.ParseNormalizedNamed(parts[1])
			if err != nil {
				return nil, errors.Wrapf(err, "s3 parsing reference")
			}
			ref = reference.TagNameOnly(ref)
			refTagged, isTagged := ref.(reference.NamedTagged)
			if !isTagged { // If ref contains a digest, TagNameOnly does not change it
				return nil, errors.Errorf("reference does not include a tag: %s", ref.String())
			}
			nt = refTagged
		}
	}

	return newReference(s3uri, nt, sourceIndex)
}