add.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package cmd
  2. import (
  3. "fmt"
  4. "github.com/jsmartx/giter/git"
  5. "github.com/jsmartx/giter/store"
  6. "github.com/jsmartx/giter/util"
  7. "github.com/urfave/cli"
  8. )
  9. func getUser() *git.User {
  10. g, err := git.New(".")
  11. if err != nil {
  12. return git.GlobalUser()
  13. }
  14. return g.GetUser()
  15. }
  16. func getHost() string {
  17. g, err := git.New(".")
  18. if err != nil {
  19. return "ssh://github.com"
  20. }
  21. urls, err := g.Remotes()
  22. if err != nil || len(urls) == 0 {
  23. return "ssh://github.com"
  24. }
  25. return fmt.Sprintf("%s://%s", urls[0].Scheme, urls[0].Host)
  26. }
  27. func Add(c *cli.Context) error {
  28. u := getUser()
  29. nameCfg := &util.PromptConfig{
  30. Prompt: "user name: ",
  31. }
  32. emailCfg := &util.PromptConfig{
  33. Prompt: "user email: ",
  34. }
  35. urlCfg := &util.PromptConfig{
  36. Prompt: "git server: ",
  37. Default: getHost(),
  38. }
  39. if u != nil {
  40. nameCfg.Default = u.Name
  41. emailCfg.Default = u.Email
  42. }
  43. name := util.Prompt(nameCfg)
  44. email := util.Prompt(emailCfg)
  45. urlStr := util.Prompt(urlCfg)
  46. url, err := util.ParseURL(urlStr)
  47. util.CheckError(err)
  48. host, port := util.SplitHostPort(url.Host)
  49. user := &store.User{
  50. Name: name,
  51. Email: email,
  52. Scheme: url.Scheme,
  53. Host: host,
  54. Port: port,
  55. }
  56. options := &store.Options{}
  57. if user.IsSSH() {
  58. pvtPath, err := util.SysSSHConfig()
  59. if err == nil {
  60. fmt.Printf("There is a SSH key: %s\nYou can use this key or generate a new SSH key.\n", pvtPath)
  61. txt := util.Prompt(&util.PromptConfig{
  62. Prompt: fmt.Sprintf("Do you want to use '%s' [Y/n]? ", pvtPath),
  63. })
  64. if txt == "y" || txt == "Y" {
  65. options.KeyPath = pvtPath
  66. }
  67. }
  68. } else {
  69. pwd := util.Prompt(&util.PromptConfig{
  70. Prompt: "user password: ",
  71. Silent: true,
  72. })
  73. options.Password = pwd
  74. }
  75. s := store.New()
  76. return s.Add(user, options)
  77. }