nomadcode/services/core/internal/projectsync/provision.go
toki 096efb0a83 feat(workitempipeline): add provision service and archive G06 artifacts
- Add projectsync provision service with tests
- Update HTTP handlers with provision endpoint support
- Update workitempipeline service and tests
- Archive G06 workspace provision artifacts (plan, code review)
- Update G07 cloud code review
2026-06-14 05:13:16 +09:00

70 lines
1.9 KiB
Go

package projectsync
import (
"context"
"errors"
"fmt"
"os"
"path/filepath"
)
// ErrWorkspaceProvisionNotReady is returned when a workspace is not prepared.
var ErrWorkspaceProvisionNotReady = errors.New("workspace provision is not ready")
// WorkspaceProvisioner defines the interface for ensuring that the required
// workspace paths and Git metadata are prepared.
type WorkspaceProvisioner interface {
EnsureProvisioned(ctx context.Context, plan ProvisionPlan) error
}
// FilesystemWorkspaceProvisioner checks the local filesystem to verify
// that the workspace topology matches the plan.
type FilesystemWorkspaceProvisioner struct{}
// EnsureProvisioned checks that the workspace root is a directory,
// and that main branch, develop branch, and default slot paths are directories
// containing a .git file or directory.
func (FilesystemWorkspaceProvisioner) EnsureProvisioned(ctx context.Context, plan ProvisionPlan) error {
if err := ctx.Err(); err != nil {
return err
}
if err := ensureDirectory(plan.ProjectWorkspaceRoot); err != nil {
return err
}
for _, path := range []string{plan.MainBranchPath, plan.DevelopBranchPath, plan.DefaultSlotPath} {
if err := ctx.Err(); err != nil {
return err
}
if err := ensureGitCheckout(path); err != nil {
return err
}
}
return nil
}
func ensureDirectory(path string) error {
info, err := os.Stat(path)
if err != nil {
return fmt.Errorf("%w: path %q is not accessible: %v", ErrWorkspaceProvisionNotReady, path, err)
}
if !info.IsDir() {
return fmt.Errorf("%w: path %q is not a directory", ErrWorkspaceProvisionNotReady, path)
}
return nil
}
func ensureGitCheckout(path string) error {
if err := ensureDirectory(path); err != nil {
return err
}
gitPath := filepath.Join(path, ".git")
_, err := os.Stat(gitPath)
if err != nil {
return fmt.Errorf("%w: git metadata is missing at %q: %v", ErrWorkspaceProvisionNotReady, gitPath, err)
}
return nil
}