install.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  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) (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. err = os.Chdir(dir)
  92. if err != nil {
  93. return
  94. }
  95. return
  96. }
  97. // PkgInstall handles install from Info Result.
  98. func PkgInstall(a *rpc.Pkg, flags []string) (finalmdeps []string, err error) {
  99. fmt.Printf("\x1b[1;32m==> Installing\x1b[33m %s\x1b[0m\n", a.Name)
  100. if a.Maintainer == "" {
  101. fmt.Println("\x1b[1;31;40m==> Warning:\x1b[0;;40m This package is orphaned.\x1b[0m")
  102. }
  103. _, err = setupPackageSpace(a)
  104. if err != nil {
  105. return
  106. }
  107. if specialDBsauce {
  108. return
  109. }
  110. runDeps, makeDeps, err := pkgDependencies(a)
  111. if err != nil {
  112. return
  113. }
  114. repoDeps := append(runDeps[0], makeDeps[0]...)
  115. aurDeps := append(runDeps[1], makeDeps[1]...)
  116. finalmdeps = append(finalmdeps, makeDeps[0]...)
  117. finalmdeps = append(finalmdeps, makeDeps[1]...)
  118. if len(aurDeps) != 0 || len(repoDeps) != 0 {
  119. if !continueTask("Continue?", "nN") {
  120. return finalmdeps, fmt.Errorf("user did not like the dependencies")
  121. }
  122. }
  123. aurQ, _ := rpc.Info(aurDeps)
  124. if len(aurQ) != len(aurDeps) {
  125. (aurQuery)(aurQ).missingPackage(aurDeps)
  126. if !continueTask("Continue?", "nN") {
  127. return finalmdeps, fmt.Errorf("unable to install dependencies")
  128. }
  129. }
  130. var depArgs []string
  131. if config.NoConfirm {
  132. depArgs = []string{"--asdeps", "--noconfirm"}
  133. } else {
  134. depArgs = []string{"--asdeps"}
  135. }
  136. // Repo dependencies
  137. if len(repoDeps) != 0 {
  138. errR := passToPacman("-S", repoDeps, depArgs)
  139. if errR != nil {
  140. return finalmdeps, errR
  141. }
  142. }
  143. // Handle AUR dependencies
  144. for _, dep := range aurQ {
  145. finalmdepsR, errA := PkgInstall(&dep, depArgs)
  146. finalmdeps = append(finalmdeps, finalmdepsR...)
  147. if errA != nil {
  148. cleanRemove(repoDeps)
  149. cleanRemove(aurDeps)
  150. return finalmdeps, errA
  151. }
  152. }
  153. args := []string{"-sri"}
  154. args = append(args, flags...)
  155. makepkgcmd := exec.Command(config.MakepkgBin, args...)
  156. makepkgcmd.Stdin, makepkgcmd.Stdout, makepkgcmd.Stderr = os.Stdin, os.Stdout, os.Stderr
  157. err = makepkgcmd.Run()
  158. if err == nil {
  159. _ = saveVCSInfo()
  160. }
  161. return
  162. }