aur.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. package aur
  2. import (
  3. "bufio"
  4. "fmt"
  5. "net/http"
  6. "os"
  7. "sort"
  8. "strings"
  9. alpm "github.com/jguer/go-alpm"
  10. vcs "github.com/jguer/yay/aur/vcs"
  11. "github.com/jguer/yay/config"
  12. "github.com/jguer/yay/pacman"
  13. rpc "github.com/mikkeloscar/aur"
  14. )
  15. // BaseURL givers the AUR default address.
  16. const BaseURL string = "https://aur.archlinux.org"
  17. var specialDBsauce bool = false
  18. // NarrowSearch searches AUR and narrows based on subarguments
  19. func NarrowSearch(pkgS []string, sortS bool) (Query, error) {
  20. if len(pkgS) == 0 {
  21. return nil, nil
  22. }
  23. r, err := rpc.Search(pkgS[0])
  24. if err != nil {
  25. return nil, err
  26. }
  27. if len(pkgS) == 1 {
  28. if sortS {
  29. sort.Sort(Query(r))
  30. }
  31. return r, err
  32. }
  33. var aq Query
  34. var n int
  35. for _, res := range r {
  36. match := true
  37. for _, pkgN := range pkgS[1:] {
  38. if !(strings.Contains(res.Name, pkgN) || strings.Contains(strings.ToLower(res.Description), pkgN)) {
  39. match = false
  40. break
  41. }
  42. }
  43. if match {
  44. n++
  45. aq = append(aq, res)
  46. }
  47. }
  48. if sortS {
  49. sort.Sort(aq)
  50. }
  51. return aq, err
  52. }
  53. // Install sends system commands to make and install a package from pkgName
  54. func Install(pkgName []string, flags []string) (err error) {
  55. q, err := rpc.Info(pkgName)
  56. if err != nil {
  57. return
  58. }
  59. if len(q) != len(pkgName) {
  60. fmt.Printf("Some package from list\n%+v\ndoes not exist", pkgName)
  61. }
  62. var finalrm []string
  63. for _, i := range q {
  64. mrm, err := PkgInstall(&i, flags)
  65. if err != nil {
  66. fmt.Println("Error installing", i.Name, ":", err)
  67. }
  68. finalrm = append(finalrm, mrm...)
  69. }
  70. if len(finalrm) != 0 {
  71. err = RemoveMakeDeps(finalrm)
  72. }
  73. return err
  74. }
  75. // CreateDevelDB forces yay to create a DB of the existing development packages
  76. func CreateDevelDB() error {
  77. foreign, err := pacman.ForeignPackages()
  78. if err != nil {
  79. return err
  80. }
  81. keys := make([]string, len(foreign))
  82. i := 0
  83. for k := range foreign {
  84. keys[i] = k
  85. i++
  86. }
  87. config.YayConf.NoConfirm = true
  88. specialDBsauce = true
  89. err = Install(keys, nil)
  90. return err
  91. }
  92. func develUpgrade(foreign map[string]alpm.Package, flags []string) error {
  93. fmt.Println(" Checking development packages...")
  94. develUpdates := vcs.CheckUpdates(foreign)
  95. if len(develUpdates) != 0 {
  96. for _, q := range develUpdates {
  97. fmt.Printf("\x1b[1m\x1b[32m==>\x1b[33;1m %s\x1b[0m\n", q)
  98. }
  99. // Install updated packages
  100. if !config.ContinueTask("Proceed with upgrade?", "nN") {
  101. return nil
  102. }
  103. err := Install(develUpdates, flags)
  104. if err != nil {
  105. fmt.Println(err)
  106. }
  107. }
  108. return nil
  109. }
  110. // Upgrade tries to update every foreign package installed in the system
  111. func Upgrade(flags []string) error {
  112. fmt.Println("\x1b[1;36;1m::\x1b[0m\x1b[1m Starting AUR upgrade...\x1b[0m")
  113. foreign, err := pacman.ForeignPackages()
  114. if err != nil {
  115. return err
  116. }
  117. keys := make([]string, len(foreign))
  118. i := 0
  119. for k := range foreign {
  120. keys[i] = k
  121. i++
  122. }
  123. if config.YayConf.Devel {
  124. err := develUpgrade(foreign, flags)
  125. if err != nil {
  126. fmt.Println(err)
  127. }
  128. }
  129. q, err := rpc.Info(keys)
  130. if err != nil {
  131. return err
  132. }
  133. outdated := q[:0]
  134. for i, res := range q {
  135. fmt.Printf("\r Checking %d/%d packages...", i+1, len(q))
  136. if _, ok := foreign[res.Name]; ok {
  137. // Leaving this here for now, warn about downgrades later
  138. if int64(res.LastModified) > foreign[res.Name].BuildDate().UnixNano() {
  139. fmt.Printf("\x1b[1m\x1b[32m==>\x1b[33;1m %s: \x1b[0m%s \x1b[33;1m-> \x1b[0m%s\n",
  140. res.Name, foreign[res.Name].Version(), res.Version)
  141. outdated = append(outdated, res)
  142. }
  143. }
  144. }
  145. //If there are no outdated packages, don't prompt
  146. if len(outdated) == 0 {
  147. fmt.Println("\n there is nothing to do")
  148. return nil
  149. }
  150. // Install updated packages
  151. if !config.ContinueTask("\nProceed with upgrade?", "nN") {
  152. return nil
  153. }
  154. for _, pkgi := range outdated {
  155. PkgInstall(&pkgi, flags)
  156. }
  157. return nil
  158. }
  159. // GetPkgbuild downloads pkgbuild from the AUR.
  160. func GetPkgbuild(pkgN string, dir string) (err error) {
  161. aq, err := rpc.Info([]string{pkgN})
  162. if err != nil {
  163. return err
  164. }
  165. if len(aq) == 0 {
  166. return fmt.Errorf("no results")
  167. }
  168. fmt.Printf("\x1b[1;32m==>\x1b[1;33m %s \x1b[1;32mfound in AUR.\x1b[0m\n", pkgN)
  169. config.DownloadAndUnpack(BaseURL+aq[0].URLPath, dir, false)
  170. return
  171. }
  172. //CreateAURList creates a new completion file
  173. func CreateAURList(out *os.File) (err error) {
  174. resp, err := http.Get("https://aur.archlinux.org/packages.gz")
  175. if err != nil {
  176. return err
  177. }
  178. defer resp.Body.Close()
  179. scanner := bufio.NewScanner(resp.Body)
  180. scanner.Scan()
  181. for scanner.Scan() {
  182. fmt.Print(scanner.Text())
  183. out.WriteString(scanner.Text())
  184. if config.YayConf.Shell == "fish" {
  185. fmt.Print("\tAUR\n")
  186. out.WriteString("\tAUR\n")
  187. } else {
  188. fmt.Print("\n")
  189. out.WriteString("\n")
  190. }
  191. }
  192. return nil
  193. }