func FileCache()

in codecatalyst-runner/pkg/workflows/file_cache.go [17:72]


func FileCache(workingDir string, fileCaching FileCaching, cacheDirProvider FileCacheDirProvider) runner.Feature {
	return func(ctx context.Context, plan runner.Plan, e runner.PlanExecutor) error {
		log.Ctx(ctx).Debug().Msg("ENTER FileCache")

		cacheDir, err := cacheDirProvider(ctx, plan)
		if err != nil {
			return err
		}

		envCfg := plan.EnvironmentConfiguration()
		for key, entry := range fileCaching {
			cachePath := fmt.Sprintf("%s%s", filepath.Join(cacheDir, "caches", key), string(filepath.Separator))
			containerWorkingDir := filepath.Join("git", "v1", filepath.Base(workingDir))
			var hostSourcePath, hostTargetPath, containerSourcePath, containerTargetPath string
			hostSourcePath = fmt.Sprintf("%s.", cachePath)
			hostTargetPath = cachePath
			if !filepath.IsAbs(entry.Path) {
				containerSourcePath = filepath.Join(containerWorkingDir, entry.Path)
			} else {
				containerSourcePath = entry.Path
			}
			containerTargetPath = filepath.Dir(containerSourcePath) + "/"

			var isBound bool
			if _, err := os.Stat(cachePath); err == nil {
				log.Ctx(ctx).Debug().Msgf("📦 Restoring from cache %s", cachePath)
				if path, err := os.Stat(filepath.Join(cachePath, filepath.Base(entry.Path))); err == nil && path.IsDir() {
					envCfg.FileMaps = append(envCfg.FileMaps, &runner.FileMap{
						Type:       runner.FileMapTypeBind,
						SourcePath: filepath.Join(cachePath, filepath.Base(entry.Path)),
						TargetPath: containerSourcePath,
					})
					isBound = true
				} else {
					envCfg.FileMaps = append(envCfg.FileMaps, &runner.FileMap{
						Type:       runner.FileMapTypeCopyIn,
						SourcePath: hostSourcePath,
						TargetPath: containerTargetPath,
					})
				}
			} else if !os.IsNotExist(err) {
				return err
			}
			if !isBound {
				envCfg.FileMaps = append(envCfg.FileMaps, &runner.FileMap{
					Type:       runner.FileMapTypeCopyOut,
					SourcePath: containerSourcePath,
					TargetPath: hostTargetPath,
				})
			}
		}
		err = e(ctx)
		log.Ctx(ctx).Debug().Msg("EXIT FileCache")
		return err
	}
}