main.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  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() (err error) {
  42. defaultSettings(&config)
  43. if _, err = os.Stat(configFile); os.IsNotExist(err) {
  44. err = os.MkdirAll(filepath.Dir(configFile), 0755)
  45. if err != nil {
  46. err = fmt.Errorf("Unable to create config directory:\n%s\n"+
  47. "The error was:\n%s", filepath.Dir(configFile), err)
  48. return
  49. }
  50. // Save the default config if nothing is found
  51. config.saveConfig()
  52. } else {
  53. cfile, errf := os.OpenFile(configFile, os.O_RDWR|os.O_CREATE, 0644)
  54. if errf != nil {
  55. fmt.Printf("Error reading config: %s\n", err)
  56. } else {
  57. defer cfile.Close()
  58. decoder := json.NewDecoder(cfile)
  59. err = decoder.Decode(&config)
  60. if err != nil {
  61. fmt.Println("Loading default Settings.\nError reading config:",
  62. err)
  63. defaultSettings(&config)
  64. }
  65. if _, err = os.Stat(config.BuildDir); os.IsNotExist(err) {
  66. err = os.MkdirAll(config.BuildDir, 0755)
  67. if err != nil {
  68. err = fmt.Errorf("Unable to create BuildDir directory:\n%s\n"+
  69. "The error was:\n%s", config.BuildDir, err)
  70. return
  71. }
  72. }
  73. }
  74. }
  75. return
  76. }
  77. func initVCS() (err error) {
  78. if _, err = os.Stat(vcsFile); os.IsNotExist(err) {
  79. err = os.MkdirAll(filepath.Dir(vcsFile), 0755)
  80. if err != nil {
  81. err = fmt.Errorf("Unable to create vcs directory:\n%s\n"+
  82. "The error was:\n%s", filepath.Dir(configFile), err)
  83. return
  84. }
  85. } else {
  86. vfile, err := os.OpenFile(vcsFile, os.O_RDONLY|os.O_CREATE, 0644)
  87. if err == nil {
  88. defer vfile.Close()
  89. decoder := json.NewDecoder(vfile)
  90. _ = decoder.Decode(&savedInfo)
  91. }
  92. }
  93. return
  94. }
  95. func initAlpm() (err error) {
  96. var value string
  97. var exists bool
  98. //var double bool
  99. value, _, exists = cmdArgs.getArg("config")
  100. if exists {
  101. config.PacmanConf = value
  102. }
  103. alpmConf, err = readAlpmConfig(config.PacmanConf)
  104. if err != nil {
  105. err = fmt.Errorf("Unable to read Pacman conf: %s", err)
  106. return
  107. }
  108. value, _, exists = cmdArgs.getArg("dbpath", "b")
  109. if exists {
  110. alpmConf.DBPath = value
  111. }
  112. value, _, exists = cmdArgs.getArg("root", "r")
  113. if exists {
  114. alpmConf.RootDir = value
  115. }
  116. value, _, exists = cmdArgs.getArg("arch")
  117. if exists {
  118. alpmConf.Architecture = value
  119. }
  120. value, _, exists = cmdArgs.getArg("ignore")
  121. if exists {
  122. alpmConf.IgnorePkg = append(alpmConf.IgnorePkg, strings.Split(value, ",")...)
  123. }
  124. value, _, exists = cmdArgs.getArg("ignoregroup")
  125. if exists {
  126. alpmConf.IgnoreGroup = append(alpmConf.IgnoreGroup, strings.Split(value, ",")...)
  127. }
  128. //TODO
  129. //current system does not allow duplicate arguments
  130. //but pacman allows multiple cachdirs to be passed
  131. //for now only handle one cache dir
  132. value, _, exists = cmdArgs.getArg("cachdir")
  133. if exists {
  134. alpmConf.CacheDir = []string{value}
  135. }
  136. value, _, exists = cmdArgs.getArg("gpgdir")
  137. if exists {
  138. alpmConf.GPGDir = value
  139. }
  140. alpmHandle, err = alpmConf.CreateHandle()
  141. if err != nil {
  142. err = fmt.Errorf("Unable to CreateHandle: %s", err)
  143. return
  144. }
  145. value, _, _ = cmdArgs.getArg("color")
  146. if value == "always" || value == "auto" {
  147. useColor = true
  148. } else if value == "never" {
  149. useColor = false
  150. } else {
  151. useColor = alpmConf.Options&alpm.ConfColor > 0
  152. }
  153. alpmHandle.SetQuestionCallback(questionCallback)
  154. return
  155. }
  156. func main() {
  157. var status int
  158. var err error
  159. if 0 == os.Geteuid() {
  160. fmt.Println("Please avoid running yay as root/sudo.")
  161. }
  162. err = cmdArgs.parseCommandLine()
  163. if err != nil {
  164. fmt.Println(err)
  165. status = 1
  166. goto cleanup
  167. }
  168. err = setPaths()
  169. if err != nil {
  170. fmt.Println(err)
  171. status = 1
  172. goto cleanup
  173. }
  174. err = initConfig()
  175. if err != nil {
  176. fmt.Println(err)
  177. status = 1
  178. goto cleanup
  179. }
  180. err = initVCS()
  181. if err != nil {
  182. fmt.Println(err)
  183. status = 1
  184. goto cleanup
  185. }
  186. err = initAlpm()
  187. if err != nil {
  188. fmt.Println(err)
  189. status = 1
  190. goto cleanup
  191. }
  192. err = handleCmd()
  193. if err != nil {
  194. if err.Error() != "" {
  195. fmt.Println(err)
  196. }
  197. status = 1
  198. goto cleanup
  199. }
  200. cleanup:
  201. //cleanup
  202. //from here on out don't exit if an error occurs
  203. //if we fail to save the configuration
  204. //at least continue on and try clean up other parts
  205. if alpmHandle != nil {
  206. err = alpmHandle.Release()
  207. if err != nil {
  208. fmt.Println(err)
  209. status = 1
  210. }
  211. }
  212. os.Exit(status)
  213. }