search.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. package main
  2. import (
  3. "bufio"
  4. "errors"
  5. "fmt"
  6. "github.com/Jguer/go-alpm"
  7. "os"
  8. "os/exec"
  9. "sort"
  10. "strings"
  11. )
  12. func searchAurPackages(pkg string, index int) (search AurSearch, err error) {
  13. err = getJSON("https://aur.archlinux.org/rpc/?v=5&type=search&arg="+pkg, &search)
  14. if index != SearchMode {
  15. sort.Sort(search)
  16. }
  17. return
  18. }
  19. // SearchPackages handles repo searches
  20. func SearchPackages(pkg string) (search RepoSearch, err error) {
  21. h, er := alpm.Init("/", "/var/lib/pacman")
  22. if er != nil {
  23. fmt.Println(er)
  24. return
  25. }
  26. defer h.Release()
  27. fmt.Println("before dblist")
  28. dbList, _ := h.SyncDbs()
  29. fmt.Println("after dblist")
  30. // db, _ := h.RegisterSyncDb("core", 0)
  31. // h.RegisterSyncDb("community", 0)
  32. // h.RegisterSyncDb("extra", 0)
  33. _, err = h.SyncDbByName("core")
  34. fmt.Println(err)
  35. fmt.Printf("%+v\n", dbList)
  36. db, _ := h.LocalDb()
  37. for _, pkg := range db.PkgCache().Slice() {
  38. fmt.Printf("%s %s\n %s\n",
  39. pkg.Name(), pkg.Version(), pkg.Description())
  40. }
  41. for _, db := range dbList.Slice() {
  42. fmt.Printf("%+v\n", db)
  43. db, _ := h.LocalDb()
  44. for _, pkg := range db.PkgCache().Slice() {
  45. fmt.Printf("%s %s\n %s\n",
  46. pkg.Name(), pkg.Version(), pkg.Description())
  47. }
  48. }
  49. return
  50. }
  51. // SearchPackagesa handles repo searches
  52. func SearchPackagesa(pkg string) (search RepoSearch, err error) {
  53. cmdOutput, err := exec.Command(PacmanBin, "-Ss", pkg).Output()
  54. outputSlice := strings.Split(string(cmdOutput), "\n")
  55. if outputSlice[0] == "" {
  56. return search, nil
  57. }
  58. i := true
  59. var tempStr string
  60. var rRes *RepoResult
  61. for _, pkgStr := range outputSlice {
  62. if i {
  63. rRes = new(RepoResult)
  64. fmt.Sscanf(pkgStr, "%s %s\n", &tempStr, &rRes.Version)
  65. repoNameSlc := strings.Split(tempStr, "/")
  66. rRes.Repository = repoNameSlc[0]
  67. rRes.Name = repoNameSlc[1]
  68. i = false
  69. } else {
  70. rRes.Description = pkgStr
  71. search.Resultcount++
  72. search.Results = append(search.Results, *rRes)
  73. i = true
  74. }
  75. }
  76. return
  77. }
  78. func infoAurPackage(pkg string) (info AurSearch, err error) {
  79. err = getJSON("https://aur.archlinux.org/rpc/?v=5&type=info&arg[]="+pkg, &info)
  80. return
  81. }
  82. func (r AurSearch) printSearch(index int) (err error) {
  83. for i, result := range r.Results {
  84. if index != SearchMode {
  85. fmt.Printf("%d \033[1maur/\x1B[33m%s \x1B[36m%s\033[0m (%d)\n %s\n",
  86. i+index, result.Name, result.Version, result.NumVotes, result.Description)
  87. } else {
  88. fmt.Printf("\033[1maur/\x1B[33m%s \x1B[36m%s\033[0m (%d)\n %s\n",
  89. result.Name, result.Version, result.NumVotes, result.Description)
  90. }
  91. }
  92. return
  93. }
  94. func (s RepoSearch) printSearch(index int) (err error) {
  95. for i, result := range s.Results {
  96. if index != SearchMode {
  97. fmt.Printf("%d \033[1m%s/\x1B[33m%s \x1B[36m%s\033[0m\n%s\n",
  98. i, result.Repository, result.Name, result.Version, result.Description)
  99. } else {
  100. fmt.Printf("\033[1m%s/\x1B[33m%s \x1B[36m%s\033[0m\n%s\n",
  101. result.Repository, result.Name, result.Version, result.Description)
  102. }
  103. }
  104. return nil
  105. }
  106. // To implement
  107. func (a AurResult) getDepsfromFile(pkgbuildLoc string) (err error) {
  108. var depend string
  109. file, err := os.Open(pkgbuildLoc)
  110. if err != nil {
  111. return err
  112. }
  113. defer file.Close()
  114. scanner := bufio.NewScanner(file)
  115. for scanner.Scan() {
  116. if strings.Contains(scanner.Text(), "optdepends=(") {
  117. continue
  118. }
  119. if strings.Contains(scanner.Text(), "depends=(") {
  120. depend = scanner.Text()
  121. fields := strings.Fields(depend)
  122. for _, i := range fields {
  123. fmt.Println(i)
  124. }
  125. break
  126. }
  127. }
  128. return nil
  129. }
  130. func (a AurResult) getDepsFromRPC() (final []string, err error) {
  131. f := func(c rune) bool {
  132. return c == '>' || c == '<' || c == '=' || c == ' '
  133. }
  134. info, err := infoAurPackage(a.Name)
  135. if err != nil {
  136. return
  137. }
  138. if len(info.Results) == 0 {
  139. return final, errors.New("Failed to get deps from RPC")
  140. }
  141. for _, deps := range info.Results[0].MakeDepends {
  142. fields := strings.FieldsFunc(deps, f)
  143. if !isInRepo(fields[0]) {
  144. final = append(final, fields[0])
  145. }
  146. }
  147. for _, deps := range info.Results[0].Depends {
  148. fields := strings.FieldsFunc(deps, f)
  149. if !isInRepo(fields[0]) {
  150. final = append(final, fields[0])
  151. }
  152. }
  153. return
  154. }
  155. func (a AurResult) getAURDependencies() (err error) {
  156. pkglist, err := a.getDepsFromRPC()
  157. fmt.Printf("%+v\n", pkglist)
  158. for _, i := range pkglist {
  159. err = installAURPackage(i, "--asdeps")
  160. if err != nil {
  161. for _, e := range pkglist {
  162. removePackage(e, "sdc")
  163. }
  164. return
  165. }
  166. }
  167. return nil
  168. }
  169. func getInstalledPackage(pkg string) (err error) {
  170. cmd := exec.Command(PacmanBin, "-Qi", pkg)
  171. cmd.Stdout = os.Stdout
  172. cmd.Stderr = os.Stderr
  173. err = cmd.Run()
  174. return
  175. }