[UPGRADE] run sanity checks before the database is upgraded

(cherry picked from commit 69741e4e66)
(cherry picked from commit 2a3c7b09cb)
(cherry picked from commit a1554c1168)
(cherry picked from commit edae2c6d2d)
This commit is contained in:
Earl Warren 2023-08-09 00:05:06 +02:00
parent 4974cbf10a
commit 49737cf009
No known key found for this signature in database
GPG key ID: 0579CB2928A78A00
4 changed files with 82 additions and 0 deletions

View file

@ -28,6 +28,7 @@ import (
"code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
forgejo_services "code.gitea.io/gitea/services/forgejo"
"xorm.io/xorm"
"xorm.io/xorm/names"
@ -585,6 +586,7 @@ func Migrate(x *xorm.Engine) error {
return fmt.Errorf("sync: %w", err)
}
var previousVersion int64
currentVersion := &Version{ID: 1}
has, err := x.Get(currentVersion)
if err != nil {
@ -598,6 +600,8 @@ func Migrate(x *xorm.Engine) error {
if _, err = x.InsertOne(currentVersion); err != nil {
return fmt.Errorf("insert: %w", err)
}
} else {
previousVersion = currentVersion.Version
}
v := currentVersion.Version
@ -625,6 +629,10 @@ Please try upgrading to a lower version first (suggested v1.6.4), then upgrade t
}
}
if err := forgejo_services.PreMigrationSanityChecks(x, previousVersion, setting.CfgProvider); err != nil {
return err
}
// Migrate
for i, m := range migrations[v-minDBVersion:] {
log.Info("Migration[%d]: %s", v+int64(i), m.Description())

View file

@ -0,0 +1,18 @@
// SPDX-License-Identifier: MIT
package forgejo
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("..", ".."),
})
}

View file

@ -0,0 +1,25 @@
// SPDX-License-Identifier: MIT
package forgejo
import (
"code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/setting"
)
var (
ForgejoV5DatabaseVersion = int64(260)
ForgejoV4DatabaseVersion = int64(244)
)
var logFatal = log.Fatal
func fatal(err error) error {
logFatal("%v", err)
return err
}
func PreMigrationSanityChecks(e db.Engine, dbVersion int64, cfg setting.ConfigProvider) error {
return nil
}

View file

@ -0,0 +1,31 @@
// SPDX-License-Identifier: MIT
package forgejo
import (
"os"
"path/filepath"
"testing"
"code.gitea.io/gitea/models/db"
"code.gitea.io/gitea/models/unittest"
"code.gitea.io/gitea/modules/setting"
"github.com/stretchr/testify/assert"
)
func TestForgejo_PreMigrationSanityChecks(t *testing.T) {
assert.NoError(t, unittest.PrepareTestDatabase())
ctx := db.DefaultContext
e := db.GetEngine(ctx)
assert.NoError(t, PreMigrationSanityChecks(e, ForgejoV4DatabaseVersion, configFixture(t, "")))
}
func configFixture(t *testing.T, content string) setting.ConfigProvider {
config := filepath.Join(t.TempDir(), "app.ini")
assert.NoError(t, os.WriteFile(config, []byte(content), 0o777))
cfg, err := setting.NewConfigProviderFromFile(config)
assert.NoError(t, err)
return cfg
}