install.go 4.1 KB

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