From e4fac1294f3fcedea5bc94668d56ec64e651bc98 Mon Sep 17 00:00:00 2001 From: Adam Weinberger Date: Wed, 5 Oct 2022 10:59:57 -0600 Subject: core: Set version manually via CustomVersion (#5072) * Allow version to be set manually When Caddy is built from a release tarball (as downloaded from GitHub), `caddy version` returns an empty string. This causes confusion for downstream packagers. With this commit, VersionString can be set with eg. go build (...) -ldflags '-X (...).VersionString=v1.2.3' Then the short form version will be "v1.2.3", and the full version string will begin with "v1.2.3 ". * Prefer embedded version, then CustomVersion * Prefer "unknown" for full version over empty Co-authored-by: Matthew Holt --- caddy.go | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/caddy.go b/caddy.go index 584865bdc..1ecad94e5 100644 --- a/caddy.go +++ b/caddy.go @@ -824,6 +824,20 @@ func InstanceID() (uuid.UUID, error) { return uuid.ParseBytes(uuidFileBytes) } +// CustomVersion is an optional string that overrides Caddy's +// reported version. It can be helpful when downstream packagers +// need to manually set Caddy's version. If no other version +// information is available, the short form version (see +// Version()) will be set to CustomVersion, and the full version +// will include CustomVersion at the beginning. +// +// Set this variable during `go build` with `-ldflags`: +// +// -ldflags '-X github.com/caddyserver/caddy/v2.CustomVersion=v2.6.2' +// +// for example. +var CustomVersion string + // Version returns the Caddy version in a simple/short form, and // a full version string. The short form will not have spaces and // is intended for User-Agent strings and similar, but may be @@ -833,8 +847,10 @@ func InstanceID() (uuid.UUID, error) { // build info provided by go.mod dependencies; then it tries to // get info from embedded VCS information, which requires having // built Caddy from a git repository. If no version is available, -// this function returns "(devel)" becaise Go uses that, but for -// the simple form we change it to "unknown". +// this function returns "(devel)" because Go uses that, but for +// the simple form we change it to "unknown". If still no version +// is available (e.g. no VCS repo), then it will use CustomVersion; +// CustomVersion is always prepended to the full version string. // // See relevant Go issues: https://github.com/golang/go/issues/29228 // and https://github.com/golang/go/issues/50603. @@ -910,8 +926,22 @@ func Version() (simple, full string) { } } + if full == "" { + if CustomVersion != "" { + full = CustomVersion + } else { + full = "unknown" + } + } else if CustomVersion != "" { + full = CustomVersion + " " + full + } + if simple == "" || simple == "(devel)" { - simple = "unknown" + if CustomVersion != "" { + simple = CustomVersion + } else { + simple = "unknown" + } } return -- cgit v1.2.3