mirror of
https://github.com/hanzoai/base.git
synced 2026-10-21 03:41:50 +00:00
Every non-handler call site that wrapped a value in slog.String/Int/Bool/Any/Float64/Uint64 was passing an Attr through the variadic any... slot of (*slog.Logger).Info/Warn/Error/Debug; the same slot accepts the bare "key", value pair with identical semantics. Drop the wrapper so the surface is one level less indirect and so the next two commits can swap (*slog.Logger) for a small Logger interface without rewriting every attr expression as well. 23 files, 156 call sites collapsed; no behavior change. Five files — tools/logger/log.go, tools/logger/batch_handler.go +_test, and core/log_printer.go +_test — are the handler-implementation layer and legitimately reference slog.Attr/Level/Group; they were skipped.
83 lines
2.7 KiB
Go
83 lines
2.7 KiB
Go
package base
|
|
|
|
import (
|
|
"fmt"
|
|
"runtime/debug"
|
|
|
|
"github.com/fatih/color"
|
|
"github.com/hanzoai/base/core"
|
|
)
|
|
|
|
const (
|
|
expectedDriverVersion = "v1.46.2"
|
|
expectedLibcVersion = "v1.70.0"
|
|
|
|
// ModerncDepsCheckHookId is the id of the hook that performs the modernc.org/* deps checks.
|
|
// It could be used for removing/unbinding the hook if you don't want the checks.
|
|
ModerncDepsCheckHookId = "baseModerncDepsCheck"
|
|
)
|
|
|
|
// checkModerncDeps checks whether the current binary was built with the
|
|
// expected and tested modernc driver dependencies.
|
|
//
|
|
// This is needed because modernc.org/libc doesn't follow semantic versioning
|
|
// and using a version different from the one in the go.mod of modernc.org/sqlite
|
|
// could have unintended side-effects and cause obscure build and runtime bugs
|
|
// (https://github.com/hanzoai/base/issues/6136).
|
|
func checkModerncDeps(app core.App) {
|
|
info, ok := debug.ReadBuildInfo()
|
|
if !ok {
|
|
return // no build info (probably compiled without module support)
|
|
}
|
|
|
|
var driverVersion, libcVersion string
|
|
|
|
for _, dep := range info.Deps {
|
|
switch dep.Path {
|
|
case "modernc.org/libc":
|
|
libcVersion = dep.Version
|
|
case "modernc.org/sqlite":
|
|
driverVersion = dep.Version
|
|
}
|
|
|
|
// no need to further search if both deps are located
|
|
if driverVersion != "" && libcVersion != "" {
|
|
break
|
|
}
|
|
}
|
|
|
|
// not using the default driver
|
|
if driverVersion == "" {
|
|
return
|
|
}
|
|
|
|
var msg string
|
|
if driverVersion != expectedDriverVersion {
|
|
msg = fmt.Sprintf(
|
|
"You are using modernc.org/sqlite %s which differs from the expected and tested %s.\n"+
|
|
"Make sure to either manually update in your go.mod the dependency version to the expected one OR if you want to keep yours "+
|
|
"ensure that its indirect modernc.org/libc dependency has the same version as in the https://gitlab.com/cznic/sqlite/-/blob/master/go.mod, "+
|
|
"otherwise it could result in unexpected build or runtime errors.",
|
|
driverVersion,
|
|
expectedDriverVersion,
|
|
)
|
|
app.Logger().Warn(msg, "current", driverVersion, "expected", expectedDriverVersion)
|
|
} else if libcVersion != expectedLibcVersion {
|
|
msg = fmt.Sprintf(
|
|
"You are using modernc.org/libc %s which differs from the expected and tested %s.\n"+
|
|
"Please update your go.mod and manually set modernc.org/libc to %s, otherwise it could result in unexpected build or runtime errors "+
|
|
"(you may have to also run 'go clean -modcache' to clear the cache if the warning persists).",
|
|
libcVersion,
|
|
expectedLibcVersion,
|
|
expectedLibcVersion,
|
|
)
|
|
app.Logger().Warn(msg, "current", libcVersion, "expected", expectedLibcVersion)
|
|
}
|
|
|
|
// ensure that the message is printed to the default stderr too
|
|
// (when in dev mode this is not needed because we print all logs)
|
|
if msg != "" && !app.IsDev() {
|
|
color.Yellow("\nWARN " + msg + "\n\n")
|
|
}
|
|
}
|