func()

in container_images/registry-image-forked/commands/in.go [51:126]


func (i *In) Execute() error {
	setupLogging(i.stderr)

	var req resource.InRequest
	decoder := json.NewDecoder(i.stdin)
	decoder.DisallowUnknownFields()
	err := decoder.Decode(&req)
	if err != nil {
		return fmt.Errorf("invalid payload: %s", err)
	}

	if req.Source.Debug {
		logrus.SetLevel(logrus.DebugLevel)
	}

	if len(i.args) < 2 {
		return fmt.Errorf("destination path not specified")
	}

	dest := i.args[1]

	if req.Source.AwsAccessKeyID != "" && req.Source.AwsSecretAccessKey != "" && req.Source.AwsRegion != "" {
		if !req.Source.AuthenticateToECR() {
			return fmt.Errorf("cannot authenticate with ECR")
		}
	}

	repo, err := req.Source.NewRepository()
	if err != nil {
		return fmt.Errorf("failed to resolve repository: %w", err)
	}

	tag := repo.Tag(req.Version.Tag)

	if !req.Params.SkipDownload {
		mirrorSource, hasMirror, err := req.Source.Mirror()
		if err != nil {
			return fmt.Errorf("failed to resolve mirror: %w", err)
		}

		usedMirror := false
		if hasMirror {
			err := downloadWithRetry(tag, mirrorSource, req.Params, req.Version, dest, i.stderr)
			if err != nil {
				logrus.Warnf("download from mirror %s failed: %s", mirrorSource.Repository, err)
			} else {
				usedMirror = true
			}
		}

		if !usedMirror {
			err := downloadWithRetry(tag, req.Source, req.Params, req.Version, dest, i.stderr)
			if err != nil {
				return fmt.Errorf("download failed: %w", err)
			}
		}
	}

	err = saveVersionInfo(dest, req.Version, req.Source.Repository)
	if err != nil {
		return fmt.Errorf("saving version info failed: %w", err)
	}

	err = json.NewEncoder(os.Stdout).Encode(resource.InResponse{
		Version: req.Version,
		Metadata: append(req.Source.Metadata(), resource.MetadataField{
			Name:  "tag",
			Value: req.Version.Tag,
		}),
	})
	if err != nil {
		return fmt.Errorf("could not marshal JSON: %s", err)
	}

	return nil
}