func Check()

in cmd/hub/storage/read.go [60:177]


func Check(paths []string, kind string) (*Files, []error) {
	errs := make([]error, 0)

	files := make([]File, 0, len(paths))
	for _, path := range paths {
		file, err := checkPath(path, kind)
		if err != nil {
			errs = append(errs, err)
		} else {
			files = append(files, *file)
		}
	}

	filesChecked := make([]File, 0, len(files))
	for _, file := range files {
		lockPath := fmt.Sprintf("%s.lock", file.Path)
		switch file.Kind {
		case "fs":
			info, err := os.Stat(file.Path)
			_, errLock := os.Stat(lockPath)
			if err != nil {
				if util.NoSuchFile(err) {
					file.Exist = false
					file.Locked = errLock == nil
					filesChecked = append(filesChecked, file)
				} else {
					util.Warn("Unable to stat `%s` %s file: %v", file.Path, kind, err)
				}
			} else {
				file.Exist = true
				file.ModTime = info.ModTime()
				file.Size = info.Size()
				file.Locked = errLock == nil
				filesChecked = append(filesChecked, file)
			}

		case "s3":
			if config.Debug {
				log.Printf("Checking `%s` %s file...", file.Path, kind)
			}
			size, modTime, err := aws.StatS3(file.Path)
			_, _, errLock := aws.StatS3(lockPath)
			if err != nil {
				if err == os.ErrNotExist {
					file.Exist = false
					file.Locked = errLock == nil
					filesChecked = append(filesChecked, file)
				} else {
					util.Warn("Unable to check `%s` %s file: %v", file.Path, kind, err)
				}
			} else {
				file.Exist = true
				file.ModTime = modTime
				file.Size = size
				file.Locked = errLock == nil
				filesChecked = append(filesChecked, file)
			}

		case "gs":
			if config.Debug {
				log.Printf("Checking `%s` %s file...", file.Path, kind)
			}
			size, modTime, err := gcp.StatGCS(file.Path)
			_, _, errLock := gcp.StatGCS(lockPath)
			if err != nil {
				if err == os.ErrNotExist {
					file.Exist = false
					file.Locked = errLock == nil
					filesChecked = append(filesChecked, file)
				} else {
					util.Warn("Unable to check `%s` %s file: %v", file.Path, kind, err)
				}
			} else {
				file.Exist = true
				file.ModTime = modTime
				file.Size = size
				file.Locked = errLock == nil
				filesChecked = append(filesChecked, file)
			}

		case "az":
			if config.Debug {
				log.Printf("Checking `%s` %s file...", file.Path, kind)
			}
			size, modTime, err := azure.StatStorageBlob(file.Path)
			_, _, errLock := azure.StatStorageBlob(lockPath)
			if err != nil {
				if err == os.ErrNotExist {
					file.Exist = false
					file.Locked = errLock == nil
					filesChecked = append(filesChecked, file)
				} else {
					util.Warn("Unable to check `%s` %s file: %v", file.Path, kind, err)
				}
			} else {
				file.Exist = true
				file.ModTime = modTime
				file.Size = size
				file.Locked = errLock == nil
				filesChecked = append(filesChecked, file)
			}
		}
	}

	if len(filesChecked) == 0 {
		return nil, append(errs, fmt.Errorf("No usable %s file found", kind))
	}

	if len(filesChecked) > 0 && (config.Trace || (config.Debug && kind != "manifest")) {
		printFiles(filesChecked, kind)
	}

	if len(errs) == 0 {
		errs = nil
	}

	return &Files{Kind: kind, Files: filesChecked}, errs
}