|
@@ -0,0 +1,140 @@
|
|
|
|
+// 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 main
|
|
|
|
+
|
|
|
|
+import (
|
|
|
|
+ "github.com/SongZihuan/BackendServerTemplate/tool/global"
|
|
|
|
+ "github.com/SongZihuan/BackendServerTemplate/tool/utils/fileutils"
|
|
|
|
+ "github.com/SongZihuan/BackendServerTemplate/tool/utils/gitutils"
|
|
|
|
+ "log"
|
|
|
|
+ "strings"
|
|
|
|
+ "sync"
|
|
|
|
+)
|
|
|
|
+
|
|
|
|
+const filePatchFile = "update.patch" + global.FileIgnoreExt
|
|
|
|
+
|
|
|
|
+var onceGitInfo sync.Once
|
|
|
|
+var toCommit string = ""
|
|
|
|
+var fromCommit string = ""
|
|
|
|
+
|
|
|
|
+var excludes = []string{
|
|
|
|
+ // 配置文件
|
|
|
|
+ "VERSION",
|
|
|
|
+ "REPORT",
|
|
|
|
+ "NAME",
|
|
|
|
+ "LICENSE",
|
|
|
|
+ "ENV_PREFIX",
|
|
|
|
+ // 服务配置文件
|
|
|
|
+ "SERVICE.yaml",
|
|
|
|
+ // 文档
|
|
|
|
+ "SECURITY.md",
|
|
|
|
+ "README.md",
|
|
|
|
+ "CONTRIBUTORS.md",
|
|
|
|
+ "CONTRIBUTING.md",
|
|
|
|
+ "CODE_OF_CONDUCT.md",
|
|
|
|
+ "CHANGELOG_SPECIFICATION.md",
|
|
|
|
+ "CHANGELOG.md",
|
|
|
|
+ "dev-git-hooks/",
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func InitGitData() (err error) {
|
|
|
|
+ onceGitInfo.Do(func() {
|
|
|
|
+ err = initGitData()
|
|
|
|
+ })
|
|
|
|
+ return err
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func initGitData() (err error) {
|
|
|
|
+ if !gitutils.HasGit() {
|
|
|
|
+ log.Println("generate patch: `.git` not found, get git info skip")
|
|
|
|
+ return nil
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ log.Println("generate patch: get git info")
|
|
|
|
+ defer log.Println("generate patch: get git info finish")
|
|
|
|
+
|
|
|
|
+ defer func() {
|
|
|
|
+ if err != nil {
|
|
|
|
+ toCommit = ""
|
|
|
|
+ fromCommit = ""
|
|
|
|
+ }
|
|
|
|
+ }()
|
|
|
|
+
|
|
|
|
+ tagList, err := gitutils.GetTagListWithFilter(func(s string) bool {
|
|
|
|
+ return strings.HasPrefix(s, "v")
|
|
|
|
+ })
|
|
|
|
+ if err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+ log.Printf("generate patch: get git tag list length: %d\n", len(tagList))
|
|
|
|
+
|
|
|
|
+ if len(tagList) == 0 {
|
|
|
|
+ toCommit, err = gitutils.GetLastCommit()
|
|
|
|
+ if err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+ log.Printf("generate patch: get git to commit: %s\n", toCommit)
|
|
|
|
+
|
|
|
|
+ fromCommit, err = gitutils.GetFirstCommit()
|
|
|
|
+ if err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+ log.Printf("generate patch: get git from commit: %s\n", fromCommit)
|
|
|
|
+ } else if len(tagList) == 1 {
|
|
|
|
+ toCommit, err = gitutils.GetTagCommit(tagList[0])
|
|
|
|
+ if err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+ log.Printf("generate patch: get git to commist (from tag '%s') : %s\n", tagList[0], toCommit)
|
|
|
|
+
|
|
|
|
+ fromCommit, err = gitutils.GetFirstCommit()
|
|
|
|
+ if err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+ log.Printf("generate patch: get git from commit: %s\n", fromCommit)
|
|
|
|
+ } else if len(tagList) >= 2 {
|
|
|
|
+ toCommit, err = gitutils.GetTagCommit(tagList[0])
|
|
|
|
+ if err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+ log.Printf("generate patch: get git to commist (from tag '%s') : %s\n", tagList[0], toCommit)
|
|
|
|
+
|
|
|
|
+ fromCommit, err = gitutils.GetTagCommit(tagList[1])
|
|
|
|
+ if err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+ log.Printf("generate patch: get git from commist (from tag '%s') : %s\n", tagList[1], toCommit)
|
|
|
|
+ } else {
|
|
|
|
+ panic("unreachable")
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return nil
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func CreatePatch() error {
|
|
|
|
+ err := InitGitData()
|
|
|
|
+ if err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if !gitutils.HasGit() {
|
|
|
|
+ return nil
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ log.Println("generate patch: create patch file")
|
|
|
|
+ defer log.Println("generate patch: create patch file")
|
|
|
|
+
|
|
|
|
+ if fromCommit == toCommit {
|
|
|
|
+ log.Println("generate patch: only one commit, skip to create patch file")
|
|
|
|
+ return fileutils.WriteEmpty(filePatchFile)
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ res, err := gitutils.GetPatch(fromCommit, toCommit, excludes...)
|
|
|
|
+ if err != nil {
|
|
|
|
+ return err
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return fileutils.WriteBytes(filePatchFile, res)
|
|
|
|
+}
|