install.go 3.8 KB

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