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  }