main.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  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. err = initAlpmHandle()
  141. if err != nil {
  142. return
  143. }
  144. value, _, _ = cmdArgs.getArg("color")
  145. if value == "always" || value == "auto" {
  146. useColor = true
  147. } else if value == "never" {
  148. useColor = false
  149. } else {
  150. useColor = alpmConf.Options&alpm.ConfColor > 0
  151. }
  152. return
  153. }
  154. func initAlpmHandle() (err error) {
  155. if alpmHandle != nil {
  156. err = alpmHandle.Release()
  157. if err != nil {
  158. return err
  159. }
  160. }
  161. alpmHandle, err = alpmConf.CreateHandle()
  162. if err != nil {
  163. err = fmt.Errorf("Unable to CreateHandle: %s", err)
  164. return
  165. }
  166. alpmHandle.SetQuestionCallback(questionCallback)
  167. return
  168. }
  169. func main() {
  170. var status int
  171. var err error
  172. if 0 == os.Geteuid() {
  173. fmt.Println("Please avoid running yay as root/sudo.")
  174. }
  175. err = cmdArgs.parseCommandLine()
  176. if err != nil {
  177. fmt.Println(err)
  178. status = 1
  179. goto cleanup
  180. }
  181. err = setPaths()
  182. if err != nil {
  183. fmt.Println(err)
  184. status = 1
  185. goto cleanup
  186. }
  187. err = initConfig()
  188. if err != nil {
  189. fmt.Println(err)
  190. status = 1
  191. goto cleanup
  192. }
  193. err = initVCS()
  194. if err != nil {
  195. fmt.Println(err)
  196. status = 1
  197. goto cleanup
  198. }
  199. err = initAlpm()
  200. if err != nil {
  201. fmt.Println(err)
  202. status = 1
  203. goto cleanup
  204. }
  205. err = handleCmd()
  206. if err != nil {
  207. if err.Error() != "" {
  208. fmt.Println(err)
  209. }
  210. status = 1
  211. goto cleanup
  212. }
  213. cleanup:
  214. //cleanup
  215. //from here on out don't exit if an error occurs
  216. //if we fail to save the configuration
  217. //at least continue on and try clean up other parts
  218. if alpmHandle != nil {
  219. err = alpmHandle.Release()
  220. if err != nil {
  221. fmt.Println(err)
  222. status = 1
  223. }
  224. }
  225. os.Exit(status)
  226. }