in cmd/glab/main.go [50:202]
func main() {
debug = debugMode == "true" || debugMode == "1"
cmdFactory := cmdutils.NewFactory()
cfg, err := cmdFactory.Config()
if err != nil {
cmdFactory.IO.Logf("failed to read configuration: %s\n", err)
os.Exit(2)
}
api.SetUserAgent(version, platform, runtime.GOARCH)
maybeOverrideDefaultHost(cmdFactory, cfg)
if !cmdFactory.IO.ColorEnabled() {
surveyCore.DisableColor = true
} else {
// Override survey's choice of color for default values
// For default values for e.g. `Input` prompts, Survey uses the literal "white" color,
// which makes no sense on dark terminals and is literally invisible on light backgrounds.
// This overrides Survey to output a gray color for 256-color terminals and "default" for basic terminals.
surveyCore.TemplateFuncsWithColor["color"] = func(style string) string {
switch style {
case "white":
if cmdFactory.IO.Is256ColorSupported() {
return fmt.Sprintf("\x1b[%d;5;%dm", 38, 242)
}
return ansi.ColorCode("default")
default:
return ansi.ColorCode(style)
}
}
}
rootCmd := commands.NewCmdRoot(cmdFactory, version, commit)
// Set Debug mode from config if not previously set by debugMode
if !debug {
debugModeCfg, _ := cfg.Get("", "debug")
debug = debugModeCfg == "true" || debugModeCfg == "1"
}
if pager, _ := cfg.Get("", "glab_pager"); pager != "" {
cmdFactory.IO.SetPager(pager)
}
if promptDisabled, _ := cfg.Get("", "no_prompt"); promptDisabled != "" {
cmdFactory.IO.SetPrompt(promptDisabled)
}
if forceHyperlinks := os.Getenv("FORCE_HYPERLINKS"); forceHyperlinks != "" && forceHyperlinks != "0" {
cmdFactory.IO.SetDisplayHyperlinks("always")
} else if displayHyperlinks, _ := cfg.Get("", "display_hyperlinks"); displayHyperlinks == "true" {
cmdFactory.IO.SetDisplayHyperlinks("auto")
}
var expandedArgs []string
if len(os.Args) > 0 {
expandedArgs = os.Args[1:]
}
cmd, _, err := rootCmd.Traverse(expandedArgs)
if err != nil || cmd == rootCmd {
originalArgs := expandedArgs
isShell := false
expandedArgs, isShell, err = expand.ExpandAlias(cfg, os.Args, nil)
if err != nil {
cmdFactory.IO.LogInfof("Failed to process alias: %s\n", err)
os.Exit(2)
}
if debug {
fmt.Printf("%v -> %v\n", originalArgs, expandedArgs)
}
if isShell {
externalCmd := exec.Command(expandedArgs[0], expandedArgs[1:]...)
externalCmd.Stderr = os.Stderr
externalCmd.Stdout = os.Stdout
externalCmd.Stdin = os.Stdin
preparedCmd := run.PrepareCmd(externalCmd)
err = preparedCmd.Run()
if err != nil {
if ee, ok := err.(*exec.ExitError); ok {
os.Exit(ee.ExitCode())
}
cmdFactory.IO.LogInfof("failed to run external command: %s", err)
os.Exit(3)
}
os.Exit(0)
}
}
// Override the default column separator of tableprinter to double spaces
tableprinter.SetTTYSeparator(" ")
// Override the default terminal width of tableprinter
tableprinter.SetTerminalWidth(cmdFactory.IO.TerminalWidth())
// set whether terminal is a TTY or non-TTY
tableprinter.SetIsTTY(cmdFactory.IO.IsOutputTTY())
rootCmd.SetArgs(expandedArgs)
if cmd, err := rootCmd.ExecuteC(); err != nil {
if !errors.Is(err, cmdutils.SilentError) {
printError(cmdFactory.IO, err, cmd, debug)
}
var exitError *cmdutils.ExitError
if errors.As(err, &exitError) {
os.Exit(exitError.Code)
} else {
os.Exit(1)
}
}
if help.HasFailed() {
os.Exit(1)
}
var argCommand string
if expandedArgs != nil {
argCommand = expandedArgs[0]
} else {
argCommand = ""
}
shouldCheck := false
// GLAB_CHECK_UPDATE has higher priority than the check_update configuration value
if envVal, ok := os.LookupEnv("GLAB_CHECK_UPDATE"); ok {
if checkUpdate, err := strconv.ParseBool(envVal); err == nil {
shouldCheck = checkUpdate
}
} else {
// Fall back to config value if env var not set
if checkUpdate, _ := cfg.Get("", "check_update"); checkUpdate != "" {
if parsed, err := strconv.ParseBool(checkUpdate); err == nil {
shouldCheck = parsed
}
}
}
if shouldCheck {
if err := update.CheckUpdate(cmdFactory, version, true, argCommand); err != nil {
printError(cmdFactory.IO, err, rootCmd, debug)
}
}
api.GetClient().HTTPClient().CloseIdleConnections()
}