diff --git a/v3/internal/doctor/doctor.go b/v3/internal/doctor/doctor.go index 6f658c868..a8a624dd3 100644 --- a/v3/internal/doctor/doctor.go +++ b/v3/internal/doctor/doctor.go @@ -118,7 +118,7 @@ func Run() (err error) { return err } - pterm.DefaultSection.Println("Operating System") + pterm.DefaultSection.Println("System") systemTabledata := pterm.TableData{ {pterm.Sprint("Name"), info.Name}, diff --git a/v3/internal/doctor/doctor_linux.go b/v3/internal/doctor/doctor_linux.go index f7ca3414c..7c64da1a6 100644 --- a/v3/internal/doctor/doctor_linux.go +++ b/v3/internal/doctor/doctor_linux.go @@ -2,74 +2,39 @@ package doctor +import ( + "github.com/wailsapp/wails/v3/internal/doctor/packagemanager" + "github.com/wailsapp/wails/v3/internal/operatingsystem" +) + func getInfo() (map[string]string, bool) { result := make(map[string]string) - /* - pterm.DefaultSection.Println("Dependencies") + ok := true - // Output Dependencies Status - var dependenciesMissing []string - var externalPackages []*packagemanager.Dependency - var dependenciesAvailableRequired = 0 - var dependenciesAvailableOptional = 0 + info, _ := operatingsystem.Info() - dependenciesTableData := pterm.TableData{ - {"Dependency", "Package Name", "Status", "Version"}, - } + pm := packagemanager.Find(info.ID) + deps, _ := packagemanager.Dependencies(pm) + for _, dep := range deps { + var status string - hasOptionalDependencies := false - // Loop over dependencies - for _, dependency := range info.Dependencies { - name := dependency.Name - - if dependency.Optional { - name = pterm.Gray("*") + name - hasOptionalDependencies = true - } - - packageName := "Unknown" - status := pterm.LightRed("Not Found") - - // If we found the package - if dependency.PackageName != "" { - packageName = dependency.PackageName - - // If it's installed, update the status - if dependency.Installed { - status = pterm.LightGreen("Installed") - } else { - // Generate meaningful status text - status = pterm.LightMagenta("Available") - - if dependency.Optional { - dependenciesAvailableOptional++ - } else { - dependenciesAvailableRequired++ - } - } + switch true { + case !dep.Installed: + if dep.Optional { + status = "[Optional] " } else { - if !dependency.Optional { - dependenciesMissing = append(dependenciesMissing, dependency.Name) - } - - if dependency.External { - externalPackages = append(externalPackages, dependency) - } + ok = false } - - dependenciesTableData = append(dependenciesTableData, []string{name, packageName, status, dependency.Version}) + status += "not installed." + if dep.InstallCommand != "" { + status += " Install with: " + dep.InstallCommand + } + case dep.Version != "": + status = dep.Version } - dependenciesTableString, _ := pterm.DefaultTable.WithHasHeader(true).WithData(dependenciesTableData).Srender() - dependenciesBox := pterm.DefaultBox.WithTitleBottomCenter() + result[dep.Name] = status + } - if hasOptionalDependencies { - dependenciesBox = dependenciesBox.WithTitle(pterm.Gray("*") + " - Optional Dependency") - } - - dependenciesBox.Println(dependenciesTableString) - - pterm.Println() // Spacer for sponsor message - */ - return result, true + return result, ok } diff --git a/v3/internal/doctor/packagemanager/apt.go b/v3/internal/doctor/packagemanager/apt.go index 17503490d..89e95ae36 100644 --- a/v3/internal/doctor/packagemanager/apt.go +++ b/v3/internal/doctor/packagemanager/apt.go @@ -3,6 +3,7 @@ package packagemanager import ( + "regexp" "strings" ) @@ -22,8 +23,8 @@ func NewApt(osid string) *Apt { // Packages returns the libraries that we need for Wails to compile // They will potentially differ on different distributions or versions -func (a *Apt) Packages() packagemap { - return packagemap{ +func (a *Apt) Packages() Packagemap { + return Packagemap{ "libgtk-3": []*Package{ {Name: "libgtk-3-dev", SystemPackage: true, Library: true}, }, @@ -39,12 +40,6 @@ func (a *Apt) Packages() packagemap { "npm": []*Package{ {Name: "npm", SystemPackage: true}, }, - "docker": []*Package{ - {Name: "docker.io", SystemPackage: true, Optional: true}, - }, - "nsis": []*Package{ - {Name: "nsis", SystemPackage: true, Optional: true}, - }, } } @@ -73,7 +68,6 @@ func (a *Apt) PackageAvailable(pkg *Package) (bool, error) { } output, err := a.listPackage(pkg.Name) // We add a space to ensure we get a full match, not partial match - output = a.removeEscapeSequences(output) escapechars, _ := regexp.Compile(`\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])`) escapechars.ReplaceAllString(output, "") installed := strings.HasPrefix(output, pkg.Name) diff --git a/v3/internal/doctor/packagemanager/dnf.go b/v3/internal/doctor/packagemanager/dnf.go index c22d3d49d..f9ad17b1e 100644 --- a/v3/internal/doctor/packagemanager/dnf.go +++ b/v3/internal/doctor/packagemanager/dnf.go @@ -23,8 +23,8 @@ func NewDnf(osid string) *Dnf { // Packages returns the libraries that we need for Wails to compile // They will potentially differ on different distributions or versions -func (y *Dnf) Packages() packagemap { - return packagemap{ +func (y *Dnf) Packages() Packagemap { + return Packagemap{ "libgtk-3": []*Package{ {Name: "gtk3-devel", SystemPackage: true, Library: true}, }, @@ -43,20 +43,6 @@ func (y *Dnf) Packages() packagemap { {Name: "npm", SystemPackage: true}, {Name: "nodejs-npm", SystemPackage: true}, }, - "upx": []*Package{ - {Name: "upx", SystemPackage: true, Optional: true}, - }, - "docker": []*Package{ - { - SystemPackage: false, - Optional: true, - InstallCommand: map[string]string{ - "centos": "Follow the guide: https://docs.docker.com/engine/install/centos/", - "fedora": "Follow the guide: https://docs.docker.com/engine/install/fedora/", - }, - }, - {Name: "moby-engine", SystemPackage: true, Optional: true}, - }, } } @@ -95,7 +81,7 @@ func (y *Dnf) PackageAvailable(pkg *Package) (bool, error) { if pkg.SystemPackage == false { return false, nil } - stdout, _, err := execCmd("dnf", "info", pkg.Name) + stdout, err := execCmd("dnf", "info", pkg.Name) // We add a space to ensure we get a full match, not partial match if err != nil { _, ok := err.(*exec.ExitError) diff --git a/v3/internal/doctor/packagemanager/emerge.go b/v3/internal/doctor/packagemanager/emerge.go index b8252be4b..0fc3e2dff 100644 --- a/v3/internal/doctor/packagemanager/emerge.go +++ b/v3/internal/doctor/packagemanager/emerge.go @@ -24,8 +24,8 @@ func NewEmerge(osid string) *Emerge { // 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{ +func (e *Emerge) Packages() Packagemap { + return Packagemap{ "libgtk-3": []*Package{ {Name: "x11-libs/gtk+", SystemPackage: true, Library: true}, }, @@ -41,9 +41,6 @@ func (e *Emerge) Packages() packagemap { "npm": []*Package{ {Name: "net-libs/nodejs", SystemPackage: true}, }, - "docker": []*Package{ - {Name: "app-emulation/docker", SystemPackage: true, Optional: true}, - }, } } diff --git a/v3/internal/doctor/packagemanager/eopkg.go b/v3/internal/doctor/packagemanager/eopkg.go index e75256945..36f02b3a6 100644 --- a/v3/internal/doctor/packagemanager/eopkg.go +++ b/v3/internal/doctor/packagemanager/eopkg.go @@ -25,8 +25,8 @@ func NewEopkg(osid string) *Eopkg { // Packages returns the packages that we need for Wails to compile // They will potentially differ on different distributions or versions -func (e *Eopkg) Packages() packagemap { - return packagemap{ +func (e *Eopkg) Packages() Packagemap { + return Packagemap{ "libgtk-3": []*Package{ {Name: "libgtk-3-devel", SystemPackage: true, Library: true}, }, @@ -42,9 +42,6 @@ func (e *Eopkg) Packages() packagemap { "npm": []*Package{ {Name: "nodejs", SystemPackage: true}, }, - "docker": []*Package{ - {Name: "docker", SystemPackage: true, Optional: true}, - }, } } diff --git a/v3/internal/doctor/packagemanager/nixpkgs.go b/v3/internal/doctor/packagemanager/nixpkgs.go index 57b1ed023..ae0f66db5 100644 --- a/v3/internal/doctor/packagemanager/nixpkgs.go +++ b/v3/internal/doctor/packagemanager/nixpkgs.go @@ -32,14 +32,14 @@ func NewNixpkgs(osid string) *Nixpkgs { // Packages returns the libraries that we need for Wails to compile // They will potentially differ on different distributions or versions -func (n *Nixpkgs) Packages() packagemap { +func (n *Nixpkgs) Packages() Packagemap { // Currently, only support checking the default channel. channel := "nixpkgs" if n.osid == "nixos" { channel = "nixos" } - return packagemap{ + return Packagemap{ "libgtk-3": []*Package{ {Name: channel + ".gtk3", SystemPackage: true, Library: true}, }, @@ -55,15 +55,6 @@ func (n *Nixpkgs) Packages() packagemap { "npm": []*Package{ {Name: channel + ".nodejs", SystemPackage: true}, }, - "upx": []*Package{ - {Name: channel + ".upx", SystemPackage: true, Optional: true}, - }, - "docker": []*Package{ - {Name: channel + ".docker", SystemPackage: true, Optional: true}, - }, - "nsis": []*Package{ - {Name: channel + ".nsis", SystemPackage: true, Optional: true}, - }, } } diff --git a/v3/internal/doctor/packagemanager/packagemanager.go b/v3/internal/doctor/packagemanager/packagemanager.go index f318b1432..800b05f7a 100644 --- a/v3/internal/doctor/packagemanager/packagemanager.go +++ b/v3/internal/doctor/packagemanager/packagemanager.go @@ -3,10 +3,11 @@ package packagemanager import ( + "bytes" + "os" + "os/exec" "sort" "strings" - - "github.com/wailsapp/wails/v2/internal/shell" ) func execCmd(command string, args ...string) (string, error) { @@ -30,12 +31,21 @@ var pmcommands = []string{ "nix-env", } +// commandExists returns true if the given command can be found on the shell +func commandExists(name string) bool { + _, err := exec.LookPath(name) + if err != nil { + return false + } + return true +} + // Find will attempt to find the system package manager func Find(osid string) PackageManager { // Loop over pmcommands for _, pmname := range pmcommands { - if shell.CommandExists(pmname) { + if commandExists(pmname) { return newPackageManager(pmname, osid) } } @@ -124,10 +134,6 @@ func AppVersion(name string) string { return npmVersion() } - if name == "docker" { - return dockerVersion() - } - return "" } @@ -138,13 +144,13 @@ func gccVersion() string { var err error // Try "-dumpfullversion" - version, _, err = shell.RunCommand(".", "gcc", "-dumpfullversion") + version, err = execCmd("gcc", "-dumpfullversion") if err != nil { // Try -dumpversion // We ignore the error as this function is not for testing whether the // application exists, only that we can get the version number - dumpversion, _, err := shell.RunCommand(".", "gcc", "-dumpversion") + dumpversion, err := execCmd("gcc", "-dumpversion") if err == nil { version = dumpversion } @@ -153,19 +159,11 @@ func gccVersion() string { } func pkgConfigVersion() string { - version, _, _ := shell.RunCommand(".", "pkg-config", "--version") + version, _ := execCmd("pkg-config", "--version") return strings.TrimSpace(version) } func npmVersion() string { - version, _, _ := shell.RunCommand(".", "npm", "--version") + version, _ := execCmd("npm", "--version") return strings.TrimSpace(version) } - -func dockerVersion() string { - version, _, _ := shell.RunCommand(".", "docker", "--version") - version = strings.TrimPrefix(version, "Docker version ") - version = strings.ReplaceAll(version, ", build ", " (") - version = strings.TrimSpace(version) + ")" - return version -} diff --git a/v3/internal/doctor/packagemanager/pacman.go b/v3/internal/doctor/packagemanager/pacman.go index 9f23514d1..d7eb1607c 100644 --- a/v3/internal/doctor/packagemanager/pacman.go +++ b/v3/internal/doctor/packagemanager/pacman.go @@ -24,8 +24,8 @@ func NewPacman(osid string) *Pacman { // Packages returns the libraries that we need for Wails to compile // They will potentially differ on different distributions or versions -func (p *Pacman) Packages() packagemap { - return packagemap{ +func (p *Pacman) Packages() Packagemap { + return Packagemap{ "libgtk-3": []*Package{ {Name: "gtk3", SystemPackage: true, Library: true}, }, @@ -41,9 +41,6 @@ func (p *Pacman) Packages() packagemap { "npm": []*Package{ {Name: "npm", SystemPackage: true}, }, - "docker": []*Package{ - {Name: "docker", SystemPackage: true, Optional: true}, - }, } } diff --git a/v3/internal/doctor/packagemanager/zypper.go b/v3/internal/doctor/packagemanager/zypper.go index 14ed8b5d2..afd5fd26c 100644 --- a/v3/internal/doctor/packagemanager/zypper.go +++ b/v3/internal/doctor/packagemanager/zypper.go @@ -25,8 +25,8 @@ func NewZypper(osid string) *Zypper { // 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{ +func (z *Zypper) Packages() Packagemap { + return Packagemap{ "libgtk-3": []*Package{ {Name: "gtk3-devel", SystemPackage: true, Library: true}, }, @@ -44,9 +44,6 @@ func (z *Zypper) Packages() packagemap { "npm": []*Package{ {Name: "npm10", SystemPackage: true}, }, - "docker": []*Package{ - {Name: "docker", SystemPackage: true, Optional: true}, - }, } } @@ -60,7 +57,7 @@ func (z *Zypper) PackageInstalled(pkg *Package) (bool, error) { if pkg.SystemPackage == false { return false, nil } - stdout, err := cmdExec("zypper", "info", pkg.Name) + stdout, err := execCmd("zypper", "info", pkg.Name) if err != nil { _, ok := err.(*exec.ExitError) if ok { @@ -83,8 +80,7 @@ func (z *Zypper) PackageAvailable(pkg *Package) (bool, error) { if pkg.SystemPackage == false { return false, nil } - var env []string - stdout, err := cmdExec("zypper", "info", pkg.Name) + stdout, err := execCmd("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) diff --git a/v3/internal/operatingsystem/os_linux.go b/v3/internal/operatingsystem/os_linux.go index 49e00c02c..715207dc5 100644 --- a/v3/internal/operatingsystem/os_linux.go +++ b/v3/internal/operatingsystem/os_linux.go @@ -40,11 +40,13 @@ func parseOsRelease(osRelease string) *OS { } switch splitLine[0] { case "ID": - result.ID = strings.ToLower(strings.Trim(splitLine[1], "\"")) + result.ID = strings.ToLower(strings.Trim(splitLine[1], `"`)) case "NAME": - result.Name = strings.Trim(splitLine[1], "\"") + result.Name = strings.Trim(splitLine[1], `"`) case "VERSION_ID": - result.Version = strings.Trim(splitLine[1], "\"") + result.Version = strings.Trim(splitLine[1], `"`) + case "VERSION": + result.Branding = strings.Trim(splitLine[1], `"`) } } return &result