[SEMVER] store SemVer in ForgejoSemVer after a database upgrade
(cherry picked from commitb7fe7cf401) (cherry picked from commitcf339eed4f)
This commit is contained in:
		
							parent
							
								
									19da0dee9d
								
							
						
					
					
						commit
						4f3a16168b
					
				
					 9 changed files with 156 additions and 2 deletions
				
			
		
							
								
								
									
										2
									
								
								Makefile
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -91,7 +91,7 @@ VERSION = ${GITEA_VERSION}
 | 
			
		|||
# SemVer
 | 
			
		||||
FORGEJO_VERSION := 6.0.0+0-gitea-1.21.0
 | 
			
		||||
 | 
			
		||||
LDFLAGS := $(LDFLAGS) -X "main.MakeVersion=$(MAKE_VERSION)" -X "main.Version=$(GITEA_VERSION)" -X "main.Tags=$(TAGS)" -X "code.gitea.io/gitea/routers/api/forgejo/v1.ForgejoVersion=$(FORGEJO_VERSION)"
 | 
			
		||||
LDFLAGS := $(LDFLAGS) -X "main.MakeVersion=$(MAKE_VERSION)" -X "main.Version=$(GITEA_VERSION)" -X "main.Tags=$(TAGS)" -X "code.gitea.io/gitea/routers/api/forgejo/v1.ForgejoVersion=$(FORGEJO_VERSION)" -X "main.ForgejoVersion=$(FORGEJO_VERSION)"
 | 
			
		||||
 | 
			
		||||
