mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-12-19 07:43:09 +00:00
[SEMVER] store SemVer in ForgejoSemVer after a database upgrade
(cherry picked from commitb7fe7cf401
) (cherry picked from commitcf339eed4f
) (cherry picked from commit4f3a16168b
) (cherry picked from commit6f5bbc53fc
) (cherry picked from commitaca42b422e
) (cherry picked from commit5a7f7580e5
) (cherry picked from commit06c383c807
) (cherry picked from commitfe831dcb53
) (cherry picked from commitcd12cd0dbc
) (cherry picked from commitcc79163703
) (cherry picked from commit0102a5715e
) (cherry picked from commit403f7520b3
) (cherry picked from commita3b61510a2
)
This commit is contained in:
parent
00c6940851
commit
f83f0f9feb
9 changed files with 158 additions and 2 deletions
2
Makefile
2
Makefile
|
@ -95,7 +95,7 @@ VERSION = ${GITEA_VERSION}
|
||||||
# SemVer
|
# SemVer
|
||||||
FORGEJO_VERSION := 6.0.0+0-gitea-1.21.0
|
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
|
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
|
MakeVersion = "" // "make" program version if built with make
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var ForgejoVersion = "1.0.0"
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
setting.AppVer = Version
|
setting.AppVer = Version
|
||||||
|
setting.ForgejoVersion = ForgejoVersion
|
||||||
setting.AppBuiltWith = formatBuiltWith()
|
setting.AppBuiltWith = formatBuiltWith()
|
||||||
setting.AppStartTime = time.Now().UTC()
|
setting.AppStartTime = time.Now().UTC()
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,6 +47,7 @@ type Engine interface {
|
||||||
Incr(column string, arg ...any) *xorm.Session
|
Incr(column string, arg ...any) *xorm.Session
|
||||||
Insert(...any) (int64, error)
|
Insert(...any) (int64, error)
|
||||||
Iterate(any, xorm.IterFunc) error
|
Iterate(any, xorm.IterFunc) error
|
||||||
|
IsTableExist(any) (bool, error)
|
||||||
Join(joinOperator string, tablename, condition any, args ...any) *xorm.Session
|
Join(joinOperator string, tablename, condition any, args ...any) *xorm.Session
|
||||||
SQL(any, ...any) *xorm.Session
|
SQL(any, ...any) *xorm.Session
|
||||||
Where(any, ...any) *xorm.Session
|
Where(any, ...any) *xorm.Session
|
||||||
|
|
|
@ -68,6 +68,7 @@ func TestPrimaryKeys(t *testing.T) {
|
||||||
|
|
||||||
whitelist := map[string]string{
|
whitelist := map[string]string{
|
||||||
"the_table_name_to_skip_checking": "Write a note here to explain why",
|
"the_table_name_to_skip_checking": "Write a note here to explain why",
|
||||||
|
"forgejo_sem_ver": "seriously dude",
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, bean := range beans {
|
for _, bean := range beans {
|
||||||
|
|
20
models/forgejo/semver/main_test.go
Normal file
20
models/forgejo/semver/main_test.go
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
// SPDX-License-Identifier: MIT
|
||||||
|
|
||||||
|
package semver
|
||||||
|
|
||||||
|
import (
|
||||||
|
"path/filepath"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"code.gitea.io/gitea/models/unittest"
|
||||||
|
|
||||||
|
_ "code.gitea.io/gitea/models"
|
||||||
|
_ "code.gitea.io/gitea/models/actions"
|
||||||
|
_ "code.gitea.io/gitea/models/activities"
|
||||||
|
)
|
||||||
|
|
||||||
|
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"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
|
"code.gitea.io/gitea/models/forgejo/semver"
|
||||||
forgejo_v1_20 "code.gitea.io/gitea/models/forgejo_migrations/v1_20"
|
forgejo_v1_20 "code.gitea.io/gitea/models/forgejo_migrations/v1_20"
|
||||||
"code.gitea.io/gitea/modules/git"
|
"code.gitea.io/gitea/modules/git"
|
||||||
"code.gitea.io/gitea/modules/log"
|
"code.gitea.io/gitea/modules/log"
|
||||||
|
@ -141,5 +142,10 @@ func Migrate(x *xorm.Engine) error {
|
||||||
return err
|
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"
|
"code.gitea.io/gitea/modules/user"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var ForgejoVersion = "1.0.0"
|
||||||
|
|
||||||
// settings
|
// settings
|
||||||
var (
|
var (
|
||||||
// AppVer is the version of the current build of Gitea. It is set in main.go from main.Version.
|
// AppVer is the version of the current build of Gitea. It is set in main.go from main.Version.
|
||||||
|
|
Loading…
Reference in a new issue