mirror of
https://github.com/taigrr/wails.git
synced 2026-04-02 05:08:54 -07:00
Merge commit 'a213e8bcd1d8e4e5c764978879d875d2d55dd400' as 'v2'
This commit is contained in:
117
v2/internal/system/packagemanager/emerge.go
Normal file
117
v2/internal/system/packagemanager/emerge.go
Normal file
@@ -0,0 +1,117 @@
|
||||
// +build linux
|
||||
|
||||
package packagemanager
|
||||
|
||||
import (
|
||||
"os/exec"
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
"github.com/wailsapp/wails/v2/internal/shell"
|
||||
)
|
||||
|
||||
// Emerge represents the Emerge package manager
|
||||
type Emerge struct {
|
||||
name string
|
||||
osid string
|
||||
}
|
||||
|
||||
// NewEmerge creates a new Emerge instance
|
||||
func NewEmerge(osid string) *Emerge {
|
||||
return &Emerge{
|
||||
name: "emerge",
|
||||
osid: osid,
|
||||
}
|
||||
}
|
||||
|
||||
// Packages returns the libraries that we need for Wails to compile
|
||||
// They will potentially differ on different distributions or versions
|
||||
func (e *Emerge) Packages() packagemap {
|
||||
return packagemap{
|
||||
"libgtk-3": []*Package{
|
||||
{Name: "x11-libs/gtk+", SystemPackage: true, Library: true},
|
||||
},
|
||||
"libwebkit": []*Package{
|
||||
{Name: "net-libs/webkit-gtk", SystemPackage: true, Library: true},
|
||||
},
|
||||
"gcc": []*Package{
|
||||
{Name: "sys-devel/gcc", SystemPackage: true},
|
||||
},
|
||||
"pkg-config": []*Package{
|
||||
{Name: "dev-util/pkgconf", SystemPackage: true},
|
||||
},
|
||||
"npm": []*Package{
|
||||
{Name: "net-libs/nodejs", SystemPackage: true},
|
||||
},
|
||||
"docker": []*Package{
|
||||
{Name: "app-emulation/docker", SystemPackage: true, Optional: true},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
// Name returns the name of the package manager
|
||||
func (e *Emerge) Name() string {
|
||||
return e.name
|
||||
}
|
||||
|
||||
// PackageInstalled tests if the given package name is installed
|
||||
func (e *Emerge) PackageInstalled(pkg *Package) (bool, error) {
|
||||
if pkg.SystemPackage == false {
|
||||
return false, nil
|
||||
}
|
||||
stdout, _, err := shell.RunCommand(".", "emerge", "-s", pkg.Name+"$")
|
||||
if err != nil {
|
||||
_, ok := err.(*exec.ExitError)
|
||||
if ok {
|
||||
return false, nil
|
||||
}
|
||||
return false, err
|
||||
}
|
||||
|
||||
regex := `.*\*\s+` + regexp.QuoteMeta(pkg.Name) + `\n(?:\S|\s)+?Latest version installed: (.*)`
|
||||
installedRegex := regexp.MustCompile(regex)
|
||||
matches := installedRegex.FindStringSubmatch(stdout)
|
||||
pkg.Version = ""
|
||||
noOfMatches := len(matches)
|
||||
installed := false
|
||||
if noOfMatches > 1 && matches[1] != "[ Not Installed ]" {
|
||||
installed = true
|
||||
pkg.Version = strings.TrimSpace(matches[1])
|
||||
}
|
||||
return installed, err
|
||||
}
|
||||
|
||||
// PackageAvailable tests if the given package is available for installation
|
||||
func (e *Emerge) PackageAvailable(pkg *Package) (bool, error) {
|
||||
if pkg.SystemPackage == false {
|
||||
return false, nil
|
||||
}
|
||||
stdout, _, err := shell.RunCommand(".", "emerge", "-s", pkg.Name+"$")
|
||||
// We add a space to ensure we get a full match, not partial match
|
||||
if err != nil {
|
||||
_, ok := err.(*exec.ExitError)
|
||||
if ok {
|
||||
return false, nil
|
||||
}
|
||||
return false, err
|
||||
}
|
||||
|
||||
installedRegex := regexp.MustCompile(`.*\*\s+` + regexp.QuoteMeta(pkg.Name) + `\n(?:\S|\s)+?Latest version available: (.*)`)
|
||||
matches := installedRegex.FindStringSubmatch(stdout)
|
||||
pkg.Version = ""
|
||||
noOfMatches := len(matches)
|
||||
available := false
|
||||
if noOfMatches > 1 {
|
||||
available = true
|
||||
pkg.Version = strings.TrimSpace(matches[1])
|
||||
}
|
||||
return available, nil
|
||||
}
|
||||
|
||||
// InstallCommand returns the package manager specific command to install a package
|
||||
func (e *Emerge) InstallCommand(pkg *Package) string {
|
||||
if pkg.SystemPackage == false {
|
||||
return pkg.InstallCommand[e.osid]
|
||||
}
|
||||
return "sudo emerge " + pkg.Name
|
||||
}
|
||||
Reference in New Issue
Block a user