gitlab.com/zaquestion/lab@v0.14.0/internal/config/config.go (about) 1 package config 2 3 import ( 4 "bufio" 5 "errors" 6 "fmt" 7 "io" 8 "net/url" 9 "os" 10 "strings" 11 "syscall" 12 13 "github.com/spf13/viper" 14 "golang.org/x/crypto/ssh/terminal" 15 ) 16 17 const defaultGitLabHost = "https://gitlab.com" 18 19 // New prompts the user for the default config values to use with lab, and save 20 // them to the provided confpath (default: ~/.config/lab.hcl) 21 func New(confpath string, r io.Reader) error { 22 var ( 23 reader = bufio.NewReader(r) 24 host, user, token string 25 err error 26 ) 27 fmt.Printf("Enter default GitLab host (default: %s): ", defaultGitLabHost) 28 host, err = reader.ReadString('\n') 29 host = strings.TrimSpace(host) 30 if err != nil { 31 return err 32 } 33 if host == "" { 34 host = defaultGitLabHost 35 } 36 37 fmt.Print("Enter default GitLab user: ") 38 user, err = reader.ReadString('\n') 39 user = strings.TrimSpace(user) 40 if err != nil { 41 return err 42 } 43 if user == "" { 44 return errors.New("lab.hcl config core.user must be set") 45 } 46 47 tokenURL, err := url.Parse(host) 48 if err != nil { 49 return err 50 } 51 tokenURL.Path = "profile/personal_access_tokens" 52 53 fmt.Printf("Create a token here: %s\nEnter default GitLab token (scope: api): ", tokenURL.String()) 54 token, err = readPassword() 55 if err != nil { 56 return err 57 } 58 59 viper.Set("core.host", host) 60 viper.Set("core.user", user) 61 viper.Set("core.token", token) 62 if err := viper.WriteConfigAs(confpath); err != nil { 63 return err 64 } 65 fmt.Printf("\nConfig saved to %s\n", confpath) 66 return nil 67 } 68 69 var readPassword = func() (string, error) { 70 byteToken, err := terminal.ReadPassword(int(syscall.Stdin)) 71 if err != nil { 72 return "", err 73 } 74 return strings.TrimSpace(string(byteToken)), nil 75 } 76 77 // CI returns credentials suitable for use within GitLab CI or empty strings if 78 // none found. 79 func CI() (string, string, string) { 80 ciToken := os.Getenv("CI_JOB_TOKEN") 81 if ciToken == "" { 82 return "", "", "" 83 } 84 ciHost := strings.TrimSuffix(os.Getenv("CI_PROJECT_URL"), os.Getenv("CI_PROJECT_PATH")) 85 if ciHost == "" { 86 return "", "", "" 87 } 88 ciUser := os.Getenv("CI_REGISTRY_USER") 89 if ciUser == "" { 90 ciUser = "gitlab-ci-token" 91 } 92 return ciHost, ciUser, ciToken 93 }