mukan-ignite/ignite/pkg/gocmd/gocmd.go
Mukan Erkin Törük 26b204bd04
Some checks are pending
Docs Deploy / build_and_deploy (push) Waiting to run
Generate Docs / cli (push) Waiting to run
Generate Config Doc / cli (push) Waiting to run
Go formatting / go-formatting (push) Waiting to run
Check links / markdown-link-check (push) Waiting to run
Integration / pre-test (push) Waiting to run
Integration / test on (push) Blocked by required conditions
Integration / status (push) Blocked by required conditions
Lint / Lint Go code (push) Waiting to run
Test / test (ubuntu-latest) (push) Waiting to run
feat: fork Ignite CLI v29 as Mukan Ignite — remove cosmos-sdk restrictions
2026-05-11 03:31:37 +03:00

251 lines
7.5 KiB
Go

package gocmd
import (
"bytes"
"context"
"fmt"
"os"
"path/filepath"
"strings"
"github.com/ignite/cli/v29/ignite/pkg/cmdrunner/exec"
"github.com/ignite/cli/v29/ignite/pkg/cmdrunner/step"
"github.com/ignite/cli/v29/ignite/pkg/errors"
"github.com/ignite/cli/v29/ignite/pkg/goenv"
)
const (
// CommandInstall represents go "install" command.
CommandInstall = "install"
// CommandGet represents go "get" command.
CommandGet = "get"
// CommandBuild represents go "build" command.
CommandBuild = "build"
// CommandMod represents go "mod" command.
CommandMod = "mod"
// CommandModTidy represents go mod "tidy" command.
CommandModTidy = "tidy"
// CommandModVerify represents go mod "verify" command.
CommandModVerify = "verify"
// CommandModDownload represents go mod "download" command.
CommandModDownload = "download"
// CommandFmt represents go "fmt" command.
CommandFmt = "fmt"
// CommandEnv represents go "env" command.
CommandEnv = "env"
// CommandList represents go "list" command.
CommandList = "list"
// CommandTest represents go "test" command.
CommandTest = "test"
// EnvGOARCH represents GOARCH variable.
EnvGOARCH = "GOARCH"
// EnvGOMOD represents GOMOD variable.
EnvGOMOD = "GOMOD"
// EnvGOOS represents GOOS variable.
EnvGOOS = "GOOS"
// FlagGcflags represents gcflags go flag.
FlagGcflags = "-gcflags"
// FlagGcflagsValueDebug represents debug go flags.
FlagGcflagsValueDebug = "all=-N -l"
// FlagLdflags represents ldflags go flag.
FlagLdflags = "-ldflags"
// FlagTags represents tags go flag.
FlagTags = "-tags"
// FlagMod represents mod go flag.
FlagMod = "-mod"
// FlagModValueReadOnly represents readonly go flag.
FlagModValueReadOnly = "readonly"
// FlagOut represents out go flag.
FlagOut = "-o"
)
// Env returns the value of `go env name`.
func Env(name string) (string, error) {
var b bytes.Buffer
err := exec.Exec(context.Background(), []string{Name(), CommandEnv, name}, exec.StepOption(step.Stdout(&b)))
return b.String(), err
}
// Name returns the name of Go binary to use.
func Name() string {
custom := os.Getenv("GONAME")
if custom != "" {
return custom
}
return "go"
}
// Fmt runs go fmt on path.
func Fmt(ctx context.Context, path string, options ...exec.Option) error {
return exec.Exec(ctx, []string{Name(), CommandFmt, "./..."}, append(options, exec.StepOption(step.Workdir(path)))...)
}
// ModTidy runs go mod tidy on path with options.
func ModTidy(ctx context.Context, path string, options ...exec.Option) error {
return exec.Exec(ctx, []string{Name(), CommandMod, CommandModTidy},
append(options,
exec.StepOption(step.Workdir(path)),
// FIXME(tb) untagged version of ignite/cli triggers a 404 not found when go
// mod tidy requests the sumdb, until we understand why, we disable sumdb.
// related issue: https://github.com/golang/go/issues/56174
// Also disable Go toolchain download because it doesn't work without a valid
// GOSUMDB value: https://go.dev/doc/toolchain#download
exec.StepOption(step.Env("GOSUMDB=off", "GOTOOLCHAIN=local+path")),
)...)
}
// ModVerify runs go mod verify on path with options.
func ModVerify(ctx context.Context, path string, options ...exec.Option) error {
return exec.Exec(ctx, []string{Name(), CommandMod, CommandModVerify}, append(options, exec.StepOption(step.Workdir(path)))...)
}
// ModDownload runs go mod download on a path with options.
func ModDownload(ctx context.Context, path string, json bool, options ...exec.Option) error {
command := []string{Name(), CommandMod, CommandModDownload}
if json {
command = append(command, "-json")
}
return exec.Exec(ctx, command, append(options, exec.StepOption(step.Workdir(path)))...)
}
// BuildPath runs go install on cmd folder with options.
func BuildPath(ctx context.Context, output, binary, path string, flags []string, options ...exec.Option) error {
binaryOutput, err := binaryPath(output, binary)
if err != nil {
return err
}
command := []string{
Name(),
CommandBuild,
FlagOut, binaryOutput,
}
command = append(command, flags...)
command = append(command, ".")
return exec.Exec(ctx, command, append(options, exec.StepOption(step.Workdir(path)))...)
}
// Build runs go build on path with options.
func Build(ctx context.Context, out, path string, flags []string, options ...exec.Option) error {
command := []string{
Name(),
CommandBuild,
FlagOut, out,
}
command = append(command, flags...)
return exec.Exec(ctx, command, append(options, exec.StepOption(step.Workdir(path)))...)
}
// InstallAll runs go install ./... on path with options.
func InstallAll(ctx context.Context, path string, flags []string, options ...exec.Option) error {
command := []string{
Name(),
CommandInstall,
}
command = append(command, flags...)
command = append(command, "./...")
return exec.Exec(ctx, command, append(options, exec.StepOption(step.Workdir(path)))...)
}
// Install runs go install pkgs on path with options.
func Install(ctx context.Context, path string, pkgs []string, options ...exec.Option) error {
command := []string{
Name(),
CommandInstall,
}
command = append(command, pkgs...)
return exec.Exec(ctx, command, append(options, exec.StepOption(step.Workdir(path)))...)
}
// Get runs go get pkgs on path with options.
func Get(ctx context.Context, path string, pkgs []string, options ...exec.Option) error {
command := []string{
Name(),
CommandGet,
}
command = append(command, pkgs...)
return exec.Exec(ctx, command, append(options, exec.StepOption(step.Workdir(path)))...)
}
// List returns the list of packages in path.
func List(ctx context.Context, path string, flags []string, options ...exec.Option) ([]string, error) {
command := []string{
Name(),
CommandList,
}
command = append(command, flags...)
var b bytes.Buffer
err := exec.Exec(ctx, command,
append(options, exec.StepOption(step.Workdir(path)), exec.StepOption(step.Stdout(&b)))...)
if err != nil {
return nil, err
}
return strings.Fields(b.String()), nil
}
func Test(ctx context.Context, path string, flags []string, options ...exec.Option) error {
command := []string{
Name(),
CommandTest,
}
command = append(command, flags...)
return exec.Exec(ctx, command, append(options, exec.StepOption(step.Workdir(path)))...)
}
// Ldflags returns a combined ldflags set from flags.
func Ldflags(flags ...string) string {
return strings.Join(flags, " ")
}
// Tags returns a combined tags set from flags.
func Tags(tags ...string) string {
return strings.Join(tags, " ")
}
// BuildTarget builds a GOOS:GOARCH pair.
func BuildTarget(goos, goarch string) string {
return fmt.Sprintf("%s:%s", goos, goarch)
}
// ParseTarget parses GOOS:GOARCH pair.
func ParseTarget(t string) (goos, goarch string, err error) {
parsed := strings.Split(t, ":")
if len(parsed) != 2 {
return "", "", errors.New("invalid Go target, expected in GOOS:GOARCH format")
}
return parsed[0], parsed[1], nil
}
// PackageLiteral returns the string representation of package part of go get [package].
func PackageLiteral(path, version string) string {
return fmt.Sprintf("%s@%s", path, version)
}
// Imports runs goimports on path with options.
func GoImports(ctx context.Context, path string) error {
return exec.Exec(ctx, []string{"go", "tool", "golang.org/x/tools/cmd/goimports", "-w", path})
}
// binaryPath determines the path where binary will be located at.
func binaryPath(output, binary string) (string, error) {
if output != "" {
outputAbs, err := filepath.Abs(output)
if err != nil {
return "", err
}
return filepath.Join(outputAbs, binary), nil
}
return filepath.Join(goenv.Bin(), binary), nil
}