github.com/AlpineAIO/wails/v2@v2.0.0-beta.32.0.20240505041856-1047a8fa5fef/internal/system/packagemanager/emerge.go (about) 1 //go:build linux 2 // +build linux 3 4 package packagemanager 5 6 import ( 7 "os/exec" 8 "regexp" 9 "strings" 10 11 "github.com/AlpineAIO/wails/v2/internal/shell" 12 ) 13 14 // Emerge represents the Emerge package manager 15 type Emerge struct { 16 name string 17 osid string 18 } 19 20 // NewEmerge creates a new Emerge instance 21 func NewEmerge(osid string) *Emerge { 22 return &Emerge{ 23 name: "emerge", 24 osid: osid, 25 } 26 } 27 28 // Packages returns the libraries that we need for Wails to compile 29 // They will potentially differ on different distributions or versions 30 func (e *Emerge) Packages() packagemap { 31 return packagemap{ 32 "libgtk-3": []*Package{ 33 {Name: "x11-libs/gtk+", SystemPackage: true, Library: true}, 34 }, 35 "libwebkit": []*Package{ 36 {Name: "net-libs/webkit-gtk", SystemPackage: true, Library: true}, 37 }, 38 "gcc": []*Package{ 39 {Name: "sys-devel/gcc", SystemPackage: true}, 40 }, 41 "pkg-config": []*Package{ 42 {Name: "dev-util/pkgconf", SystemPackage: true}, 43 }, 44 "npm": []*Package{ 45 {Name: "net-libs/nodejs", SystemPackage: true}, 46 }, 47 "docker": []*Package{ 48 {Name: "app-emulation/docker", SystemPackage: true, Optional: true}, 49 }, 50 } 51 } 52 53 // Name returns the name of the package manager 54 func (e *Emerge) Name() string { 55 return e.name 56 } 57 58 // PackageInstalled tests if the given package name is installed 59 func (e *Emerge) PackageInstalled(pkg *Package) (bool, error) { 60 if pkg.SystemPackage == false { 61 return false, nil 62 } 63 stdout, _, err := shell.RunCommand(".", "emerge", "-s", pkg.Name+"$") 64 if err != nil { 65 _, ok := err.(*exec.ExitError) 66 if ok { 67 return false, nil 68 } 69 return false, err 70 } 71 72 regex := `.*\*\s+` + regexp.QuoteMeta(pkg.Name) + `\n(?:\S|\s)+?Latest version installed: (.*)` 73 installedRegex := regexp.MustCompile(regex) 74 matches := installedRegex.FindStringSubmatch(stdout) 75 pkg.Version = "" 76 noOfMatches := len(matches) 77 installed := false 78 if noOfMatches > 1 && matches[1] != "[ Not Installed ]" { 79 installed = true 80 pkg.Version = strings.TrimSpace(matches[1]) 81 } 82 return installed, err 83 } 84 85 // PackageAvailable tests if the given package is available for installation 86 func (e *Emerge) PackageAvailable(pkg *Package) (bool, error) { 87 if pkg.SystemPackage == false { 88 return false, nil 89 } 90 stdout, _, err := shell.RunCommand(".", "emerge", "-s", pkg.Name+"$") 91 // We add a space to ensure we get a full match, not partial match 92 if err != nil { 93 _, ok := err.(*exec.ExitError) 94 if ok { 95 return false, nil 96 } 97 return false, err 98 } 99 100 installedRegex := regexp.MustCompile(`.*\*\s+` + regexp.QuoteMeta(pkg.Name) + `\n(?:\S|\s)+?Latest version available: (.*)`) 101 matches := installedRegex.FindStringSubmatch(stdout) 102 pkg.Version = "" 103 noOfMatches := len(matches) 104 available := false 105 if noOfMatches > 1 { 106 available = true 107 pkg.Version = strings.TrimSpace(matches[1]) 108 } 109 return available, nil 110 } 111 112 // InstallCommand returns the package manager specific command to install a package 113 func (e *Emerge) InstallCommand(pkg *Package) string { 114 if pkg.SystemPackage == false { 115 return pkg.InstallCommand[e.osid] 116 } 117 return "sudo emerge " + pkg.Name 118 }