5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-02 05:30:22 +08:00
wails/v2/internal/system/packagemanager/zypper.go
George Wang eaca3d06f6
Update zypper.go (#2593)
Add package(webkit2gtk3-soup2-devel) for `libwebkit`.
Change environment variable before running command to query information
of the package.
2023-04-16 10:00:39 +10:00

128 lines
3.1 KiB
Go

//go:build linux
// +build linux
package packagemanager
import (
"os/exec"
"regexp"
"strings"
"github.com/wailsapp/wails/v2/internal/shell"
)
// Zypper represents the Zypper package manager
type Zypper struct {
name string
osid string
}
// NewZypper creates a new Zypper instance
func NewZypper(osid string) *Zypper {
return &Zypper{
name: "zypper",
osid: osid,
}
}
// Packages returns the libraries that we need for Wails to compile
// They will potentially differ on different distributions or versions
func (z *Zypper) Packages() packagemap {
return packagemap{
"libgtk-3": []*Package{
{Name: "gtk3-devel", SystemPackage: true, Library: true},
},
"libwebkit": []*Package{
{Name: "webkit2gtk3-soup2-devel", SystemPackage: true, Library: true},
{Name: "webkit2gtk3-devel", SystemPackage: true, Library: true},
},
"gcc": []*Package{
{Name: "gcc-c++", SystemPackage: true},
},
"pkg-config": []*Package{
{Name: "pkg-config", SystemPackage: true},
{Name: "pkgconf-pkg-config", SystemPackage: true},
},
"npm": []*Package{
{Name: "npm10", SystemPackage: true},
},
"docker": []*Package{
{Name: "docker", SystemPackage: true, Optional: true},
},
}
}
// Name returns the name of the package manager
func (z *Zypper) Name() string {
return z.name
}
// PackageInstalled tests if the given package name is installed
func (z *Zypper) PackageInstalled(pkg *Package) (bool, error) {
if pkg.SystemPackage == false {
return false, nil
}
var env []string
env = shell.SetEnv(env, "LANGUAGE", "en_US.utf-8")
stdout, _, err := shell.RunCommandWithEnv(env, ".", "zypper", "info", pkg.Name)
if err != nil {
_, ok := err.(*exec.ExitError)
if ok {
return false, nil
}
return false, err
}
reg := regexp.MustCompile(`.*Installed\s*:\s*(Yes)\s*`)
matches := reg.FindStringSubmatch(stdout)
pkg.Version = ""
noOfMatches := len(matches)
if noOfMatches > 1 {
z.getPackageVersion(pkg, stdout)
}
return noOfMatches > 1, err
}
// PackageAvailable tests if the given package is available for installation
func (z *Zypper) PackageAvailable(pkg *Package) (bool, error) {
if pkg.SystemPackage == false {
return false, nil
}
var env []string
env = shell.SetEnv(env, "LANGUAGE", "en_US.utf-8")
stdout, _, err := shell.RunCommandWithEnv(env, ".", "zypper", "info", 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
}
available := strings.Contains(stdout, "Information for package")
if available {
z.getPackageVersion(pkg, stdout)
}
return available, nil
}
// InstallCommand returns the package manager specific command to install a package
func (z *Zypper) InstallCommand(pkg *Package) string {
if pkg.SystemPackage == false {
return pkg.InstallCommand[z.osid]
}
return "sudo zypper in " + pkg.Name
}
func (z *Zypper) getPackageVersion(pkg *Package, output string) {
reg := regexp.MustCompile(`.*Version.*:(.*)`)
matches := reg.FindStringSubmatch(output)
pkg.Version = ""
noOfMatches := len(matches)
if noOfMatches > 1 {
pkg.Version = strings.TrimSpace(matches[1])
}
}