Files
Jan Rodák c70c0ac13e refactor: Modularize binding build functions
- Split the monolithic Build() function into focused helper functions.
- Add a TempFileManager for proper temporary file lifecycle management.

This refactoring is in preparation for implementing a local build API.

Signed-off-by: Jan Rodák <hony.com@seznam.cz>
2025-09-09 14:49:45 +02:00

83 lines
2.6 KiB
Go

package remote_build_helpers
import (
"errors"
"fmt"
"io"
"os"
"github.com/sirupsen/logrus"
)
// TempFileManager manages temporary files created during image build.
// It maintains a list of created temporary files and provides cleanup functionality
// to ensure proper resource management.
type TempFileManager struct {
files []string
}
func NewTempFileManager() *TempFileManager {
return &TempFileManager{}
}
func (t *TempFileManager) AddFile(filename string) {
t.files = append(t.files, filename)
}
func (t *TempFileManager) Cleanup() {
for _, file := range t.files {
if err := os.Remove(file); err != nil && !errors.Is(err, os.ErrNotExist) {
logrus.Errorf("Failed to remove temp file %s: %v", file, err)
}
}
t.files = t.files[:0] // Reset slice
}
// CreateTempFileFromReader creates a temporary file in the specified destination directory
// with the given pattern, and copies content from the provided reader into the file.
// The created temporary file is automatically added to the manager's cleanup list.
//
// Parameters:
// - dest: The directory where the temporary file should be created
// - pattern: The pattern for naming the temporary file
// - reader: The io.Reader from which to read content to write into the temporary file
//
// Returns:
// - string: The path to the created temporary file
// - error: Any error encountered during the operation
func (t *TempFileManager) CreateTempFileFromReader(dest string, pattern string, reader io.Reader) (string, error) {
tmpFile, err := os.CreateTemp(dest, pattern)
if err != nil {
return "", fmt.Errorf("creating temp file: %w", err)
}
defer tmpFile.Close()
t.AddFile(tmpFile.Name())
if _, err := io.Copy(tmpFile, reader); err != nil {
return "", fmt.Errorf("copying stdin content: %w", err)
}
return tmpFile.Name(), nil
}
// CreateTempSecret creates a temporary copy of a secret file in the specified
// context directory. The original secret file is copied to a new temporary file
// which is automatically added to the manager's cleanup list.
//
// Parameters:
// - secretPath: The path to the source secret file to copy
// - contextDir: The directory where the temporary secret file should be created
//
// Returns:
// - string: The path to the created temporary secret file
// - error: Any error encountered during the operation
func (t *TempFileManager) CreateTempSecret(secretPath, contextDir string) (string, error) {
secretFile, err := os.Open(secretPath)
if err != nil {
return "", fmt.Errorf("opening secret file %s: %w", secretPath, err)
}
defer secretFile.Close()
return t.CreateTempFileFromReader(contextDir, "podman-build-secret-*", secretFile)
}