config.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. package main
  2. import (
  3. "bufio"
  4. "fmt"
  5. "os"
  6. "os/exec"
  7. "strings"
  8. alpm "github.com/Jguer/go-alpm"
  9. "github.com/Morganamilo/go-pacmanconf"
  10. "github.com/leonelquinteros/gotext"
  11. "github.com/Jguer/yay/v10/pkg/settings"
  12. "github.com/Jguer/yay/v10/pkg/text"
  13. )
  14. // Verbosity settings for search
  15. const (
  16. numberMenu = iota
  17. detailed
  18. minimal
  19. )
  20. var yayVersion = "10.0.0"
  21. var localePath = "/usr/share/locale"
  22. // savedInfo holds the current vcs info
  23. var savedInfo vcsInfo
  24. // YayConf holds the current config values for yay.
  25. var config *settings.Configuration
  26. // Editor returns the preferred system editor.
  27. func editor() (editor string, args []string) {
  28. switch {
  29. case config.Editor != "":
  30. editor, err := exec.LookPath(config.Editor)
  31. if err != nil {
  32. fmt.Fprintln(os.Stderr, err)
  33. } else {
  34. return editor, strings.Fields(config.EditorFlags)
  35. }
  36. fallthrough
  37. case os.Getenv("EDITOR") != "":
  38. if editorArgs := strings.Fields(os.Getenv("EDITOR")); len(editorArgs) != 0 {
  39. editor, err := exec.LookPath(editorArgs[0])
  40. if err != nil {
  41. fmt.Fprintln(os.Stderr, err)
  42. } else {
  43. return editor, editorArgs[1:]
  44. }
  45. }
  46. fallthrough
  47. case os.Getenv("VISUAL") != "":
  48. if editorArgs := strings.Fields(os.Getenv("VISUAL")); len(editorArgs) != 0 {
  49. editor, err := exec.LookPath(editorArgs[0])
  50. if err != nil {
  51. fmt.Fprintln(os.Stderr, err)
  52. } else {
  53. return editor, editorArgs[1:]
  54. }
  55. }
  56. fallthrough
  57. default:
  58. fmt.Fprintln(os.Stderr)
  59. text.Errorln(gotext.Get("%s is not set", bold(cyan("$EDITOR"))))
  60. text.Warnln(gotext.Get("Add %s or %s to your environment variables", bold(cyan("$EDITOR")), bold(cyan("$VISUAL"))))
  61. for {
  62. text.Infoln(gotext.Get("Edit PKGBUILD with?"))
  63. editorInput, err := getInput("")
  64. if err != nil {
  65. fmt.Fprintln(os.Stderr, err)
  66. continue
  67. }
  68. editorArgs := strings.Fields(editorInput)
  69. if len(editorArgs) == 0 {
  70. continue
  71. }
  72. editor, err := exec.LookPath(editorArgs[0])
  73. if err != nil {
  74. fmt.Fprintln(os.Stderr, err)
  75. continue
  76. }
  77. return editor, editorArgs[1:]
  78. }
  79. }
  80. }
  81. func getInput(defaultValue string) (string, error) {
  82. text.Info()
  83. if defaultValue != "" || config.NoConfirm {
  84. fmt.Println(defaultValue)
  85. return defaultValue, nil
  86. }
  87. reader := bufio.NewReader(os.Stdin)
  88. buf, overflow, err := reader.ReadLine()
  89. if err != nil {
  90. return "", err
  91. }
  92. if overflow {
  93. return "", fmt.Errorf(gotext.Get("input too long"))
  94. }
  95. return string(buf), nil
  96. }
  97. func toUsage(usages []string) alpm.Usage {
  98. if len(usages) == 0 {
  99. return alpm.UsageAll
  100. }
  101. var ret alpm.Usage
  102. for _, usage := range usages {
  103. switch usage {
  104. case "Sync":
  105. ret |= alpm.UsageSync
  106. case "Search":
  107. ret |= alpm.UsageSearch
  108. case "Install":
  109. ret |= alpm.UsageInstall
  110. case "Upgrade":
  111. ret |= alpm.UsageUpgrade
  112. case "All":
  113. ret |= alpm.UsageAll
  114. }
  115. }
  116. return ret
  117. }
  118. func configureAlpm(pacmanConf *pacmanconf.Config, alpmHandle *alpm.Handle) error {
  119. // TODO: set SigLevel
  120. // sigLevel := alpm.SigPackage | alpm.SigPackageOptional | alpm.SigDatabase | alpm.SigDatabaseOptional
  121. // localFileSigLevel := alpm.SigUseDefault
  122. // remoteFileSigLevel := alpm.SigUseDefault
  123. for _, repo := range pacmanConf.Repos {
  124. // TODO: set SigLevel
  125. db, err := alpmHandle.RegisterSyncDB(repo.Name, 0)
  126. if err != nil {
  127. return err
  128. }
  129. db.SetServers(repo.Servers)
  130. db.SetUsage(toUsage(repo.Usage))
  131. }
  132. if err := alpmHandle.SetCacheDirs(pacmanConf.CacheDir); err != nil {
  133. return err
  134. }
  135. // add hook directories 1-by-1 to avoid overwriting the system directory
  136. for _, dir := range pacmanConf.HookDir {
  137. if err := alpmHandle.AddHookDir(dir); err != nil {
  138. return err
  139. }
  140. }
  141. if err := alpmHandle.SetGPGDir(pacmanConf.GPGDir); err != nil {
  142. return err
  143. }
  144. if err := alpmHandle.SetLogFile(pacmanConf.LogFile); err != nil {
  145. return err
  146. }
  147. if err := alpmHandle.SetIgnorePkgs(pacmanConf.IgnorePkg); err != nil {
  148. return err
  149. }
  150. if err := alpmHandle.SetIgnoreGroups(pacmanConf.IgnoreGroup); err != nil {
  151. return err
  152. }
  153. if err := alpmHandle.SetArch(pacmanConf.Architecture); err != nil {
  154. return err
  155. }
  156. if err := alpmHandle.SetNoUpgrades(pacmanConf.NoUpgrade); err != nil {
  157. return err
  158. }
  159. if err := alpmHandle.SetNoExtracts(pacmanConf.NoExtract); err != nil {
  160. return err
  161. }
  162. /*if err := alpmHandle.SetDefaultSigLevel(sigLevel); err != nil {
  163. return err
  164. }
  165. if err := alpmHandle.SetLocalFileSigLevel(localFileSigLevel); err != nil {
  166. return err
  167. }
  168. if err := alpmHandle.SetRemoteFileSigLevel(remoteFileSigLevel); err != nil {
  169. return err
  170. }*/
  171. if err := alpmHandle.SetUseSyslog(pacmanConf.UseSyslog); err != nil {
  172. return err
  173. }
  174. return alpmHandle.SetCheckSpace(pacmanConf.CheckSpace)
  175. }