github.com/nkprince007/lab@v0.6.2-0.20171218071646-19d68b56f403/main.go (about) 1 package main 2 3 import ( 4 "bufio" 5 "fmt" 6 "log" 7 "os" 8 "path" 9 "strings" 10 "syscall" 11 12 homedir "github.com/mitchellh/go-homedir" 13 "github.com/spf13/viper" 14 gitconfig "github.com/tcnksm/go-gitconfig" 15 "github.com/zaquestion/lab/cmd" 16 lab "github.com/zaquestion/lab/internal/gitlab" 17 "golang.org/x/crypto/ssh/terminal" 18 ) 19 20 // version gets set on releases during build by goreleaser. 21 var version = "master" 22 23 func main() { 24 log.SetFlags(log.LstdFlags | log.Lshortfile) 25 cmd.Version = version 26 27 home, err := homedir.Dir() 28 if err != nil { 29 log.Fatal(err) 30 } 31 32 viper.SetConfigName("lab") 33 viper.SetConfigType("hcl") 34 confpath := path.Join(home, ".config") 35 viper.AddConfigPath(".") 36 viper.AddConfigPath(confpath) 37 viper.AutomaticEnv() 38 err = viper.ReadInConfig() 39 if _, ok := err.(viper.ConfigFileNotFoundError); ok { 40 host, user, token := legacyLoadConfig() 41 writeConfig(confpath, host, user, token) 42 err = viper.ReadInConfig() 43 if err != nil { 44 log.Fatal(err) 45 } 46 } 47 48 c := viper.AllSettings()["core"] 49 config := c.([]map[string]interface{})[0] 50 51 lab.Init( 52 config["host"].(string), 53 config["user"].(string), 54 config["token"].(string)) 55 56 cmd.Execute() 57 } 58 59 func writeConfig(confpath, host, user, token string) { 60 viper.Set("core.host", host) 61 viper.Set("core.user", user) 62 viper.Set("core.token", token) 63 err := viper.WriteConfigAs(path.Join(confpath, "lab.hcl")) 64 if err != nil { 65 log.Fatal(err) 66 } 67 } 68 69 const defaultGitLabHost = "https://gitlab.com" 70 71 // legacyLoadConfig handles all of the credential setup and prompts for user 72 // input when not present 73 func legacyLoadConfig() (host, user, token string) { 74 reader := bufio.NewReader(os.Stdin) 75 var err error 76 host, err = gitconfig.Entire("gitlab.host") 77 if err != nil { 78 fmt.Printf("Enter default GitLab host (default: %s): ", defaultGitLabHost) 79 host, err = reader.ReadString('\n') 80 host = strings.TrimSpace(host) 81 if err != nil { 82 log.Fatal(err) 83 } 84 if host == "" { 85 host = defaultGitLabHost 86 } 87 } 88 var errt error 89 user, err = gitconfig.Entire("gitlab.user") 90 token, errt = gitconfig.Entire("gitlab.token") 91 if err != nil { 92 fmt.Print("Enter default GitLab user: ") 93 user, err = reader.ReadString('\n') 94 user = strings.TrimSpace(user) 95 if err != nil { 96 log.Fatal(err) 97 } 98 if user == "" { 99 log.Fatal("git config gitlab.user must be set") 100 } 101 tokenURL := path.Join(host, "profile/personal_access_tokens") 102 103 // If the default user is being set this is the first time lab 104 // is being run. 105 if errt != nil { 106 fmt.Printf("Create a token here: %s\nEnter default GitLab token (scope: api): ", tokenURL) 107 byteToken, err := terminal.ReadPassword(int(syscall.Stdin)) 108 if err != nil { 109 log.Fatal(err) 110 } 111 token = strings.TrimSpace(string(byteToken)) 112 } 113 } 114 return 115 }