← back to dpopsuev__mirage

Function bodies 16 total

All specs Real LLM only Function bodies
DiffDirs function · go · L15-L38 (24 LOC)
helpers.go
func DiffDirs(lower, upper string) ([]Change, error) {
	var changes []Change
	err := filepath.Walk(upper, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return err
		}
		if path == upper || info.IsDir() {
			return nil
		}
		rel, _ := filepath.Rel(upper, path)

		kind := Created
		if _, statErr := os.Stat(filepath.Join(lower, rel)); statErr == nil {
			kind = Modified
		}
		changes = append(changes, Change{
			Path: rel,
			Kind: kind,
			Size: info.Size(),
		})
		return nil
	})
	return changes, err
}
CommitFiles function · go · L41-L59 (19 LOC)
helpers.go
func CommitFiles(upper, lower string, paths []string) error {
	for _, p := range paths {
		src := filepath.Join(upper, p)
		dst := filepath.Join(lower, p)

		data, err := os.ReadFile(src) //nolint:gosec // path from controlled overlay
		if err != nil {
			return fmt.Errorf("mirage: commit read %s: %w", p, err)
		}
		if err := os.MkdirAll(filepath.Dir(dst), 0o755); err != nil {
			return fmt.Errorf("mirage: commit mkdir: %w", err)
		}
		info, _ := os.Stat(src) //nolint:gosec // path from controlled overlay
		if err := os.WriteFile(dst, data, info.Mode()); err != nil {
			return fmt.Errorf("mirage: commit write %s: %w", p, err)
		}
	}
	return nil
}
Create function · go · L10-L32 (23 LOC)
mirage.go
func Create(spec Spec) (Space, error) {
	if err := spec.Validate(); err != nil {
		return nil, err
	}

	slog.Info("mirage: creating space",
		slog.String("workspace", spec.Workspace),
		slog.String("backend", string(spec.Backend)),
	)

	switch spec.Backend {
	case Overlay:
		return createOverlay(spec)
	case Stub:
		return createStub(spec), nil
	case Container:
		return nil, fmt.Errorf("%w: container backend not yet implemented", ErrUnknownBackend)
	case Sandbox:
		return nil, fmt.Errorf("%w: sandbox backend not yet implemented", ErrUnknownBackend)
	default:
		return nil, fmt.Errorf("%w: %s", ErrUnknownBackend, spec.Backend)
	}
}
NewOverlayBuilder function · go · L32-L34 (3 LOC)
overlay.go
func NewOverlayBuilder() *OverlayBuilder {
	return &OverlayBuilder{}
}
createOverlay function · go · L37-L40 (4 LOC)
overlay.go
func createOverlay(spec Spec) (Space, error) {
	b := NewOverlayBuilder()
	return b.Create(spec.Workspace)
}
Create method · go · L45-L90 (46 LOC)
overlay.go
func (b *OverlayBuilder) Create(workspace string) (Space, error) {
	info, err := os.Stat(workspace)
	if err != nil {
		return nil, fmt.Errorf("mirage: workspace: %w", err)
	}
	if !info.IsDir() {
		return nil, fmt.Errorf("%w: %s", ErrNotDirectory, workspace)
	}

	if _, err := exec.LookPath("fuse-overlayfs"); err != nil {
		return nil, ErrFuseNotAvailable
	}

	tempDir, err := os.MkdirTemp("", "mirage-*")
	if err != nil {
		return nil, fmt.Errorf("mirage: temp dir: %w", err)
	}

	upper := filepath.Join(tempDir, "upper")
	work := filepath.Join(tempDir, "work")
	merged := filepath.Join(tempDir, "merged")

	for _, d := range []string{upper, work, merged} {
		if err := os.MkdirAll(d, 0o755); err != nil {
			os.RemoveAll(tempDir) //nolint:errcheck // best-effort cleanup
			return nil, fmt.Errorf("mirage: mkdir %s: %w", d, err)
		}
	}

	cmd := exec.Command("fuse-overlayfs", //nolint:gosec // paths are controlled
		"-o", fmt.Sprintf("lowerdir=%s,upperdir=%s,workdir=%s", workspace, upper, work),
Diff method · go · L106-L138 (33 LOC)
overlay.go
func (s *overlaySpace) Diff() ([]Change, error) {
	s.mu.Lock()
	defer s.mu.Unlock()

	if !s.mounted {
		return nil, ErrNotMounted
	}

	var changes []Change
	err := filepath.Walk(s.upper, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return err
		}
		if path == s.upper || info.IsDir() {
			return nil
		}

		rel, _ := filepath.Rel(s.upper, path)

		kind := Created
		if _, statErr := os.Stat(filepath.Join(s.lower, rel)); statErr == nil {
			kind = Modified
		}

		changes = append(changes, Change{
			Path: rel,
			Kind: kind,
			Size: info.Size(),
		})
		return nil
	})
	return changes, err
}
Repobility · code-quality intelligence · https://repobility.com
Commit method · go · L140-L167 (28 LOC)
overlay.go
func (s *overlaySpace) Commit(paths []string) error {
	s.mu.Lock()
	defer s.mu.Unlock()

	if !s.mounted {
		return ErrNotMounted
	}

	for _, p := range paths {
		src := filepath.Join(s.upper, p)
		dst := filepath.Join(s.lower, p)

		data, err := os.ReadFile(src) //nolint:gosec // path from controlled overlay
		if err != nil {
			return fmt.Errorf("mirage: commit read %s: %w", p, err)
		}

		if err := os.MkdirAll(filepath.Dir(dst), 0o755); err != nil {
			return fmt.Errorf("mirage: commit mkdir: %w", err)
		}

		info, _ := os.Stat(src) //nolint:gosec // path from controlled overlay
		if err := os.WriteFile(dst, data, info.Mode()); err != nil {
			return fmt.Errorf("mirage: commit write %s: %w", p, err)
		}
	}
	return nil
}
Reset method · go · L169-L182 (14 LOC)
overlay.go
func (s *overlaySpace) Reset() error {
	s.mu.Lock()
	defer s.mu.Unlock()

	if !s.mounted {
		return ErrNotMounted
	}

	// Remove all files in upper, recreate the directory.
	if err := os.RemoveAll(s.upper); err != nil {
		return fmt.Errorf("mirage: reset upper: %w", err)
	}
	return os.MkdirAll(s.upper, 0o755)
}
Destroy method · go · L184-L201 (18 LOC)
overlay.go
func (s *overlaySpace) Destroy() error {
	s.mu.Lock()
	defer s.mu.Unlock()

	if !s.mounted {
		return nil
	}
	s.mounted = false

	// Unmount fuse-overlayfs.
	if out, err := exec.Command("fusermount3", "-u", s.merged).CombinedOutput(); err != nil { //nolint:gosec // path controlled
		if out2, err2 := exec.Command("fusermount", "-u", s.merged).CombinedOutput(); err2 != nil { //nolint:gosec // path controlled
			return fmt.Errorf("%w: %s / %s", ErrUnmountFailed, out, out2)
		}
	}

	return os.RemoveAll(s.tempDir)
}
Validate method · go · L41-L54 (14 LOC)
spec.go
func (s Spec) Validate() error {
	if s.Workspace == "" {
		return ErrWorkspaceRequired
	}
	if s.Backend == "" {
		return ErrBackendRequired
	}
	switch s.Backend {
	case Overlay, Container, Sandbox, Stub:
		return nil
	default:
		return ErrUnknownBackend
	}
}
createStub function · go · L26-L33 (8 LOC)
stub.go
func createStub(spec Spec) *StubSpace {
	// Create a real temp directory so file writes work in contract tests.
	tmpDir, _ := os.MkdirTemp("", "mirage-stub-*")
	return &StubSpace{
		workDir:   tmpDir,
		workspace: spec.Workspace,
	}
}
Diff method · go · L37-L62 (26 LOC)
stub.go
func (s *StubSpace) Diff() ([]Change, error) {
	s.mu.Lock()
	defer s.mu.Unlock()
	s.DiffCalls++

	// If Changes are pre-configured, return those.
	if len(s.Changes) > 0 {
		return s.Changes, nil
	}

	// Otherwise, scan the temp dir for real files (supports contract tests).
	var changes []Change
	filepath.Walk(s.workDir, func(path string, info os.FileInfo, err error) error { //nolint:errcheck
		if err != nil || info.IsDir() || path == s.workDir {
			return nil
		}
		rel, _ := filepath.Rel(s.workDir, path)
		changes = append(changes, Change{
			Path: rel,
			Kind: Created,
			Size: info.Size(),
		})
		return nil
	})
	return changes, nil
}
Commit method · go · L64-L81 (18 LOC)
stub.go
func (s *StubSpace) Commit(paths []string) error {
	s.mu.Lock()
	defer s.mu.Unlock()
	s.CommitCalls++

	// Copy files from temp dir to real workspace.
	for _, p := range paths {
		src := filepath.Join(s.workDir, p)
		dst := filepath.Join(s.workspace, p)
		data, err := os.ReadFile(src) //nolint:gosec
		if err != nil {
			continue
		}
		os.MkdirAll(filepath.Dir(dst), 0o755) //nolint:errcheck
		os.WriteFile(dst, data, 0o644)        //nolint:errcheck,gosec
	}
	return nil
}
Reset method · go · L83-L94 (12 LOC)
stub.go
func (s *StubSpace) Reset() error {
	s.mu.Lock()
	defer s.mu.Unlock()
	s.ResetCalls++

	// Remove all files from temp dir.
	entries, _ := os.ReadDir(s.workDir)
	for _, e := range entries {
		os.RemoveAll(filepath.Join(s.workDir, e.Name())) //nolint:errcheck
	}
	return nil
}
Want this analysis on your repo? https://repobility.com/scan/
Destroy method · go · L96-L106 (11 LOC)
stub.go
func (s *StubSpace) Destroy() error {
	s.mu.Lock()
	defer s.mu.Unlock()
	s.DestroyCalls++

	if s.destroyed {
		return nil
	}
	s.destroyed = true
	return os.RemoveAll(s.workDir)
}