local_install.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package main
  2. import (
  3. "context"
  4. "fmt"
  5. "os"
  6. "path/filepath"
  7. "strings"
  8. "github.com/Jguer/aur"
  9. "github.com/Jguer/yay/v11/pkg/db"
  10. "github.com/Jguer/yay/v11/pkg/dep"
  11. "github.com/Jguer/yay/v11/pkg/query"
  12. "github.com/Jguer/yay/v11/pkg/settings/parser"
  13. "github.com/Jguer/yay/v11/pkg/topo"
  14. gosrc "github.com/Morganamilo/go-srcinfo"
  15. "github.com/leonelquinteros/gotext"
  16. "github.com/pkg/errors"
  17. )
  18. func archStringToString(alpmArches []string, archString []gosrc.ArchString) []string {
  19. pkgs := make([]string, 0, len(archString))
  20. for _, arch := range archString {
  21. if alpmArchIsSupported(alpmArches, arch.Arch) {
  22. pkgs = append(pkgs, arch.Value)
  23. }
  24. }
  25. return pkgs
  26. }
  27. func makeAURPKGFromSrcinfo(dbExecutor db.Executor, srcInfo *gosrc.Srcinfo) ([]aur.Pkg, error) {
  28. pkgs := make([]aur.Pkg, 0, 1)
  29. alpmArch, err := dbExecutor.AlpmArchitectures()
  30. if err != nil {
  31. return nil, err
  32. }
  33. alpmArch = append(alpmArch, "") // srcinfo assumes no value as ""
  34. for _, pkg := range srcInfo.Packages {
  35. pkgs = append(pkgs, aur.Pkg{
  36. ID: 0,
  37. Name: pkg.Pkgname,
  38. PackageBaseID: 0,
  39. PackageBase: srcInfo.Pkgbase,
  40. Version: srcInfo.Version(),
  41. Description: pkg.Pkgdesc,
  42. URL: pkg.URL,
  43. Depends: append(archStringToString(alpmArch, pkg.Depends), archStringToString(alpmArch, srcInfo.Package.Depends)...),
  44. MakeDepends: archStringToString(alpmArch, srcInfo.PackageBase.MakeDepends),
  45. CheckDepends: archStringToString(alpmArch, srcInfo.PackageBase.CheckDepends),
  46. Conflicts: append(archStringToString(alpmArch, pkg.Conflicts), archStringToString(alpmArch, srcInfo.Package.Conflicts)...),
  47. Provides: append(archStringToString(alpmArch, pkg.Provides), archStringToString(alpmArch, srcInfo.Package.Provides)...),
  48. Replaces: append(archStringToString(alpmArch, pkg.Replaces), archStringToString(alpmArch, srcInfo.Package.Replaces)...),
  49. OptDepends: []string{},
  50. Groups: pkg.Groups,
  51. License: pkg.License,
  52. Keywords: []string{},
  53. })
  54. }
  55. return pkgs, nil
  56. }
  57. func splitDep(dep string) (pkg, mod, ver string) {
  58. split := strings.FieldsFunc(dep, func(c rune) bool {
  59. match := c == '>' || c == '<' || c == '='
  60. if match {
  61. mod += string(c)
  62. }
  63. return match
  64. })
  65. if len(split) == 0 {
  66. return "", "", ""
  67. }
  68. if len(split) == 1 {
  69. return split[0], "", ""
  70. }
  71. return split[0], mod, split[1]
  72. }
  73. func installLocalPKGBUILD(
  74. ctx context.Context,
  75. cmdArgs *parser.Arguments,
  76. dbExecutor db.Executor,
  77. aurClient aur.ClientInterface,
  78. ignoreProviders bool,
  79. ) error {
  80. wd, err := os.Getwd()
  81. if err != nil {
  82. return errors.Wrap(err, gotext.Get("failed to retrieve working directory"))
  83. }
  84. if len(cmdArgs.Targets) > 1 {
  85. return errors.New(gotext.Get("only one target is allowed"))
  86. }
  87. if len(cmdArgs.Targets) == 1 {
  88. wd = cmdArgs.Targets[0]
  89. }
  90. pkgbuild, err := gosrc.ParseFile(filepath.Join(wd, ".SRCINFO"))
  91. if err != nil {
  92. return errors.Wrap(err, gotext.Get("failed to parse .SRCINFO"))
  93. }
  94. aurPkgs, err := makeAURPKGFromSrcinfo(dbExecutor, pkgbuild)
  95. if err != nil {
  96. return err
  97. }
  98. graph := topo.New[string]()
  99. for _, pkg := range aurPkgs {
  100. depSlice := dep.ComputeCombinedDepList(&pkg, false, false)
  101. addNodes(dbExecutor, aurClient, pkg.Name, pkg.PackageBase, depSlice, graph)
  102. }
  103. fmt.Println(graph)
  104. return nil
  105. }
  106. func addNodes(dbExecutor db.Executor, aurClient aur.ClientInterface, pkgName string, pkgBase string, deps []string, graph *topo.Graph[string]) {
  107. graph.AddNode(pkgBase)
  108. graph.Alias(pkgBase, pkgName)
  109. for _, depString := range deps {
  110. depName, _, _ := splitDep(depString)
  111. if dbExecutor.LocalSatisfierExists(depString) {
  112. continue
  113. }
  114. graph.DependOn(depName, pkgBase)
  115. if alpmPkg := dbExecutor.SyncSatisfier(depString); alpmPkg != nil {
  116. newDeps := alpmPkg.Depends().Slice()
  117. newDepsSlice := make([]string, 0, len(newDeps))
  118. for _, newDep := range newDeps {
  119. newDepsSlice = append(newDepsSlice, newDep.Name)
  120. }
  121. addNodes(dbExecutor, aurClient, alpmPkg.Name(), alpmPkg.Base(), newDepsSlice, graph)
  122. }
  123. warnings := query.AURWarnings{}
  124. if aurPkgs, _ := query.AURInfo(context.TODO(), aurClient, []string{depName}, &warnings, 1); len(aurPkgs) != 0 {
  125. pkg := aurPkgs[0]
  126. newDeps := dep.ComputeCombinedDepList(pkg, false, false)
  127. newDepsSlice := make([]string, 0, len(newDeps))
  128. addNodes(dbExecutor, aurClient, pkg.PackageBase, pkg.Name, newDepsSlice, graph)
  129. }
  130. }
  131. return
  132. }