install.go 4.2 KB

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