github.com/ActiveState/cli@v0.0.0-20240508170324-6801f60cd051/internal/condition/condition.go (about)

     1  package condition
     2  
     3  import (
     4  	"errors"
     5  	"os"
     6  	"strings"
     7  
     8  	"github.com/ActiveState/cli/internal/constants"
     9  	"github.com/thoas/go-funk"
    10  )
    11  
    12  type Configurable interface {
    13  	GetBool(s string) bool
    14  }
    15  
    16  var inTest = strings.HasSuffix(strings.TrimSuffix(os.Args[0], ".exe"), ".test") ||
    17  	strings.Contains(os.Args[0], "/_test/") || funk.Contains(os.Args, "-test.v")
    18  
    19  // InUnitTest returns true when the app is being tested
    20  func InUnitTest() bool {
    21  	return inTest
    22  }
    23  
    24  func InTest() bool {
    25  	return InUnitTest() || os.Getenv(constants.E2ETestEnvVarName) == "true"
    26  }
    27  
    28  func OnCI() bool {
    29  	return os.Getenv("CI") != "" || os.Getenv("BUILDER_OUTPUT") != ""
    30  }
    31  
    32  func IsLTS() bool {
    33  	return strings.HasPrefix(constants.ChannelName, "LTS")
    34  }
    35  
    36  func BuiltViaCI() bool {
    37  	return constants.OnCI == "true"
    38  }
    39  
    40  func BuiltOnDevMachine() bool {
    41  	return !BuiltViaCI()
    42  }
    43  
    44  func InActiveStateCI() bool {
    45  	return os.Getenv(constants.ActiveStateCIEnvVarName) == "true"
    46  }
    47  
    48  func OptInUnstable(cfg Configurable) bool {
    49  	if v := os.Getenv(constants.OptinUnstableEnvVarName); v != "" {
    50  		return v == "true"
    51  	}
    52  	return cfg.GetBool(constants.UnstableConfig)
    53  }
    54  
    55  func IsNetworkingError(err error) bool {
    56  	switch {
    57  	case strings.Contains(err.Error(), "no such host"):
    58  		return true
    59  	case strings.Contains(err.Error(), "no route to host"):
    60  		return true
    61  	}
    62  	if subErr := errors.Unwrap(err); subErr != nil {
    63  		return IsNetworkingError(subErr)
    64  	}
    65  	unwrapped, ok := err.(interface{ Unwrap() []error })
    66  	if ok {
    67  		subErrs := unwrapped.Unwrap()
    68  		if len(subErrs) > 0 {
    69  			for _, subErr := range subErrs {
    70  				if IsNetworkingError(subErr) {
    71  					return true
    72  				}
    73  			}
    74  		}
    75  	}
    76  	return false
    77  }