LINUX_ARCHS ?= linux/amd64,linux/386,linux/arm-5,linux/arm-6,linux/arm64
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										3
									
								
								main.go
									
										
									
									
									
								
							
							
						
						
									
										3
									
								
								main.go
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -31,8 +31,11 @@ var (
 | 
			
		|||
	MakeVersion = ""            // "make" program version if built with make
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var ForgejoVersion = "1.0.0"
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	setting.AppVer = Version
 | 
			
		||||
	setting.ForgejoVersion = ForgejoVersion
 | 
			
		||||
	setting.AppBuiltWith = formatBuiltWith()
 | 
			
		||||
	setting.AppStartTime = time.Now().UTC()
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -47,6 +47,7 @@ type Engine interface {
 | 
			
		|||
	Incr(column string, arg ...any) *xorm.Session
 | 
			
		||||
	Insert(...any) (int64, error)
 | 
			
		||||
	Iterate(any, xorm.IterFunc) error
 | 
			
		||||
	IsTableExist(any) (bool, error)
 | 
			
		||||
	Join(joinOperator string, tablename, condition any, args ...any) *xorm.Session
 | 
			
		||||
	SQL(any, ...any) *xorm.Session
 | 
			
		||||
	Where(any, ...any) *xorm.Session
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -68,6 +68,7 @@ func TestPrimaryKeys(t *testing.T) {
 | 
			
		|||
 | 
			
		||||
	whitelist := map[string]string{
 | 
			
		||||
		"the_table_name_to_skip_checking": "Write a note here to explain why",
 | 
			
		||||
		"forgejo_sem_ver":                 "seriously dude",
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, bean := range beans {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										18
									
								
								models/forgejo/semver/main_test.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								models/forgejo/semver/main_test.go
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,18 @@
 | 
			
		|||
// SPDX-License-Identifier: MIT
 | 
			
		||||
 | 
			
		||||
package semver
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/models/unittest"
 | 
			
		||||
 | 
			
		||||
	_ "code.gitea.io/gitea/models"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestMain(m *testing.M) {
 | 
			
		||||
	unittest.MainTest(m, &unittest.TestOptions{
 | 
			
		||||
		GiteaRootPath: filepath.Join("..", "..", ".."),
 | 
			
		||||
	})
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										77
									
								
								models/forgejo/semver/semver.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								models/forgejo/semver/semver.go
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,77 @@
 | 
			
		|||
// SPDX-License-Identifier: MIT
 | 
			
		||||
 | 
			
		||||
package semver
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/models/db"
 | 
			
		||||
 | 
			
		||||
	"github.com/hashicorp/go-version"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func init() {
 | 
			
		||||
	db.RegisterModel(new(ForgejoSemVer))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type ForgejoSemVer struct {
 | 
			
		||||
	Version string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetVersion(ctx context.Context) (*version.Version, error) {
 | 
			
		||||
	return GetVersionWithEngine(db.GetEngine(ctx))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func GetVersionWithEngine(e db.Engine) (*version.Version, error) {
 | 
			
		||||
	versionString := "v1.0.0"
 | 
			
		||||
	exists, err := e.IsTableExist("forgejo_sem_ver")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	if exists {
 | 
			
		||||
		var semver ForgejoSemVer
 | 
			
		||||
		has, err := e.Get(&semver)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, err
 | 
			
		||||
		} else if has {
 | 
			
		||||
			versionString = semver.Version
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	v, err := version.NewVersion(versionString)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return v, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetVersionString(ctx context.Context, versionString string) error {
 | 
			
		||||
	return SetVersionStringWithEngine(db.GetEngine(ctx), versionString)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetVersionStringWithEngine(e db.Engine, versionString string) error {
 | 
			
		||||
	v, err := version.NewVersion(versionString)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	return SetVersionWithEngine(e, v)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetVersion(ctx context.Context, v *version.Version) error {
 | 
			
		||||
	return SetVersionWithEngine(db.GetEngine(ctx), v)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func SetVersionWithEngine(e db.Engine, v *version.Version) error {
 | 
			
		||||
	var semver ForgejoSemVer
 | 
			
		||||
	has, err := e.Get(&semver)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !has {
 | 
			
		||||
		_, err = e.Exec("insert into forgejo_sem_ver values (?)", v.String())
 | 
			
		||||
	} else {
 | 
			
		||||
		_, err = e.Exec("update forgejo_sem_ver set version = ?", v.String())
 | 
			
		||||
	}
 | 
			
		||||
	return err
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										46
									
								
								models/forgejo/semver/semver_test.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								models/forgejo/semver/semver_test.go
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,46 @@
 | 
			
		|||
// SPDX-License-Identifier: MIT
 | 
			
		||||
 | 
			
		||||
package semver
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"testing"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/models/db"
 | 
			
		||||
	"code.gitea.io/gitea/models/unittest"
 | 
			
		||||
 | 
			
		||||
	"github.com/hashicorp/go-version"
 | 
			
		||||
	"github.com/stretchr/testify/assert"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
func TestForgejoSemVerSetGet(t *testing.T) {
 | 
			
		||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
			
		||||
	ctx := db.DefaultContext
 | 
			
		||||
 | 
			
		||||
	newVersion, err := version.NewVersion("v1.2.3")
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	assert.NoError(t, SetVersionString(ctx, newVersion.String()))
 | 
			
		||||
	databaseVersion, err := GetVersion(ctx)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	assert.EqualValues(t, newVersion.String(), databaseVersion.String())
 | 
			
		||||
	assert.True(t, newVersion.Equal(databaseVersion))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func TestForgejoSemVerMissing(t *testing.T) {
 | 
			
		||||
	assert.NoError(t, unittest.PrepareTestDatabase())
 | 
			
		||||
	ctx := db.DefaultContext
 | 
			
		||||
	e := db.GetEngine(ctx)
 | 
			
		||||
 | 
			
		||||
	_, err := e.Exec("delete from forgejo_sem_ver")
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	v, err := GetVersion(ctx)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	assert.EqualValues(t, "1.0.0", v.String())
 | 
			
		||||
 | 
			
		||||
	_, err = e.Exec("drop table forgejo_sem_ver")
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
 | 
			
		||||
	v, err = GetVersion(ctx)
 | 
			
		||||
	assert.NoError(t, err)
 | 
			
		||||
	assert.EqualValues(t, "1.0.0", v.String())
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -8,6 +8,7 @@ import (
 | 
			
		|||
	"fmt"
 | 
			
		||||
	"os"
 | 
			
		||||
 | 
			
		||||
	"code.gitea.io/gitea/models/forgejo/semver"
 | 
			
		||||
	forgejo_v1_20 "code.gitea.io/gitea/models/forgejo_migrations/v1_20"
 | 
			
		||||
	"code.gitea.io/gitea/modules/git"
 | 
			
		||||
	"code.gitea.io/gitea/modules/log"
 | 
			
		||||
| 
						 | 
				
			
			@ -141,5 +142,10 @@ func Migrate(x *xorm.Engine) error {
 | 
			
		|||
			return err
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
 | 
			
		||||
	if err := x.Sync(new(semver.ForgejoSemVer)); err != nil {
 | 
			
		||||
		return fmt.Errorf("sync: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return semver.SetVersionStringWithEngine(x, setting.ForgejoVersion)
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -15,6 +15,8 @@ import (
 | 
			
		|||
	"code.gitea.io/gitea/modules/user"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
var ForgejoVersion = "1.0.0"
 | 
			
		||||
 | 
			
		||||
// settings
 | 
			
		||||
var (
 | 
			
		||||
	// AppVer is the version of the current build of Gitea. It is set in main.go from main.Version.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue