|  | @@ -5,7 +5,6 @@
 | 
	
		
			
				|  |  |  package migrations
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  import (
 | 
	
		
			
				|  |  | -	"errors"
 | 
	
		
			
				|  |  |  	"fmt"
 | 
	
		
			
				|  |  |  	"strings"
 | 
	
		
			
				|  |  |  	"time"
 | 
	
	
		
			
				|  | @@ -17,7 +16,7 @@ import (
 | 
	
		
			
				|  |  |  	"github.com/gogits/gogs/modules/setting"
 | 
	
		
			
				|  |  |  )
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -const _DB_VER = 1
 | 
	
		
			
				|  |  | +const _MIN_DB_VER = 0
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  type Migration interface {
 | 
	
		
			
				|  |  |  	Description() string
 | 
	
	
		
			
				|  | @@ -48,9 +47,10 @@ type Version struct {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // 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{
 | 
	
		
			
				|  |  | -	NewMigration("generate collaboration from access", accessToCollaboration),
 | 
	
		
			
				|  |  | +	NewMigration("generate collaboration from access", accessToCollaboration), // V0 -> V1
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // Migrate database to current version
 | 
	
	
		
			
				|  | @@ -64,6 +64,8 @@ func Migrate(x *xorm.Engine) error {
 | 
	
		
			
				|  |  |  	if err != nil {
 | 
	
		
			
				|  |  |  		return fmt.Errorf("get: %v", err)
 | 
	
		
			
				|  |  |  	} 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")
 | 
	
		
			
				|  |  |  		if err != nil {
 | 
	
		
			
				|  |  |  			return err
 | 
	
	
		
			
				|  | @@ -73,10 +75,12 @@ func Migrate(x *xorm.Engine) error {
 | 
	
		
			
				|  |  |  			if err != nil {
 | 
	
		
			
				|  |  |  				return err
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  | +			// If the user table is empty it is a fresh installation and we can
 | 
	
		
			
				|  |  | +			// skip all migrations
 | 
	
		
			
				|  |  |  			needsMigration = !isEmpty
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  		if !needsMigration {
 | 
	
		
			
				|  |  | -			currentVersion.Version = int64(len(migrations))
 | 
	
		
			
				|  |  | +			currentVersion.Version = int64(_MIN_DB_VER + len(migrations))
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		if _, err = x.InsertOne(currentVersion); err != nil {
 | 
	
	
		
			
				|  | @@ -85,7 +89,7 @@ func Migrate(x *xorm.Engine) error {
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	v := currentVersion.Version
 | 
	
		
			
				|  |  | -	for i, m := range migrations[v:] {
 | 
	
		
			
				|  |  | +	for i, m := range migrations[v-_MIN_DB_VER:] {
 | 
	
		
			
				|  |  |  		log.Info("Migration: %s", m.Description())
 | 
	
		
			
				|  |  |  		if err = m.Migrate(x); err != nil {
 | 
	
		
			
				|  |  |  			return fmt.Errorf("do migrate: %v", err)
 | 
	
	
		
			
				|  | @@ -98,10 +102,6 @@ func Migrate(x *xorm.Engine) error {
 | 
	
		
			
				|  |  |  	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 {
 | 
	
		
			
				|  |  |  	type Collaboration struct {
 | 
	
		
			
				|  |  |  		ID      int64 `xorm:"pk autoincr"`
 | 
	
	
		
			
				|  | @@ -118,7 +118,12 @@ func accessToCollaboration(x *xorm.Engine) error {
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	sess := x.NewSession()
 | 
	
		
			
				|  |  | -	defer sess.Close()
 | 
	
		
			
				|  |  | +	defer func() {
 | 
	
		
			
				|  |  | +		if sess.IsCommitedOrRollbacked {
 | 
	
		
			
				|  |  | +			sess.Rollback()
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		sess.Close()
 | 
	
		
			
				|  |  | +	}()
 | 
	
		
			
				|  |  |  	if err = sess.Begin(); err != nil {
 | 
	
		
			
				|  |  |  		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)
 | 
	
		
			
				|  |  |  		if err != nil {
 | 
	
		
			
				|  |  | -			sess.Rollback()
 | 
	
		
			
				|  |  |  			return err
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  		if len(results) < 1 {
 | 
	
	
		
			
				|  | @@ -189,7 +193,6 @@ func accessToCollaboration(x *xorm.Engine) error {
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  		has, err := sess.Get(collaboration)
 | 
	
		
			
				|  |  |  		if err != nil {
 | 
	
		
			
				|  |  | -			sess.Rollback()
 | 
	
		
			
				|  |  |  			return err
 | 
	
		
			
				|  |  |  		} else if has {
 | 
	
		
			
				|  |  |  			continue
 | 
	
	
		
			
				|  | @@ -197,7 +200,6 @@ func accessToCollaboration(x *xorm.Engine) error {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		collaboration.Created = created
 | 
	
		
			
				|  |  |  		if _, err = sess.InsertOne(collaboration); err != nil {
 | 
	
		
			
				|  |  | -			sess.Rollback()
 | 
	
		
			
				|  |  |  			return err
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  	}
 |