package releasekit import ( "context" "errors" "fmt" "strings" internalpreparation "gitea.maximumdirect.net/eric/ReleaseKit/internal/preparation" "gitea.maximumdirect.net/eric/ReleaseKit/internal/releaseidentity" ) // TaggedCheckoutRequest selects a stable tag and the full Git object ID // expected by an external build or CI event. An empty Remote selects origin. type TaggedCheckoutRequest struct { RepositoryDir string Version string Remote string ExpectedCommit string } // PrepareTaggedCheckout fetches Version from Remote, verifies that its peeled // commit matches ExpectedCommit, and checks out that commit detached. This // operation mutates the selected local repository; use it for disposable // checkouts where tag-fetch and checkout conflicts can be resolved by the // caller. It does not publish a tag or hosted content. func PrepareTaggedCheckout(ctx context.Context, request TaggedCheckoutRequest) error { return internalpreparation.PrepareTaggedCheckout(ctx, internalpreparation.TaggedCheckoutRequest{ RepositoryDir: request.RepositoryDir, Version: request.Version, Remote: request.Remote, ExpectedCommit: request.ExpectedCommit, }) } // DependencyPreparationRequest selects the repository module whose dependencies // should be prepared. type DependencyPreparationRequest struct { RepositoryDir string // ModuleDir selects a repository-relative module directory; empty selects // the repository root. ModuleDir string } // PrepareBuildDependencies runs `go mod download` in the selected module with // workspace discovery disabled and the locally available compatible Go // toolchain selected. It may access module networks and updates the Go module // cache using the caller's Go proxy, private-module, credential, and cache // settings. If required checksums are missing, the Go command may update // go.sum. Cancellation and Go command failures are returned to the caller. func PrepareBuildDependencies(ctx context.Context, request DependencyPreparationRequest) error { if strings.TrimSpace(request.RepositoryDir) == "" { return errors.New("repository directory is required") } selection, err := releaseidentity.ResolveSelection(request.RepositoryDir, request.ModuleDir) if err != nil { return fmt.Errorf("resolve dependency preparation module: %w", err) } return internalpreparation.PrepareBuildDependencies(ctx, selection.ModuleDir) }