main.go 5.2 KB

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