@@ -29,6 +29,7 @@ import (
2929// module and goMod arg just enough of the output of `go mod edit -json` for our purposes
3030type goMod struct {
3131 Module module
32+ Go string
3233}
3334type module struct {
3435 Path string
@@ -91,3 +92,32 @@ func FindCurrentRepo() (string, error) {
9192 defer os .Remove ("go.mod" ) // clean up after ourselves
9293 return findGoModulePath ()
9394}
95+
96+ // GetGoVersion returns the Go version from go.mod.
97+ func GetGoVersion () (string , error ) {
98+ cmd := exec .Command ("go" , "mod" , "edit" , "-json" )
99+ cmd .Env = append (cmd .Env , os .Environ ()... )
100+ out , err := cmd .Output ()
101+ if err != nil {
102+ var exitErr * exec.ExitError
103+ if errors .As (err , & exitErr ) {
104+ err = fmt .Errorf ("%s" , string (exitErr .Stderr ))
105+ }
106+ return "" , err
107+ }
108+ mod := goMod {}
109+ if err = json .Unmarshal (out , & mod ); err != nil {
110+ return "" , fmt .Errorf ("failed to unmarshal go.mod: %w" , err )
111+ }
112+ return mod .Go , nil
113+ }
114+
115+ // SetGoVersion sets the Go version in go.mod.
116+ func SetGoVersion (version string ) error {
117+ cmd := exec .Command ("go" , "mod" , "edit" , "-go=" + version )
118+ cmd .Env = append (cmd .Env , os .Environ ()... )
119+ if out , err := cmd .CombinedOutput (); err != nil {
120+ return fmt .Errorf ("failed to set go version: %s: %w" , string (out ), err )
121+ }
122+ return nil
123+ }
0 commit comments