main.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  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. alpmConf, err = readAlpmConfig(config.PacmanConf)
  100. if err != nil {
  101. err = fmt.Errorf("Unable to read Pacman conf: %s", err)
  102. return
  103. }
  104. value, _, exists = cmdArgs.getArg("dbpath", "b")
  105. if exists {
  106. alpmConf.DBPath = value
  107. }
  108. value, _, exists = cmdArgs.getArg("root", "r")
  109. if exists {
  110. alpmConf.RootDir = value
  111. }
  112. value, _, exists = cmdArgs.getArg("arch")
  113. if exists {
  114. alpmConf.Architecture = value
  115. }
  116. value, _, exists = cmdArgs.getArg("ignore")
  117. if exists {
  118. alpmConf.IgnorePkg = append(alpmConf.IgnorePkg, strings.Split(value, ",")...)
  119. }
  120. value, _, exists = cmdArgs.getArg("ignoregroup")
  121. if exists {
  122. alpmConf.IgnoreGroup = append(alpmConf.IgnoreGroup, strings.Split(value, ",")...)
  123. }
  124. //TODO
  125. //current system does not allow duplicate arguments
  126. //but pacman allows multiple cachdirs to be passed
  127. //for now only handle one cache dir
  128. value, _, exists = cmdArgs.getArg("cachdir")
  129. if exists {
  130. alpmConf.CacheDir = []string{value}
  131. }
  132. value, _, exists = cmdArgs.getArg("gpgdir")
  133. if exists {
  134. alpmConf.GPGDir = value
  135. }
  136. err = initAlpmHandle()
  137. if err != nil {
  138. return
  139. }
  140. value, _, _ = cmdArgs.getArg("color")
  141. if value == "always" || value == "auto" {
  142. useColor = true
  143. } else if value == "never" {
  144. useColor = false
  145. } else {
  146. useColor = alpmConf.Options&alpm.ConfColor > 0
  147. }
  148. return
  149. }
  150. func initAlpmHandle() (err error) {
  151. if alpmHandle != nil {
  152. err = alpmHandle.Release()
  153. if err != nil {
  154. return err
  155. }
  156. }
  157. alpmHandle, err = alpmConf.CreateHandle()
  158. if err != nil {
  159. err = fmt.Errorf("Unable to CreateHandle: %s", err)
  160. return
  161. }
  162. alpmHandle.SetQuestionCallback(questionCallback)
  163. alpmHandle.SetLogCallback(logCallback)
  164. return
  165. }
  166. func main() {
  167. var status int
  168. var err error
  169. if 0 == os.Geteuid() {
  170. fmt.Println("Please avoid running yay as root/sudo.")
  171. }
  172. err = cmdArgs.parseCommandLine()
  173. if err != nil {
  174. fmt.Println(err)
  175. status = 1
  176. goto cleanup
  177. }
  178. err = setPaths()
  179. if err != nil {
  180. fmt.Println(err)
  181. status = 1
  182. goto cleanup
  183. }
  184. err = initConfig()
  185. if err != nil {
  186. fmt.Println(err)
  187. status = 1
  188. goto cleanup
  189. }
  190. cmdArgs.extractYayOptions()
  191. err = initVCS()
  192. if err != nil {
  193. fmt.Println(err)
  194. status = 1
  195. goto cleanup
  196. }
  197. err = initAlpm()
  198. if err != nil {
  199. fmt.Println(err)
  200. status = 1
  201. goto cleanup
  202. }
  203. err = handleCmd()
  204. if err != nil {
  205. if err.Error() != "" {
  206. fmt.Println(err)
  207. }
  208. status = 1
  209. goto cleanup
  210. }
  211. cleanup:
  212. //cleanup
  213. //from here on out don't exit if an error occurs
  214. //if we fail to save the configuration
  215. //at least continue on and try clean up other parts
  216. if alpmHandle != nil {
  217. err = alpmHandle.Release()
  218. if err != nil {
  219. fmt.Println(err)
  220. status = 1
  221. }
  222. }
  223. os.Exit(status)
  224. }