Pārlūkot izejas kodu

更新版本信息和日志

增加对Git标签及其对应提交哈希的支持,并修复了信号处理、配置文件输出逻辑以及版本号获取的错误。同时,重构了版本初始化逻辑以提高代码清晰度和可维护性。
SongZihuan 2 nedēļas atpakaļ
vecāks
revīzija
56c5e1c1f3

+ 2 - 1
.gitignore

@@ -24,4 +24,5 @@ build_date.txt
 
 commit_data.txt
 tag_data.txt
-tag_commit_data.txt
+tag_commit_data.txt
+random_data.txt

+ 10 - 4
CHANGELOG.md

@@ -5,7 +5,7 @@
 其格式基于 [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
 且本项目遵循 [语义化版本控制](https://semver.org/spec/v2.0.0.html)。
 
-## [0.1.1] - 2025-04-3
+## [0.2.0] - 2025-04-10
 
 ### 新增功能
 
@@ -13,8 +13,8 @@
 - 获取构建时`Git`信息(若有):当前`commit hash`、当前最新`tag`(若有)、以及`tag`(若有)对应的`commit hash`(若有)。
 - 清洗通过`go:embed`读取的文件:仅保留第一行(某些文件),删除`BOM`,删除`\r`。
 - 修改语义化版本号获取:
-  - 从`VERSION`文件获取(第一优先级,可以以v/V开头,必须满足语义化版本哈规定)。
-  - 从`git`获取最新的`tag`(第二优先级,可以以v/V开头,必须满足语义化版本哈规定)。
+  - 从`VERSION`文件获取(第一优先级,可以以`v/V`开头,必须满足语义化版本哈规定)。
+  - 从`git`获取最新的`tag`(第二优先级,可以以`v/V`开头,必须满足语义化版本哈规定)。
     - 当该`tag`对应的并非当前`commit`时,`tag`会加上`+dev`标签
     - 当该`tag`以`0.`开头时,`tag`会加上`+dev`标签
   - 采用版本号`0.0.0`
@@ -22,11 +22,17 @@
     - 若有`commit hash`,则最终版本号为`0.0.0+1744225466-be8f4ff51e6ed2e01171b38459406dc5dac306ea`,其中`1744225466`为编译时间戳,`be8f4ff51e6ed2e01171b38459406dc5dac306ea`为`commit hash`。
 - `Server.Example1`例子更完善,输出更多信息。
 
+### 修复
+
+- 修复无法读取`tag`对应`commit`值的漏洞。
+- 修复`Output Config File`逻辑判断错误
+- 修复设置`SigQuitExit`默认动作的错误
+
 ### 重构
 
 - 减少`import resource "github.com/SongZihuan/BackendServerTemplate"`的引用。
 
-## [0.1.0] - 2025-04-3
+## [0.1.0] - 2025-04-03
 
 ### 新增功能
 

+ 2 - 0
get_date_posix.go

@@ -8,4 +8,6 @@
 
 //go:generate /bin/bash ./get_git.sh
 
+//go:generate /bin/bash ./get_random.sh
+
 package resource

+ 2 - 0
get_date_win32.go

@@ -8,4 +8,6 @@
 
 //go:generate powershell -ExecutionPolicy RemoteSigned ./get_git.ps1
 
+//go:generate powershell -ExecutionPolicy RemoteSigned ./get_random.ps1
+
 package resource

+ 0 - 4
get_git.ps1

@@ -1,23 +1,19 @@
 if (Test-Path -Path ".\.git" -PathType Container) {
-    # 如果 .git 目录存在
     $last_commit = git rev-parse HEAD 2>$null
     $last_tag = git describe --tags --abbrev=0 2>$null
 
     if (-not [string]::IsNullOrEmpty($last_tag)) {
-        # 如果有标签
         $last_tag_commit = git rev-list -n 1 $last_tag 2>$null
 
         Set-Content -Path "commit_data.txt" -Value $last_commit -Encoding UTF8
         Set-Content -Path "tag_data.txt" -Value $last_tag -Encoding UTF8
         Set-Content -Path "tag_commit_data.txt" -Value $last_tag_commit -Encoding UTF8
     } else {
-        # 如果没有标签
         Set-Content -Path "commit_data.txt" -Value $last_commit -Encoding UTF8
         New-Item -Path "tag_data.txt" -ItemType File -Force
         New-Item -Path "tag_commit_data.txt" -ItemType File -Force
     }
 } else {
-    # 如果 .git 目录不存在
     New-Item -Path "commit_data.txt" -ItemType File -Force
     New-Item -Path "tag_data.txt" -ItemType File -Force
     New-Item -Path "tag_commit_data.txt" -ItemType File -Force

+ 6 - 0
get_random.ps1

@@ -0,0 +1,6 @@
+$characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
+$length = 40
+
+$randomString = -join (1..$length | ForEach-Object { $characters[(Get-Random -Maximum $characters.Length)] })
+
+Set-Content -Path "random_data.txt" -Value $randomString -Encoding UTF8

+ 3 - 0
get_random.sh

@@ -0,0 +1,3 @@
+length=40
+randomString=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w $length | head -n 1)
+echo "$randomString" > random_data.txt

+ 48 - 46
resource.go

@@ -3,7 +3,6 @@ package resource
 import (
 	_ "embed"
 	"fmt"
-	"github.com/SongZihuan/BackendServerTemplate/src/utils/reutils"
 	"strconv"
 	"strings"
 	"time"
@@ -37,6 +36,9 @@ var GitTag string
 //go:embed tag_commit_data.txt
 var GitTagCommitHash string
 
+//go:embed random_data.txt
+var randomData string
+
 func init() {
 	initCleanFile()
 	initName()
@@ -76,33 +78,56 @@ func initBuildDate() {
 }
 
 func initVersion() {
-	SemanticVersioning = strings.TrimPrefix(strings.ToLower(version), "v")
-	if SemanticVersioning == "" {
-		SemanticVersioning = strings.TrimPrefix(strings.ToLower(GitTag), "v")
-		if SemanticVersioning == "" {
-			if GitCommitHash != "" {
-				SemanticVersioning = fmt.Sprintf("0.0.0+dev-%d-%s", BuildTime.Unix(), GitCommitHash)
-			} else {
-				SemanticVersioning = fmt.Sprintf("0.0.0+dev-%d", BuildTime.Unix())
-			}
-			Version = "v" + SemanticVersioning
-		} else if reutils.IsSemanticVersion(SemanticVersioning) {
-			if GitCommitHash != "" && GitTagCommitHash != "" && GitCommitHash != GitTagCommitHash && !strings.Contains(SemanticVersioning, "dev") {
-				SemanticVersioning = SemanticVersioning + fmt.Sprintf("+dev-%s", GitTagCommitHash)
-			} else if strings.HasPrefix(SemanticVersioning, "0.") {
-				SemanticVersioning = SemanticVersioning + "-dev"
-			}
-			Version = "v" + SemanticVersioning
-		} else {
-			panic(fmt.Sprintf("%s is not a semantic versioning.", SemanticVersioning))
-		}
-	} else if reutils.IsSemanticVersion(SemanticVersioning) {
+	ver := getDefaultVersion()
+	if ver != "" {
+		SemanticVersioning = ver
+		Version = "v" + SemanticVersioning
+		return
+	}
+
+	ver = getGitTagVersion()
+	if ver != "" {
+		SemanticVersioning = ver
+		Version = "v" + SemanticVersioning
+		return
+	}
+
+	ver = getRandomVersion()
+	if ver != "" {
+		SemanticVersioning = ver
 		Version = "v" + SemanticVersioning
+		return
+	}
+
+	panic("Get Version Failed")
+}
+
+func getDefaultVersion() (defVer string) {
+	defVer = strings.TrimPrefix(strings.ToLower(version), "v")
+	if defVer == "" || !utilsIsSemanticVersion(defVer) {
+		return ""
+	}
+	return defVer
+}
+
+func getGitTagVersion() (gitVer string) {
+	gitVer = strings.TrimPrefix(strings.ToLower(GitTag), "v")
+	if GitCommitHash != "" && (GitTagCommitHash == "" || gitVer == "") {
+		return fmt.Sprintf("0.0.0+dev-%d-%s", BuildTime.Unix(), GitCommitHash)
+	} else if GitCommitHash != "" && GitTagCommitHash != "" && gitVer != "" && utilsIsSemanticVersion(gitVer) {
+		if (GitCommitHash != GitTagCommitHash || strings.HasPrefix(gitVer, "0.")) && !strings.Contains(gitVer, "dev") {
+			return gitVer + fmt.Sprintf("+dev-%d-%s", BuildTime.Unix(), GitCommitHash)
+		}
+		return gitVer
 	} else {
-		panic(fmt.Sprintf("%s is not a semantic versioning.", SemanticVersioning))
+		return ""
 	}
 }
 
+func getRandomVersion() (randVer string) {
+	return fmt.Sprintf("0.0.0+dev-%d-%s", BuildTime.Unix(), randomData)
+}
+
 func utilsClenFileData(data string) (res string) {
 	res = utilsCheckAndRemoveBOM(data)
 	res = strings.Replace(res, "\r", "", -1)
@@ -110,26 +135,3 @@ func utilsClenFileData(data string) (res string) {
 	res = strings.TrimSpace(res)
 	return res
 }
-
-func utilsClenFileDataMoreLine(data string) (res string) {
-	res = utilsCheckAndRemoveBOM(data)
-	res = strings.Replace(res, "\r", "", -1)
-	return res
-}
-
-func utilsCheckAndRemoveBOM(s string) string {
-	// UTF-8 BOM 的字节序列为 0xEF, 0xBB, 0xBF
-	bom := []byte{0xEF, 0xBB, 0xBF}
-
-	// 将字符串转换为字节切片
-	bytes := []byte(s)
-
-	// 检查前三个字节是否是 BOM
-	if len(bytes) >= 3 && bytes[0] == bom[0] && bytes[1] == bom[1] && bytes[2] == bom[2] {
-		// 如果存在 BOM,则删除它
-		return string(bytes[3:])
-	}
-
-	// 如果不存在 BOM,则返回原始字符串
-	return s
-}

+ 3 - 0
src/commandlineargs/define_data_type.go

@@ -110,6 +110,9 @@ func (d *CommandLineArgsDataType) setFlag() {
 	flag.StringVar(&d.ConfigFileData, d.ConfigFileName, d.ConfigFileData, d.ConfigFileUsage)
 	flag.StringVar(&d.ConfigFileData, d.ConfigFileName[0:1], d.ConfigFileData, d.ConfigFileUsage)
 
+	flag.StringVar(&d.ConfigOutputFileData, d.ConfigOutputFileName, d.ConfigOutputFileData, d.ConfigOutputFileUsage)
+	flag.StringVar(&d.ConfigOutputFileData, d.ConfigOutputFileName[0:1], d.ConfigOutputFileData, d.ConfigOutputFileUsage)
+
 	flag.Usage = func() {
 		_, _ = d.PrintUsage()
 	}

+ 1 - 1
src/commandlineargs/export_data.go

@@ -38,6 +38,6 @@ func (d *CommandLineArgsDataType) ConfigFile() string {
 	return getData(d, d.ConfigFileData)
 }
 
-func (d *CommandLineArgsDataType) OutPutConfig() string {
+func (d *CommandLineArgsDataType) OutputConfig() string {
 	return getData(d, d.ConfigOutputFileData)
 }

+ 1 - 1
src/commandlineargs/main.go

@@ -50,7 +50,7 @@ func ConfigFile() string {
 }
 
 func OutputConfigFile() string {
-	return CommandLineArgsData.ConfigFile()
+	return CommandLineArgsData.OutputConfig()
 }
 
 func SetOutput(writer io.Writer) {

+ 2 - 2
src/config/signal_config.go

@@ -23,9 +23,9 @@ func (d *SignalConfig) setDefault(c *configInfo) (err configerror.Error) {
 	d.SigHupExit.SetDefaultEnable()
 
 	if c.data.IsRelease() {
-		d.SigIntExit.SetDefaultDisable()
+		d.SigQuitExit.SetDefaultDisable()
 	} else {
-		d.SigIntExit.SetDefaultEnable()
+		d.SigQuitExit.SetDefaultEnable()
 	}
 
 	return nil

+ 5 - 1
src/server/example1/server.go

@@ -77,7 +77,11 @@ func (s *ServerExample1) Run() {
 
 MainCycle:
 	for {
-		fmt.Printf("Example1: I am running! BuildDate: '%s' Commit: '%s' Version: '%s' Now: '%s'\n", global.BuildTime.Format(time.DateTime), global.GitCommitHash, global.Version, time.Now().Format(time.DateTime))
+		//if global.GitTag == "" || global.GitTagCommitHash == "" {
+		//	fmt.Printf("Example1: I am running! BuildDate: '%s' Commit: '%s' Version: '%s' Now: '%s'\n", global.BuildTime.Format(time.DateTime), global.GitCommitHash, global.Version, time.Now().Format(time.DateTime))
+		//} else {
+		fmt.Printf("Example1: I am running! BuildDate: '%s' Commit: '%s' Tag: '%s' Tag Commit: '%s' Version: '%s' Now: '%s'\n", global.BuildTime.Format(time.DateTime), global.GitCommitHash, global.GitTag, global.GitTagCommitHash, global.Version, time.Now().Format(time.DateTime))
+		//}
 
 		select {
 		case <-s.ctx.Listen():

+ 42 - 0
utils.go

@@ -0,0 +1,42 @@
+// Copyright 2025 BackendServerTemplate Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package resource
+
+import (
+	"regexp"
+	"strings"
+)
+
+const semVerRegexStr = `^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(-(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(\.(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\+[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*)?$`
+
+var semVerRegex = regexp.MustCompile(semVerRegexStr)
+
+// IsSemanticVersion checks if the given string is a valid semantic version.
+func utilsIsSemanticVersion(version string) bool {
+	return semVerRegex.MatchString(version)
+}
+
+func utilsClenFileDataMoreLine(data string) (res string) {
+	res = utilsCheckAndRemoveBOM(data)
+	res = strings.Replace(res, "\r", "", -1)
+	return res
+}
+
+func utilsCheckAndRemoveBOM(s string) string {
+	// UTF-8 BOM 的字节序列为 0xEF, 0xBB, 0xBF
+	bom := []byte{0xEF, 0xBB, 0xBF}
+
+	// 将字符串转换为字节切片
+	bytes := []byte(s)
+
+	// 检查前三个字节是否是 BOM
+	if len(bytes) >= 3 && bytes[0] == bom[0] && bytes[1] == bom[1] && bytes[2] == bom[2] {
+		// 如果存在 BOM,则删除它
+		return string(bytes[3:])
+	}
+
+	// 如果不存在 BOM,则返回原始字符串
+	return s
+}