func TarDirectory()

in command-runner/internal/containers/shared/tar.go [21:69]


func TarDirectory(ctx context.Context, srcPath string, dstDir string, useGitIgnore bool, uid int, gid int) (*os.File, error) {
	tarFile, err := os.CreateTemp(fs.TmpDir(), "tardir")
	if err != nil {
		return nil, err
	}
	tw := tar.NewWriter(tarFile)

	srcPrefix := filepath.Dir(srcPath)
	if !strings.HasSuffix(srcPrefix, string(filepath.Separator)) {
		srcPrefix += string(filepath.Separator)
	}
	log.Ctx(ctx).Printf("Stripping prefix:%s src:%s", srcPrefix, srcPath)

	var ignorer gitignore.Matcher
	if useGitIgnore {
		ps, err := gitignore.ReadPatterns(polyfill.New(osfs.New(srcPath)), nil)
		if err != nil {
			log.Ctx(ctx).Printf("Error loading .gitignore: %v", err)
		}

		ignorer = gitignore.NewMatcher(ps)
	}

	fc := &fs.FileCollector{
		Fs:        &fs.DefaultFs{},
		Ignorer:   ignorer,
		SrcPath:   srcPath,
		SrcPrefix: srcPrefix,
		Handler: &fs.TarCollector{
			TarWriter: tw,
			UID:       uid,
			GID:       gid,
			DstDir:    dstDir,
		},
	}

	err = filepath.Walk(srcPath, fc.CollectFiles(ctx, []string{}))
	if err != nil {
		return nil, err
	}
	if err := tw.Close(); err != nil {
		return nil, err
	}
	_, err = tarFile.Seek(0, 0)
	if err != nil {
		return nil, fmt.Errorf("failed to seek tar archive: %w", err)
	}
	return tarFile, nil
}