From f213bdf7d6ad0fa6e409292107cf4da0391665c6 Mon Sep 17 00:00:00 2001 From: Hintay Date: Mon, 3 Feb 2025 21:56:08 +0900 Subject: [PATCH] feat: add version command --- .gitignore | 1 + cmd/version/generate.go | 83 +++++++++++++++++++++++++++++++++++++ internal/cmd/main.go | 7 ++++ internal/version/version.go | 7 ++++ main.go | 2 + 5 files changed, 100 insertions(+) create mode 100644 cmd/version/generate.go create mode 100644 internal/version/version.go diff --git a/.gitignore b/.gitignore index 6dd5e8bb..75ccda17 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ app/.status_hash casdoor.pub .idea/deployment.xml .idea/webServers.xml +*.gen.go diff --git a/cmd/version/generate.go b/cmd/version/generate.go new file mode 100644 index 00000000..cf8144e0 --- /dev/null +++ b/cmd/version/generate.go @@ -0,0 +1,83 @@ +package main + +import ( + "encoding/json" + "errors" + "fmt" + "io" + "io/fs" + "log" + "os" + "path" + "runtime" + + "github.com/0xJacky/Nginx-UI/app" +) + +type VersionInfo struct { + Version string `json:"version"` + BuildId int `json:"build_id"` + TotalBuild int `json:"total_build"` +} + +func main() { + _, file, _, ok := runtime.Caller(0) + if !ok { + log.Print("Unable to get the current file") + return + } + basePath := path.Join(path.Dir(file), "../../") + + versionFile, err := app.DistFS.Open("dist/version.json") + if err != nil { + if errors.Is(err, fs.ErrNotExist) { + log.Print("\"dist/version.json\" not found, load from src instead") + versionFile, err = os.Open(path.Join(basePath, "app/src/version.json")) + } + + if err != nil { + log.Fatal(err) + return + } + } + + defer func(versionFile fs.File) { + err := versionFile.Close() + if err != nil { + log.Fatal(err) + } + }(versionFile) + + // Read the version.json file + data, err := io.ReadAll(versionFile) + if err != nil { + log.Fatalf("Failed to read version.json: %v", err) + } + + // Parse the JSON data + var versionInfo VersionInfo + err = json.Unmarshal(data, &versionInfo) + if err != nil { + log.Fatalf("Failed to parse JSON: %v", err) + } + + // Generate the version.gen.go file content + genContent := fmt.Sprintf(`// Code generated by cmd/version/generate.go; DO NOT EDIT. + +package version + +func init() { + Version = "%s" + BuildId = %d + TotalBuild = %d +} +`, versionInfo.Version, versionInfo.BuildId, versionInfo.TotalBuild) + + genPath := path.Join(basePath, "internal/version/version.gen.go") + err = os.WriteFile(genPath, []byte(genContent), 0644) + if err != nil { + log.Fatalf("Failed to write version.gen.go: %v", err) + } + + fmt.Println("version.gen.go has been generated successfully.") +} diff --git a/internal/cmd/main.go b/internal/cmd/main.go index 14f601dd..68476e13 100644 --- a/internal/cmd/main.go +++ b/internal/cmd/main.go @@ -2,9 +2,11 @@ package cmd import ( "context" + "fmt" "log" "os" + "github.com/0xJacky/Nginx-UI/internal/version" "github.com/urfave/cli/v3" ) @@ -32,6 +34,11 @@ func NewAppCmd() *cli.Command { }, }, DefaultCommand: "serve", + Version: version.Version, + } + + cli.VersionPrinter = func(cmd *cli.Command) { + fmt.Printf("%s (%d)\n", cmd.Root().Version, version.BuildId) } if err := cmd.Run(context.Background(), os.Args); err != nil { diff --git a/internal/version/version.go b/internal/version/version.go new file mode 100644 index 00000000..29f5d30b --- /dev/null +++ b/internal/version/version.go @@ -0,0 +1,7 @@ +package version + +var ( + Version = "" + BuildId = 0 + TotalBuild = 0 +) diff --git a/main.go b/main.go index 5daa7806..db97a73e 100644 --- a/main.go +++ b/main.go @@ -20,6 +20,8 @@ import ( cSettings "github.com/uozi-tech/cosy/settings" ) +//go:generate go run cmd/version/generate.go + func Program(confPath string) func(state overseer.State) { return func(state overseer.State) { defer logger.Sync()