main.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  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. cfile, err := os.Open(configFile)
  43. if !os.IsNotExist(err) && err != nil {
  44. return fmt.Errorf("Failed to open config file '%s': %s", configFile, err)
  45. }
  46. defer cfile.Close()
  47. if !os.IsNotExist(err) {
  48. decoder := json.NewDecoder(cfile)
  49. if err = decoder.Decode(&config); err != nil {
  50. return fmt.Errorf("Failed to read config '%s': %s", configFile, err)
  51. }
  52. }
  53. return nil
  54. }
  55. func initVCS() error {
  56. vfile, err := os.Open(vcsFile)
  57. if !os.IsNotExist(err) && err != nil {
  58. return fmt.Errorf("Failed to open vcs file '%s': %s", vcsFile, err)
  59. }
  60. defer vfile.Close()
  61. if !os.IsNotExist(err) {
  62. decoder := json.NewDecoder(vfile)
  63. if err = decoder.Decode(&savedInfo); err != nil {
  64. return fmt.Errorf("Failed to read vcs '%s': %s", vcsFile, err)
  65. }
  66. }
  67. return nil
  68. }
  69. func initHomeDirs() error {
  70. if _, err := os.Stat(configHome); os.IsNotExist(err) {
  71. if err = os.MkdirAll(configHome, 0755); err != nil {
  72. return fmt.Errorf("Failed to create config directory '%s': %s", configHome, err)
  73. }
  74. } else if err != nil {
  75. return err
  76. }
  77. if _, err := os.Stat(cacheHome); os.IsNotExist(err) {
  78. if err = os.MkdirAll(cacheHome, 0755); err != nil {
  79. return fmt.Errorf("Failed to create cache directory '%s': %s", cacheHome, err)
  80. }
  81. } else if err != nil {
  82. return err
  83. }
  84. return nil
  85. }
  86. func initBuildDir() error {
  87. if _, err := os.Stat(config.BuildDir); os.IsNotExist(err) {
  88. if err = os.MkdirAll(config.BuildDir, 0755); err != nil {
  89. return fmt.Errorf("Failed to create BuildDir directory '%s': %s", config.BuildDir, err)
  90. }
  91. } else if err != nil {
  92. return err
  93. }
  94. return nil
  95. }
  96. func initAlpm() error {
  97. var err error
  98. if alpmConf, err = readAlpmConfig(config.PacmanConf); err != nil {
  99. return fmt.Errorf("Unable to read Pacman conf: %s", err)
  100. }
  101. if value, _, exists := cmdArgs.getArg("dbpath", "b"); exists {
  102. alpmConf.DBPath = value
  103. }
  104. if value, _, exists := cmdArgs.getArg("root", "r"); exists {
  105. alpmConf.RootDir = value
  106. }
  107. if value, _, exists := cmdArgs.getArg("arch"); exists {
  108. alpmConf.Architecture = value
  109. }
  110. if value, _, exists := cmdArgs.getArg("ignore"); exists {
  111. alpmConf.IgnorePkg = append(alpmConf.IgnorePkg, strings.Split(value, ",")...)
  112. }
  113. if value, _, exists := cmdArgs.getArg("ignoregroup"); exists {
  114. alpmConf.IgnoreGroup = append(alpmConf.IgnoreGroup, strings.Split(value, ",")...)
  115. }
  116. //TODO
  117. //current system does not allow duplicate arguments
  118. //but pacman allows multiple cachdirs to be passed
  119. //for now only handle one cache dir
  120. if value, _, exists := cmdArgs.getArg("cachdir"); exists {
  121. alpmConf.CacheDir = []string{value}
  122. }
  123. if value, _, exists := cmdArgs.getArg("gpgdir"); exists {
  124. alpmConf.GPGDir = value
  125. }
  126. if err = initAlpmHandle(); err != nil {
  127. return err
  128. }
  129. if value, _, _ := cmdArgs.getArg("color"); value == "always" || value == "auto" {
  130. useColor = true
  131. } else if value == "never" {
  132. useColor = false
  133. } else {
  134. useColor = alpmConf.Options&alpm.ConfColor > 0
  135. }
  136. return nil
  137. }
  138. func initAlpmHandle() error {
  139. var err error
  140. if alpmHandle != nil {
  141. if err := alpmHandle.Release(); err != nil {
  142. return err
  143. }
  144. }
  145. if alpmHandle, err = alpmConf.CreateHandle(); err != nil {
  146. return fmt.Errorf("Unable to CreateHandle: %s", err)
  147. }
  148. alpmHandle.SetQuestionCallback(questionCallback)
  149. alpmHandle.SetLogCallback(logCallback)
  150. return nil
  151. }
  152. func exitOnError(err error) {
  153. if err != nil {
  154. if str := err.Error(); str != "" {
  155. fmt.Println(str)
  156. }
  157. cleanup()
  158. os.Exit(1)
  159. }
  160. }
  161. func cleanup() int {
  162. if alpmHandle != nil {
  163. if err := alpmHandle.Release(); err != nil {
  164. fmt.Println(err)
  165. return 1
  166. }
  167. }
  168. return 0
  169. }
  170. func main() {
  171. if 0 == os.Geteuid() {
  172. fmt.Println("Please avoid running yay as root/sudo.")
  173. }
  174. exitOnError(setPaths())
  175. defaultSettings(&config)
  176. exitOnError(initHomeDirs())
  177. exitOnError(initConfig())
  178. exitOnError(cmdArgs.parseCommandLine())
  179. exitOnError(initBuildDir())
  180. exitOnError(initVCS())
  181. exitOnError(initAlpm())
  182. exitOnError(handleCmd())
  183. os.Exit(cleanup())
  184. }