File size: 1,777 Bytes
619f93d | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | package bootstrap
import (
"fmt"
"strings"
"github.com/OpenListTeam/OpenList/v4/internal/bootstrap/patch"
"github.com/OpenListTeam/OpenList/v4/internal/conf"
"github.com/OpenListTeam/OpenList/v4/pkg/utils"
)
var LastLaunchedVersion = ""
func safeCall(v string, i int, f func()) {
defer func() {
if r := recover(); r != nil {
utils.Log.Errorf("Recovered from patch (version: %s, index: %d) panic: %v", v, i, r)
}
}()
f()
}
func getVersion(v string) (major, minor, patchNum int, err error) {
_, err = fmt.Sscanf(v, "v%d.%d.%d", &major, &minor, &patchNum)
return major, minor, patchNum, err
}
func compareVersion(majorA, minorA, patchNumA, majorB, minorB, patchNumB int) bool {
if majorA != majorB {
return majorA > majorB
}
if minorA != minorB {
return minorA > minorB
}
if patchNumA != patchNumB {
return patchNumA > patchNumB
}
return true
}
func InitUpgradePatch() {
if !strings.HasPrefix(conf.Version, "v") {
for _, vp := range patch.UpgradePatches {
for i, p := range vp.Patches {
safeCall(vp.Version, i, p)
}
}
return
}
if LastLaunchedVersion == conf.Version {
return
}
if LastLaunchedVersion == "" {
LastLaunchedVersion = "v0.0.0"
}
major, minor, patchNum, err := getVersion(LastLaunchedVersion)
if err != nil {
utils.Log.Warnf("Failed to parse last launched version %s: %v, skipping all patches and rewrite last launched version", LastLaunchedVersion, err)
return
}
for _, vp := range patch.UpgradePatches {
ma, mi, pn, err := getVersion(vp.Version)
if err != nil {
utils.Log.Errorf("Skip invalid version %s patches: %v", vp.Version, err)
continue
}
if compareVersion(ma, mi, pn, major, minor, patchNum) {
for i, p := range vp.Patches {
safeCall(vp.Version, i, p)
}
}
}
}
|