github.com/nozzle/golangci-lint@v1.49.0-nz3/pkg/goutil/env.go (about)

     1  package goutil
     2  
     3  import (
     4  	"context"
     5  	"encoding/json"
     6  	"os"
     7  	"os/exec"
     8  	"strings"
     9  	"time"
    10  
    11  	"github.com/pkg/errors"
    12  
    13  	"github.com/golangci/golangci-lint/pkg/logutils"
    14  )
    15  
    16  type EnvKey string
    17  
    18  const (
    19  	EnvGoCache EnvKey = "GOCACHE"
    20  	EnvGoRoot  EnvKey = "GOROOT"
    21  )
    22  
    23  type Env struct {
    24  	vars   map[string]string
    25  	log    logutils.Log
    26  	debugf logutils.DebugFunc
    27  }
    28  
    29  func NewEnv(log logutils.Log) *Env {
    30  	return &Env{
    31  		vars:   map[string]string{},
    32  		log:    log,
    33  		debugf: logutils.Debug(logutils.DebugKeyEnv),
    34  	}
    35  }
    36  
    37  func (e *Env) Discover(ctx context.Context) error {
    38  	startedAt := time.Now()
    39  	args := []string{"env", "-json"}
    40  	args = append(args, string(EnvGoCache), string(EnvGoRoot))
    41  	out, err := exec.CommandContext(ctx, "go", args...).Output()
    42  	if err != nil {
    43  		return errors.Wrap(err, "failed to run 'go env'")
    44  	}
    45  
    46  	if err = json.Unmarshal(out, &e.vars); err != nil {
    47  		return errors.Wrapf(err, "failed to parse 'go %s' json", strings.Join(args, " "))
    48  	}
    49  
    50  	e.debugf("Read go env for %s: %#v", time.Since(startedAt), e.vars)
    51  	return nil
    52  }
    53  
    54  func (e Env) Get(k EnvKey) string {
    55  	envValue := os.Getenv(string(k))
    56  	if envValue != "" {
    57  		return envValue
    58  	}
    59  
    60  	return e.vars[string(k)]
    61  }