Manager: allow setup to finish without Blender #104306

Manually merged
Sybren A. Stüvel merged 34 commits from abelli/flamenco:issue100195 into main 2024-09-09 11:22:42 +02:00
Showing only changes of commit 7cac860d4a - Show all commits

View File

@ -15,6 +15,7 @@ import (
"strings" "strings"
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"github.com/rs/zerolog"
"projects.blender.org/studio/flamenco/internal/appinfo" "projects.blender.org/studio/flamenco/internal/appinfo"
"projects.blender.org/studio/flamenco/internal/find_blender" "projects.blender.org/studio/flamenco/internal/find_blender"
"projects.blender.org/studio/flamenco/internal/manager/config" "projects.blender.org/studio/flamenco/internal/manager/config"
@ -266,9 +267,9 @@ func (f *Flamenco) SaveSetupAssistantConfig(e echo.Context) error {
logger = logger.With().Interface("config", setupAssistantCfg).Logger() logger = logger.With().Interface("config", setupAssistantCfg).Logger()
if setupAssistantCfg.StorageLocation == "" || if setupAssistantCfg.StorageLocation == "" ||
abelli marked this conversation as resolved Outdated

The work cannot be done, and so this should be logged as an error, not a warning.

I usually log errors as a 'cause' field:

logger.Error().AnErr("cause", err).Msg("setup assistant: configuration is incomplete")

Alternatively, if you want to keep the error message as part of the log message, you could use .Msgf(...) instead:

logger.Error().Msgf("setup assistant: configuration is incomplete, %v", err)

%v is Go's generic "put the thing's value here", and should result in the value of err.Error().

The work cannot be done, and so this should be logged as an error, not a warning. I usually log errors as a 'cause' field: ```go logger.Error().AnErr("cause", err).Msg("setup assistant: configuration is incomplete") ``` Alternatively, if you want to keep the error message as part of the log message, you could use `.Msgf(...)` instead: ```go logger.Error().Msgf("setup assistant: configuration is incomplete, %v", err) ``` `%v` is Go's generic "put the thing's value here", and should result in the value of `err.Error()`.
isBlenderPathCheckResultIncomplete(setupAssistantCfg.BlenderExecutable) { isBlenderPathCheckResultIncomplete(setupAssistantCfg.BlenderExecutable, logger) {
abelli marked this conversation as resolved Outdated

It's fine to include the actual error message in the response as well, so that the caller knows what's wrong without checking the Manager log.

It's fine to include the actual error message in the response as well, so that the caller knows what's wrong without checking the Manager log.
logger.Warn().Msg("setup assistant: configuration is invalid or incomplete, unable to accept") logger.Warn().Msg("setup assistant: configuration is incomplete, unable to accept")
return sendAPIError(e, http.StatusBadRequest, "configuration is invalid or incomplete") return sendAPIError(e, http.StatusBadRequest, "configuration is incomplete")
} }
conf := f.config.Get() conf := f.config.Get()
@ -336,7 +337,7 @@ func commandNeedsQuoting(cmd string) bool {
return strings.ContainsAny(cmd, "\n\t;()") return strings.ContainsAny(cmd, "\n\t;()")
} }
func isBlenderPathCheckResultIncomplete(checkResult api.BlenderPathCheckResult) bool { func isBlenderPathCheckResultIncomplete(checkResult api.BlenderPathCheckResult, logger zerolog.Logger) bool {
switch checkResult.Source { switch checkResult.Source {
case api.BlenderPathSourceDefault: case api.BlenderPathSourceDefault:
if !checkResult.IsUsable { if !checkResult.IsUsable {
abelli marked this conversation as resolved Outdated

The check for IsUsable can be moved out of the switch since it's the same for every case anyway.

The check for `IsUsable` can be moved out of the `switch` since it's the same for every `case` anyway.
@ -357,5 +358,7 @@ func isBlenderPathCheckResultIncomplete(checkResult api.BlenderPathCheckResult)
} }
return false return false
} }
abelli marked this conversation as resolved Outdated

Add another case "". That way the dynamically generated error below doesn't just show "unknown 'source' field value: " if the source field is empty.

Another solution would be to use the %q format specifier in the below-suggested call to fmt.Errorf(), but that would always put quotes around the value. If that error is then subsequently logged with something like log.Error().Err(err).Msg("whatever"), those quotes will get escaped and things will be uglier than necessary. So that's why I think it's nicer to handle the empty string as a special case, and keep the non-empty-string case without quotes.

Add another `case ""`. That way the dynamically generated error below doesn't just show `"unknown 'source' field value: "` if the `source` field is empty. Another solution would be to use the `%q` format specifier in the below-suggested call to `fmt.Errorf()`, but that would _always_ put quotes around the value. If that error is then subsequently logged with something like `log.Error().Err(err).Msg("whatever")`, those quotes will get escaped and things will be uglier than necessary. So that's why I think it's nicer to handle the empty string as a special case, and keep the non-empty-string case without quotes.
logger.Warn().Msg("received an unexpected blender path source")
abelli marked this conversation as resolved Outdated

This function could return an error instead of a boolean. That error can then not only be used to communicate what is still missing, but also cover this case. That'll avoid the need to pass a logger to the function.

This function could return an error instead of a boolean. That error can then not only be used to communicate what is still missing, but also cover this case. That'll avoid the need to pass a logger to the function.

Unfortunately Gitea does not support multiple comments for the same source line. So I'll reply to the previous one, even though at this line number there is now different code.

		return errors.New("unknown 'source' field value: " + string(config.BlenderExecutable.Source)) 

This should use fmt.Errorf() instead.

Unfortunately Gitea does not support multiple comments for the same source line. So I'll reply to the previous one, even though at this line number there is now different code. ``` return errors.New("unknown 'source' field value: " + string(config.BlenderExecutable.Source)) ``` This should use `fmt.Errorf()` instead.
return true return true
} }