main.go 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "os"
  6. "path/filepath"
  7. "strings"
  8. alpm "github.com/jguer/go-alpm"
  9. )
  10. func setPaths() error {
  11. if _configHome, set := os.LookupEnv("XDG_CONFIG_HOME"); set {
  12. if _configHome == "" {
  13. return fmt.Errorf("XDG_CONFIG_HOME set but empty")
  14. }
  15. configHome = filepath.Join(_configHome, "yay")
  16. } else if _configHome, set := os.LookupEnv("HOME"); set {
  17. if _configHome == "" {
  18. return fmt.Errorf("HOME set but empty")
  19. }
  20. configHome = filepath.Join(_configHome, ".config/yay")
  21. } else {
  22. return fmt.Errorf("XDG_CONFIG_HOME and HOME unset")
  23. }
  24. if _cacheHome, set := os.LookupEnv("XDG_CACHE_HOME"); set {
  25. if _cacheHome == "" {
  26. return fmt.Errorf("XDG_CACHE_HOME set but empty")
  27. }
  28. cacheHome = filepath.Join(_cacheHome, "yay")
  29. } else if _cacheHome, set := os.LookupEnv("HOME"); set {
  30. if _cacheHome == "" {
  31. return fmt.Errorf("XDG_CACHE_HOME set but empty")
  32. }
  33. cacheHome = filepath.Join(_cacheHome, ".cache/yay")
  34. } else {
  35. return fmt.Errorf("XDG_CACHE_HOME and HOME unset")
  36. }
  37. configFile = filepath.Join(configHome, configFileName)
  38. vcsFile = filepath.Join(cacheHome, vcsFileName)
  39. return nil
  40. }
  41. func initConfig() error {
  42. defaultSettings(&config)
  43. if _, err := os.Stat(configFile); os.IsNotExist(err) {
  44. if err = os.MkdirAll(filepath.Dir(configFile), 0755); err != nil {
  45. return fmt.Errorf("Unable to create config directory:\n%s\n"+
  46. "The error was:\n%s", filepath.Dir(configFile), err)
  47. }
  48. // Save the default config if nothing is found
  49. return config.saveConfig()
  50. } else if err != nil {
  51. return err
  52. }
  53. cfile, err := os.OpenFile(configFile, os.O_RDWR|os.O_CREATE, 0644)
  54. if err != nil {
  55. return fmt.Errorf("Error reading config: %s\n", err)
  56. }
  57. defer cfile.Close()
  58. decoder := json.NewDecoder(cfile)
  59. if err = decoder.Decode(&config); err != nil {
  60. return fmt.Errorf("Error reading config: %s",
  61. err)
  62. }
  63. if _, err = os.Stat(config.BuildDir); os.IsNotExist(err) {
  64. if err = os.MkdirAll(config.BuildDir, 0755); err != nil {
  65. return fmt.Errorf("Unable to create BuildDir directory:\n%s\n"+
  66. "The error was:\n%s", config.BuildDir, err)
  67. }
  68. }
  69. return err
  70. }
  71. func initVCS() error {
  72. if _, err := os.Stat(vcsFile); os.IsNotExist(err) {
  73. if err = os.MkdirAll(filepath.Dir(vcsFile), 0755); err != nil {
  74. return fmt.Errorf("Unable to create vcs directory:\n%s\n"+
  75. "The error was:\n%s", filepath.Dir(configFile), err)
  76. }
  77. } else if err != nil {
  78. return err
  79. }
  80. vfile, err := os.OpenFile(vcsFile, os.O_RDONLY|os.O_CREATE, 0644)
  81. if err != nil {
  82. return err
  83. }
  84. defer vfile.Close()
  85. decoder := json.NewDecoder(vfile)
  86. _ = decoder.Decode(&savedInfo)
  87. return nil
  88. }
  89. func initAlpm() error {
  90. var err error
  91. if alpmConf, err = readAlpmConfig(config.PacmanConf); err != nil {
  92. return fmt.Errorf("Unable to read Pacman conf: %s", err)
  93. }
  94. if value, _, exists := cmdArgs.getArg("dbpath", "b"); exists {
  95. alpmConf.DBPath = value
  96. }
  97. if value, _, exists := cmdArgs.getArg("root", "r"); exists {
  98. alpmConf.RootDir = value
  99. }
  100. if value, _, exists := cmdArgs.getArg("arch"); exists {
  101. alpmConf.Architecture = value
  102. }
  103. if value, _, exists := cmdArgs.getArg("ignore"); exists {
  104. alpmConf.IgnorePkg = append(alpmConf.IgnorePkg, strings.Split(value, ",")...)
  105. }
  106. if value, _, exists := cmdArgs.getArg("ignoregroup"); exists {
  107. alpmConf.IgnoreGroup = append(alpmConf.IgnoreGroup, strings.Split(value, ",")...)
  108. }
  109. //TODO
  110. //current system does not allow duplicate arguments
  111. //but pacman allows multiple cachdirs to be passed
  112. //for now only handle one cache dir
  113. if value, _, exists := cmdArgs.getArg("cachdir"); exists {
  114. alpmConf.CacheDir = []string{value}
  115. }
  116. if value, _, exists := cmdArgs.getArg("gpgdir"); exists {
  117. alpmConf.GPGDir = value
  118. }
  119. if err = initAlpmHandle(); err != nil {
  120. return err
  121. }
  122. if value, _, _ := cmdArgs.getArg("color"); value == "always" || value == "auto" {
  123. useColor = true
  124. } else if value == "never" {
  125. useColor = false
  126. } else {
  127. useColor = alpmConf.Options&alpm.ConfColor > 0
  128. }
  129. return nil
  130. }
  131. func initAlpmHandle() error {
  132. var err error
  133. if alpmHandle != nil {
  134. if err := alpmHandle.Release(); err != nil {
  135. return err
  136. }
  137. }
  138. if alpmHandle, err = alpmConf.CreateHandle(); err != nil {
  139. return fmt.Errorf("Unable to CreateHandle: %s", err)
  140. }
  141. alpmHandle.SetQuestionCallback(questionCallback)
  142. alpmHandle.SetLogCallback(logCallback)
  143. return nil
  144. }
  145. func exitOnError(err error) {
  146. if err != nil {
  147. if str := err.Error(); str != "" {
  148. fmt.Println(str)
  149. }
  150. cleanup()
  151. os.Exit(1)
  152. }
  153. }
  154. func cleanup() int {
  155. if alpmHandle != nil {
  156. if err := alpmHandle.Release(); err != nil {
  157. fmt.Println(err)
  158. return 1
  159. }
  160. }
  161. return 0
  162. }
  163. func main() {
  164. if 0 == os.Geteuid() {
  165. fmt.Println("Please avoid running yay as root/sudo.")
  166. }
  167. exitOnError(cmdArgs.parseCommandLine())
  168. exitOnError(setPaths())
  169. exitOnError(initConfig())
  170. cmdArgs.extractYayOptions()
  171. exitOnError(initVCS())
  172. exitOnError(initAlpm())
  173. exitOnError(handleCmd())
  174. os.Exit(cleanup())
  175. }