|
@@ -5,7 +5,6 @@
|
|
package migrations
|
|
package migrations
|
|
|
|
|
|
import (
|
|
import (
|
|
- "errors"
|
|
|
|
"fmt"
|
|
"fmt"
|
|
"strings"
|
|
"strings"
|
|
"time"
|
|
"time"
|
|
@@ -17,7 +16,7 @@ import (
|
|
"github.com/gogits/gogs/modules/setting"
|
|
"github.com/gogits/gogs/modules/setting"
|
|
)
|
|
)
|
|
|
|
|
|
-const _DB_VER = 1
|
|
|
|
|
|
+const _MIN_DB_VER = 0
|
|
|
|
|
|
type Migration interface {
|
|
type Migration interface {
|
|
Description() string
|
|
Description() string
|
|
@@ -48,9 +47,10 @@ type Version struct {
|
|
}
|
|
}
|
|
|
|
|
|
// This is a sequence of migrations. Add new migrations to the bottom of the list.
|
|
// This is a sequence of migrations. Add new migrations to the bottom of the list.
|
|
-// If you want to "retire" a migration, replace it with "expiredMigration"
|
|
|
|
|
|
+// If you want to "retire" a migration, remove it from the top of the list and
|
|
|
|
+// update _MIN_VER_DB accordingly
|
|
var migrations = []Migration{
|
|
var migrations = []Migration{
|
|
- NewMigration("generate collaboration from access", accessToCollaboration),
|
|
|
|
|
|
+ NewMigration("generate collaboration from access", accessToCollaboration), // V0 -> V1
|
|
}
|
|
}
|
|
|
|
|
|
// Migrate database to current version
|
|
// Migrate database to current version
|
|
@@ -64,6 +64,8 @@ func Migrate(x *xorm.Engine) error {
|
|
if err != nil {
|
|
if err != nil {
|
|
return fmt.Errorf("get: %v", err)
|
|
return fmt.Errorf("get: %v", err)
|
|
} else if !has {
|
|
} else if !has {
|
|
|
|
+ // If the user table does not exist it is a fresh installation and we
|
|
|
|
+ // can skip all migrations
|
|
needsMigration, err := x.IsTableExist("user")
|
|
needsMigration, err := x.IsTableExist("user")
|
|
if err != nil {
|
|
if err != nil {
|
|
return err
|
|
return err
|
|
@@ -73,10 +75,12 @@ func Migrate(x *xorm.Engine) error {
|
|
if err != nil {
|
|
if err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
|
|
+ // If the user table is empty it is a fresh installation and we can
|
|
|
|
+ // skip all migrations
|
|
needsMigration = !isEmpty
|
|
needsMigration = !isEmpty
|
|
}
|
|
}
|
|
if !needsMigration {
|
|
if !needsMigration {
|
|
- currentVersion.Version = int64(len(migrations))
|
|
|
|
|
|
+ currentVersion.Version = int64(_MIN_DB_VER + len(migrations))
|
|
}
|
|
}
|
|
|
|
|
|
if _, err = x.InsertOne(currentVersion); err != nil {
|
|
if _, err = x.InsertOne(currentVersion); err != nil {
|
|
@@ -85,7 +89,7 @@ func Migrate(x *xorm.Engine) error {
|
|
}
|
|
}
|
|
|
|
|
|
v := currentVersion.Version
|
|
v := currentVersion.Version
|
|
- for i, m := range migrations[v:] {
|
|
|
|
|
|
+ for i, m := range migrations[v-_MIN_DB_VER:] {
|
|
log.Info("Migration: %s", m.Description())
|
|
log.Info("Migration: %s", m.Description())
|
|
if err = m.Migrate(x); err != nil {
|
|
if err = m.Migrate(x); err != nil {
|
|
return fmt.Errorf("do migrate: %v", err)
|
|
return fmt.Errorf("do migrate: %v", err)
|
|
@@ -98,10 +102,6 @@ func Migrate(x *xorm.Engine) error {
|
|
return nil
|
|
return nil
|
|
}
|
|
}
|
|
|
|
|
|
-func expiredMigration(x *xorm.Engine) error {
|
|
|
|
- return errors.New("You are migrating from a too old gogs version")
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
func accessToCollaboration(x *xorm.Engine) error {
|
|
func accessToCollaboration(x *xorm.Engine) error {
|
|
type Collaboration struct {
|
|
type Collaboration struct {
|
|
ID int64 `xorm:"pk autoincr"`
|
|
ID int64 `xorm:"pk autoincr"`
|
|
@@ -118,7 +118,12 @@ func accessToCollaboration(x *xorm.Engine) error {
|
|
}
|
|
}
|
|
|
|
|
|
sess := x.NewSession()
|
|
sess := x.NewSession()
|
|
- defer sess.Close()
|
|
|
|
|
|
+ defer func() {
|
|
|
|
+ if sess.IsCommitedOrRollbacked {
|
|
|
|
+ sess.Rollback()
|
|
|
|
+ }
|
|
|
|
+ sess.Close()
|
|
|
|
+ }()
|
|
if err = sess.Begin(); err != nil {
|
|
if err = sess.Begin(); err != nil {
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
@@ -151,7 +156,6 @@ func accessToCollaboration(x *xorm.Engine) error {
|
|
|
|
|
|
results, err := sess.Query("SELECT u.id as `uid`, ou.uid as `memberid` FROM `user` u LEFT JOIN org_user ou ON ou.org_id=u.id WHERE u.lower_name=?", ownerName)
|
|
results, err := sess.Query("SELECT u.id as `uid`, ou.uid as `memberid` FROM `user` u LEFT JOIN org_user ou ON ou.org_id=u.id WHERE u.lower_name=?", ownerName)
|
|
if err != nil {
|
|
if err != nil {
|
|
- sess.Rollback()
|
|
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
if len(results) < 1 {
|
|
if len(results) < 1 {
|
|
@@ -189,7 +193,6 @@ func accessToCollaboration(x *xorm.Engine) error {
|
|
}
|
|
}
|
|
has, err := sess.Get(collaboration)
|
|
has, err := sess.Get(collaboration)
|
|
if err != nil {
|
|
if err != nil {
|
|
- sess.Rollback()
|
|
|
|
return err
|
|
return err
|
|
} else if has {
|
|
} else if has {
|
|
continue
|
|
continue
|
|
@@ -197,7 +200,6 @@ func accessToCollaboration(x *xorm.Engine) error {
|
|
|
|
|
|
collaboration.Created = created
|
|
collaboration.Created = created
|
|
if _, err = sess.InsertOne(collaboration); err != nil {
|
|
if _, err = sess.InsertOne(collaboration); err != nil {
|
|
- sess.Rollback()
|
|
|
|
return err
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
}
|