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 full Git tag and the Git object ID expected // by an external build or CI event. An empty Remote selects origin. type TaggedCheckoutRequest struct { RepositoryDir string Tag string Remote string ExpectedCommit string // VerifyOnly checks an already prepared checkout without fetching or checking out. VerifyOnly bool } // PrepareTaggedCheckout fetches Tag from Remote, verifies that its peeled // commit matches ExpectedCommit, and checks out that commit detached. When // VerifyOnly is true, it performs the same tag, HEAD, and cleanliness checks // without fetching or changing the checkout. 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, Tag: request.Tag, Remote: request.Remote, ExpectedCommit: request.ExpectedCommit, VerifyOnly: request.VerifyOnly, }) } // 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) }