main.go 5.2 KB

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