From d61f6c9e14a9ac8e908ca8b461c89c1df093d7d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Thu, 3 Oct 2024 21:15:07 +0200 Subject: [PATCH] Manager: in setup assistant, find Blender in macOS default install dir On macOS, automatically find Blender when it is installed in the default installation directory (`/Applications/Blender.app`) --- internal/find_blender/darwin.go | 45 ++++++++++++++++++++++++ internal/find_blender/find_blender.go | 15 ++++++-- internal/find_blender/nonwindows.go | 8 ++++- internal/find_blender/windows.go | 6 ++++ internal/manager/api_impl/meta.go | 4 ++- web/app/src/views/SetupAssistantView.vue | 32 +++++++++++++++++ 6 files changed, 106 insertions(+), 4 deletions(-) create mode 100644 internal/find_blender/darwin.go diff --git a/internal/find_blender/darwin.go b/internal/find_blender/darwin.go new file mode 100644 index 00000000..7ed065e9 --- /dev/null +++ b/internal/find_blender/darwin.go @@ -0,0 +1,45 @@ +//go:build darwin + +package find_blender + +import ( + "os" + + "github.com/rs/zerolog/log" +) + +// SPDX-License-Identifier: GPL-3.0-or-later + +const ( + blenderExeName = "Blender" + defaultPath = "/Applications/Blender.app/Contents/MacOS/Blender" +) + +// fileAssociation isn't implemented on non-Windows platforms. +func fileAssociation() (string, error) { + return "", ErrNotAvailable +} + +// searchDefaultPaths search any available platform-specific default locations for Blender to be in. +// Returns the path of the blender executable, or an empty string if nothing is found. +func searchDefaultPaths() string { + stat, err := os.Stat(defaultPath) + + switch { + case os.IsNotExist(err): + return "" + case err != nil: + log.Warn(). + AnErr("cause", err). + Str("path", defaultPath). + Msg("could not check default path, ignoring") + return "" + case stat.IsDir(): + log.Warn(). + Str("path", defaultPath). + Msg("expected Blender executable, but is a directory, ignoring") + return "" + } + + return defaultPath +} diff --git a/internal/find_blender/find_blender.go b/internal/find_blender/find_blender.go index a5503a2c..4cc4009a 100644 --- a/internal/find_blender/find_blender.go +++ b/internal/find_blender/find_blender.go @@ -56,8 +56,7 @@ func CheckBlender(ctx context.Context, exename string) (CheckBlenderResult, erro fullPath, err := fileAssociation() switch { case errors.Is(err, ErrNotAvailable): - // Association finder not available, act as if "blender" was given as exename. - return CheckBlender(ctx, "blender") + break case err != nil: // Some other error occurred, better to report it. return CheckBlenderResult{}, fmt.Errorf("finding .blend file association: %w", err) @@ -65,6 +64,17 @@ func CheckBlender(ctx context.Context, exename string) (CheckBlenderResult, erro // The full path was found, report the Blender version. return getResultWithVersion(ctx, exename, fullPath, api.BlenderPathSourceFileAssociation) } + + // Try some platform-specific default directories. + fullPath = searchDefaultPaths() + if fullPath != "" { + result, err := CheckBlender(ctx, fullPath) + result.Source = api.BlenderPathSourceSystemLocation + return result, err + } + + // Association finder not available, act as if "blender" was given as exename. + return CheckBlender(ctx, "blender") } if crosspath.Dir(exename) != "." { @@ -77,6 +87,7 @@ func CheckBlender(ctx context.Context, exename string) (CheckBlenderResult, erro if err != nil { return CheckBlenderResult{}, err } + return getResultWithVersion(ctx, exename, fullPath, api.BlenderPathSourcePathEnvvar) } diff --git a/internal/find_blender/nonwindows.go b/internal/find_blender/nonwindows.go index 43d45f72..37fca515 100644 --- a/internal/find_blender/nonwindows.go +++ b/internal/find_blender/nonwindows.go @@ -1,4 +1,4 @@ -//go:build !windows +//go:build !windows && !darwin package find_blender @@ -6,6 +6,12 @@ package find_blender const blenderExeName = "blender" +// searchDefaultPaths search any available platform-specific default locations for Blender to be in. +// Returns the path of the blender executable, or an empty string if nothing is found. +func searchDefaultPaths() string { + return "" +} + // fileAssociation isn't implemented on non-Windows platforms. func fileAssociation() (string, error) { return "", ErrNotAvailable diff --git a/internal/find_blender/windows.go b/internal/find_blender/windows.go index bab818a0..4c7104ff 100755 --- a/internal/find_blender/windows.go +++ b/internal/find_blender/windows.go @@ -16,6 +16,12 @@ import ( const blenderExeName = "blender.exe" +// searchDefaultPaths search any available platform-specific default locations for Blender to be in. +// Returns the path of the blender executable, or an empty string if nothing is found. +func searchDefaultPaths() string { + return "" +} + // fileAssociation returns the full path of `blender.exe` associated with ".blend" files. func fileAssociation() (string, error) { exe, err := getFileAssociation(".blend") diff --git a/internal/manager/api_impl/meta.go b/internal/manager/api_impl/meta.go index 491cbb23..02b134b1 100644 --- a/internal/manager/api_impl/meta.go +++ b/internal/manager/api_impl/meta.go @@ -361,7 +361,9 @@ func checkSetupAssistantConfig(config api.SetupAssistantConfig) error { return ErrSetupConfigEmptyPath } - case api.BlenderPathSourceInputPath, api.BlenderPathSourcePathEnvvar: + case api.BlenderPathSourceInputPath, + api.BlenderPathSourcePathEnvvar, + api.BlenderPathSourceSystemLocation: if config.BlenderExecutable.Path == "" || config.BlenderExecutable.Input == "" { return ErrSetupConfigEmptyPathOrInput diff --git a/web/app/src/views/SetupAssistantView.vue b/web/app/src/views/SetupAssistantView.vue index 7e9dc450..57e9c320 100644 --- a/web/app/src/views/SetupAssistantView.vue +++ b/web/app/src/views/SetupAssistantView.vue @@ -163,6 +163,30 @@ + +