flamenco/pkg/sysinfo/sysinfo_darwin.go
Srivathsav-Kyatham 4be5c1ca5b Update Darwin system information implementation (#104361)
Instead of just showing "macOS", now show the name as declared by the
OS itself, the version, and the kernel/build version.

Reviewed-on: https://projects.blender.org/studio/flamenco/pulls/104361
Reviewed-by: Sybren A. Stüvel <sybren@blender.org>
2025-03-25 10:45:57 +01:00

77 lines
1.7 KiB
Go

package sysinfo
// SPDX-License-Identifier: GPL-3.0-or-later
import (
"encoding/xml"
"fmt"
"os"
"strings"
"github.com/rs/zerolog/log"
)
type PlistData struct {
XMLName xml.Name `xml:"plist"`
Dict Dict `xml:"dict"`
}
type Dict struct {
Keys []string `xml:"key"`
Strings []string `xml:"string"`
}
// canSymlink always returns true, as symlinking on non-Windows platforms is not hard.
func canSymlink() (bool, error) {
return true, nil
}
func description() (string, error) {
plistFile := "/System/Library/CoreServices/SystemVersion.plist"
info, err := getSystemInfo(plistFile)
if err != nil {
log.Warn().Err(err).Msg("Could not retrieve system information")
return "macOS", nil
}
return info, nil
}
func getSystemInfo(plistFile string) (string, error) {
data, err := os.ReadFile(plistFile)
if err != nil {
return "", fmt.Errorf("could not read system info file %s: %w", plistFile, err)
}
var plist PlistData
if err := xml.Unmarshal(data, &plist); err != nil {
return "", fmt.Errorf("failed to read system info from %s: %w", plistFile, err)
}
productName := "macOS"
var productVersion, buildVersion string
for i, key := range plist.Dict.Keys {
if i >= len(plist.Dict.Strings) {
break
}
switch key {
case "ProductName":
productName = plist.Dict.Strings[i]
case "ProductVersion":
productVersion = plist.Dict.Strings[i]
case "ProductBuildVersion":
buildVersion = plist.Dict.Strings[i]
}
}
parts := []string{productName}
if productVersion != "" {
parts = append(parts, productVersion)
}
if buildVersion != "" {
parts = append(parts, fmt.Sprintf("(Build %s)", buildVersion))
}
return strings.Join(parts, " "), nil
}