install.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "os/exec"
  6. rpc "github.com/mikkeloscar/aur"
  7. gopkg "github.com/mikkeloscar/gopkgbuild"
  8. )
  9. // Install handles package installs
  10. func install(parser *arguments) error {
  11. aurs, repos, _ := packageSlices(parser.targets.toSlice())
  12. arguments := parser.copy()
  13. arguments.delArg("u", "sysupgrade")
  14. arguments.delArg("y", "refresh")
  15. arguments.targets = make(stringSet)
  16. arguments.addTarget(repos...)
  17. if len(repos) != 0 {
  18. err := passToPacman(arguments)
  19. if err != nil {
  20. fmt.Println("Error installing repo packages.")
  21. }
  22. }
  23. if len(aurs) != 0 {
  24. err := aurInstall(aurs, []string{"-S"})
  25. if err != nil {
  26. fmt.Println("Error installing aur packages.")
  27. }
  28. }
  29. return nil
  30. }
  31. // Install sends system commands to make and install a package from pkgName
  32. func aurInstall(pkgName []string, flags []string) (err error) {
  33. q, err := rpc.Info(pkgName)
  34. if err != nil {
  35. return
  36. }
  37. if len(q) != len(pkgName) {
  38. fmt.Printf("Some packages from list\n%+v\n do not exist", pkgName)
  39. }
  40. var finalrm []string
  41. for _, i := range q {
  42. mrm, err := PkgInstall(&i, flags)
  43. if err != nil {
  44. fmt.Println("Error installing", i.Name, ":", err)
  45. }
  46. finalrm = append(finalrm, mrm...)
  47. }
  48. if len(finalrm) != 0 {
  49. err = removeMakeDeps(finalrm)
  50. }
  51. return err
  52. }
  53. func setupPackageSpace(a *rpc.Pkg) (dir string, pkgbuild *gopkg.PKGBUILD, err error) {
  54. dir = config.BuildDir + a.PackageBase + "/"
  55. if _, err = os.Stat(dir); !os.IsNotExist(err) {
  56. if !continueTask("Directory exists. Clean Build?", "yY") {
  57. _ = os.RemoveAll(config.BuildDir + a.PackageBase)
  58. }
  59. }
  60. if err = downloadAndUnpack(baseURL+a.URLPath, config.BuildDir, false); err != nil {
  61. return
  62. }
  63. if !continueTask("Edit PKGBUILD?", "yY") {
  64. editcmd := exec.Command(editor(), dir+"PKGBUILD")
  65. editcmd.Stdin, editcmd.Stdout, editcmd.Stderr = os.Stdin, os.Stdout, os.Stderr
  66. editcmd.Run()
  67. }
  68. pkgbuild, err = gopkg.ParseSRCINFO(dir + ".SRCINFO")
  69. if err == nil {
  70. for _, pkgsource := range pkgbuild.Source {
  71. owner, repo := parseSource(pkgsource)
  72. if owner != "" && repo != "" {
  73. err = branchInfo(a.Name, owner, repo)
  74. if err != nil {
  75. fmt.Println(err)
  76. }
  77. }
  78. }
  79. }
  80. return
  81. }
  82. // PkgInstall handles install from Info Result.
  83. func PkgInstall(a *rpc.Pkg, flags []string) (finalmdeps []string, err error) {
  84. fmt.Printf("\x1b[1;32m==> Installing\x1b[33m %s\x1b[0m\n", a.Name)
  85. if a.Maintainer == "" {
  86. fmt.Println("\x1b[1;31;40m==> Warning:\x1b[0;;40m This package is orphaned.\x1b[0m")
  87. }
  88. dir, _, err := setupPackageSpace(a)
  89. if err != nil {
  90. return
  91. }
  92. if specialDBsauce {
  93. return
  94. }
  95. runDeps, makeDeps, err := pkgDependencies(a)
  96. if err != nil {
  97. return
  98. }
  99. repoDeps := append(runDeps[0], makeDeps[0]...)
  100. aurDeps := append(runDeps[1], makeDeps[1]...)
  101. finalmdeps = append(finalmdeps, makeDeps[0]...)
  102. finalmdeps = append(finalmdeps, makeDeps[1]...)
  103. if len(aurDeps) != 0 || len(repoDeps) != 0 {
  104. if !continueTask("Continue?", "nN") {
  105. return finalmdeps, fmt.Errorf("user did not like the dependencies")
  106. }
  107. }
  108. aurQ, _ := rpc.Info(aurDeps)
  109. if len(aurQ) != len(aurDeps) {
  110. (aurQuery)(aurQ).missingPackage(aurDeps)
  111. if !continueTask("Continue?", "nN") {
  112. return finalmdeps, fmt.Errorf("unable to install dependencies")
  113. }
  114. }
  115. arguments := makeArguments()
  116. arguments.addArg("S", "asdeps", "noconfirm")
  117. arguments.addTarget(repoDeps...)
  118. var depArgs []string
  119. if config.NoConfirm {
  120. depArgs = []string{"asdeps", "noconfirm"}
  121. } else {
  122. depArgs = []string{"asdeps"}
  123. }
  124. // Repo dependencies
  125. if len(repoDeps) != 0 {
  126. errR := passToPacman(arguments)
  127. if errR != nil {
  128. return finalmdeps, errR
  129. }
  130. }
  131. // Handle AUR dependencies
  132. for _, dep := range aurQ {
  133. finalmdepsR, errA := PkgInstall(&dep, depArgs)
  134. finalmdeps = append(finalmdeps, finalmdepsR...)
  135. if errA != nil {
  136. cleanRemove(repoDeps)
  137. cleanRemove(aurDeps)
  138. return finalmdeps, errA
  139. }
  140. }
  141. flags = append(flags, "-sri")
  142. err = passToMakepkg(dir, flags...)
  143. return
  144. }