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  }