main.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. package main // import "github.com/Jguer/yay"
  2. import (
  3. "context"
  4. "errors"
  5. "os"
  6. "os/exec"
  7. "runtime/debug"
  8. "github.com/leonelquinteros/gotext"
  9. "github.com/Jguer/yay/v12/pkg/runtime"
  10. "github.com/Jguer/yay/v12/pkg/settings"
  11. "github.com/Jguer/yay/v12/pkg/settings/parser"
  12. "github.com/Jguer/yay/v12/pkg/text"
  13. )
  14. var (
  15. yayVersion = "12.0.4" // To be set by compiler.
  16. localePath = "/usr/share/locale" // To be set by compiler.
  17. )
  18. func initGotext() {
  19. if envLocalePath := os.Getenv("LOCALE_PATH"); envLocalePath != "" {
  20. localePath = envLocalePath
  21. }
  22. if lc := os.Getenv("LANGUAGE"); lc != "" {
  23. gotext.Configure(localePath, lc, "yay")
  24. } else if lc := os.Getenv("LC_ALL"); lc != "" {
  25. gotext.Configure(localePath, lc, "yay")
  26. } else if lc := os.Getenv("LC_MESSAGES"); lc != "" {
  27. gotext.Configure(localePath, lc, "yay")
  28. } else {
  29. gotext.Configure(localePath, os.Getenv("LANG"), "yay")
  30. }
  31. }
  32. func main() {
  33. fallbackLog := text.NewLogger(os.Stdout, os.Stderr, os.Stdin, false, "fallback")
  34. var (
  35. err error
  36. ctx = context.Background()
  37. ret = 0
  38. )
  39. defer func() {
  40. if rec := recover(); rec != nil {
  41. fallbackLog.Errorln(rec)
  42. debug.PrintStack()
  43. }
  44. os.Exit(ret)
  45. }()
  46. initGotext()
  47. if os.Geteuid() == 0 {
  48. fallbackLog.Warnln(gotext.Get("Avoid running yay as root/sudo."))
  49. }
  50. configPath := settings.GetConfigPath()
  51. // Parse config
  52. cfg, err := settings.NewConfig(fallbackLog, configPath, yayVersion)
  53. if err != nil {
  54. if str := err.Error(); str != "" {
  55. fallbackLog.Errorln(str)
  56. }
  57. ret = 1
  58. return
  59. }
  60. if errS := cfg.RunMigrations(fallbackLog,
  61. settings.DefaultMigrations(), configPath, yayVersion); errS != nil {
  62. fallbackLog.Errorln(errS)
  63. }
  64. cmdArgs := parser.MakeArguments()
  65. // Parse command line
  66. if err = cfg.ParseCommandLine(cmdArgs); err != nil {
  67. if str := err.Error(); str != "" {
  68. fallbackLog.Errorln(str)
  69. }
  70. ret = 1
  71. return
  72. }
  73. if cfg.SaveConfig {
  74. if errS := cfg.Save(configPath, yayVersion); errS != nil {
  75. fallbackLog.Errorln(errS)
  76. }
  77. }
  78. // Build run
  79. run, err := runtime.NewRuntime(cfg, cmdArgs, yayVersion)
  80. if err != nil {
  81. if str := err.Error(); str != "" {
  82. fallbackLog.Errorln(str)
  83. }
  84. ret = 1
  85. return
  86. }
  87. defer func() {
  88. if rec := recover(); rec != nil {
  89. fallbackLog.Errorln(rec, string(debug.Stack()))
  90. }
  91. run.DB.Cleanup()
  92. }()
  93. if err = handleCmd(ctx, run, cmdArgs, run.DB); err != nil {
  94. if str := err.Error(); str != "" {
  95. fallbackLog.Errorln(str)
  96. if cmdArgs.ExistsArg("c") && cmdArgs.ExistsArg("y") && cmdArgs.Op == "S" {
  97. // Remove after 2023-10-01
  98. fallbackLog.Errorln("Did you mean 'yay -Yc'?")
  99. }
  100. }
  101. exitError := &exec.ExitError{}
  102. if errors.As(err, &exitError) {
  103. // mirror pacman exit code when applicable
  104. ret = exitError.ExitCode()
  105. return
  106. }
  107. // fallback
  108. ret = 1
  109. }
  110. }