From a04718a2a6c2cfd46be17572b8220ee14b1bd1ac Mon Sep 17 00:00:00 2001
From: Morlinest <Morlinest@users.noreply.github.com>
Date: Mon, 2 Oct 2017 22:22:25 +0200
Subject: [PATCH] Remove repo unit index (#2621)

* Remove repo unit index

* Fix sqlite
---
 models/fixtures/repo_unit.yml   | 10 ----------
 models/migrations/migrations.go |  2 ++
 models/migrations/v45.go        | 28 ++++++++++++++++++++++++++++
 models/repo.go                  |  4 +---
 models/repo_unit.go             |  5 ++---
 routers/repo/setting.go         |  6 ------
 6 files changed, 33 insertions(+), 22 deletions(-)
 create mode 100644 models/migrations/v45.go

diff --git a/models/fixtures/repo_unit.yml b/models/fixtures/repo_unit.yml
index ef06107928..e9931453ad 100644
--- a/models/fixtures/repo_unit.yml
+++ b/models/fixtures/repo_unit.yml
@@ -2,7 +2,6 @@
   id: 1
   repo_id: 1
   type: 4
-  index: 3
   config: "{}"
   created_unix: 946684810
 
@@ -10,7 +9,6 @@
   id: 2
   repo_id: 1
   type: 5
-  index: 4
   config: "{}"
   created_unix: 946684810
 
@@ -18,7 +16,6 @@
   id: 3
   repo_id: 1
   type: 1
-  index: 0
   config: "{}"
   created_unix: 946684810
 
@@ -26,7 +23,6 @@
   id: 4
   repo_id: 1
   type: 2
-  index: 1
   config: "{\"EnableTimetracker\":true,\"AllowOnlyContributorsToTrackTime\":true}"
   created_unix: 946684810
 
@@ -34,7 +30,6 @@
   id: 5
   repo_id: 1
   type: 3
-  index: 2
   config: "{}"
   created_unix: 946684810
 
@@ -42,7 +37,6 @@
   id: 6
   repo_id: 3
   type: 1
-  index: 0
   config: "{}"
   created_unix: 946684810
 
@@ -50,7 +44,6 @@
   id: 7
   repo_id: 3
   type: 2
-  index: 1
   config: "{\"EnableTimetracker\":false,\"AllowOnlyContributorsToTrackTime\":false}"
   created_unix: 946684810
 
@@ -58,7 +51,6 @@
   id: 8
   repo_id: 3
   type: 3
-  index: 2
   config: "{}"
   created_unix: 946684810
 
@@ -66,7 +58,6 @@
   id: 9
   repo_id: 3
   type: 4
-  index: 3
   config: "{}"
   created_unix: 946684810
 
@@ -74,6 +65,5 @@
   id: 10
   repo_id: 3
   type: 5
-  index: 4
   config: "{}"
   created_unix: 946684810
diff --git a/models/migrations/migrations.go b/models/migrations/migrations.go
index c2cd7568af..99fedf9d19 100644
--- a/models/migrations/migrations.go
+++ b/models/migrations/migrations.go
@@ -138,6 +138,8 @@ var migrations = []Migration{
 	NewMigration("fix protected branch can push value to false", fixProtectedBranchCanPushValue),
 	// v44 -> v45
 	NewMigration("remove duplicate unit types", removeDuplicateUnitTypes),
+	// v45 -> v46
+	NewMigration("remove index column from repo_unit table", removeIndexColumnFromRepoUnitTable),
 }
 
 // Migrate database to current version
diff --git a/models/migrations/v45.go b/models/migrations/v45.go
new file mode 100644
index 0000000000..ea3c024325
--- /dev/null
+++ b/models/migrations/v45.go
@@ -0,0 +1,28 @@
+// Copyright 2017 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package migrations
+
+import (
+	"fmt"
+
+	"code.gitea.io/gitea/modules/log"
+	"code.gitea.io/gitea/modules/setting"
+	"github.com/go-xorm/xorm"
+)
+
+func removeIndexColumnFromRepoUnitTable(x *xorm.Engine) (err error) {
+	switch {
+	case setting.UseSQLite3:
+		log.Warn("Unable to drop columns in SQLite")
+	case setting.UseMySQL, setting.UsePostgreSQL, setting.UseMSSQL, setting.UseTiDB:
+		if _, err := x.Exec("ALTER TABLE repo_unit DROP COLUMN index"); err != nil {
+			return fmt.Errorf("DROP COLUMN index: %v", err)
+		}
+	default:
+		log.Fatal(4, "Unrecognized DB")
+	}
+
+	return nil
+}
diff --git a/models/repo.go b/models/repo.go
index 6b457863c8..e2714c74ca 100644
--- a/models/repo.go
+++ b/models/repo.go
@@ -1245,19 +1245,17 @@ func createRepository(e *xorm.Session, doer, u *User, repo *Repository) (err err
 
 	// insert units for repo
 	var units = make([]RepoUnit, 0, len(defaultRepoUnits))
-	for i, tp := range defaultRepoUnits {
+	for _, tp := range defaultRepoUnits {
 		if tp == UnitTypeIssues {
 			units = append(units, RepoUnit{
 				RepoID: repo.ID,
 				Type:   tp,
-				Index:  i,
 				Config: &IssuesConfig{EnableTimetracker: setting.Service.DefaultEnableTimetracking, AllowOnlyContributorsToTrackTime: setting.Service.DefaultAllowOnlyContributorsToTrackTime},
 			})
 		} else {
 			units = append(units, RepoUnit{
 				RepoID: repo.ID,
 				Type:   tp,
-				Index:  i,
 			})
 		}
 
diff --git a/models/repo_unit.go b/models/repo_unit.go
index cb647fd406..3f0e65f9ab 100644
--- a/models/repo_unit.go
+++ b/models/repo_unit.go
@@ -16,9 +16,8 @@ import (
 // RepoUnit describes all units of a repository
 type RepoUnit struct {
 	ID          int64
-	RepoID      int64    `xorm:"INDEX(s)"`
-	Type        UnitType `xorm:"INDEX(s)"`
-	Index       int
+	RepoID      int64           `xorm:"INDEX(s)"`
+	Type        UnitType        `xorm:"INDEX(s)"`
 	Config      core.Conversion `xorm:"TEXT"`
 	CreatedUnix int64           `xorm:"INDEX CREATED"`
 	Created     time.Time       `xorm:"-"`
diff --git a/routers/repo/setting.go b/routers/repo/setting.go
index eb4136b07d..ebe1c7cd9e 100644
--- a/routers/repo/setting.go
+++ b/routers/repo/setting.go
@@ -149,7 +149,6 @@ func SettingsPost(ctx *context.Context, form auth.RepoSettingForm) {
 			units = append(units, models.RepoUnit{
 				RepoID: repo.ID,
 				Type:   tp,
-				Index:  int(tp),
 				Config: new(models.UnitConfig),
 			})
 		}
@@ -165,7 +164,6 @@ func SettingsPost(ctx *context.Context, form auth.RepoSettingForm) {
 				units = append(units, models.RepoUnit{
 					RepoID: repo.ID,
 					Type:   models.UnitTypeExternalWiki,
-					Index:  int(models.UnitTypeExternalWiki),
 					Config: &models.ExternalWikiConfig{
 						ExternalWikiURL: form.ExternalWikiURL,
 					},
@@ -174,7 +172,6 @@ func SettingsPost(ctx *context.Context, form auth.RepoSettingForm) {
 				units = append(units, models.RepoUnit{
 					RepoID: repo.ID,
 					Type:   models.UnitTypeWiki,
-					Index:  int(models.UnitTypeWiki),
 					Config: new(models.UnitConfig),
 				})
 			}
@@ -190,7 +187,6 @@ func SettingsPost(ctx *context.Context, form auth.RepoSettingForm) {
 				units = append(units, models.RepoUnit{
 					RepoID: repo.ID,
 					Type:   models.UnitTypeExternalTracker,
-					Index:  int(models.UnitTypeExternalTracker),
 					Config: &models.ExternalTrackerConfig{
 						ExternalTrackerURL:    form.ExternalTrackerURL,
 						ExternalTrackerFormat: form.TrackerURLFormat,
@@ -201,7 +197,6 @@ func SettingsPost(ctx *context.Context, form auth.RepoSettingForm) {
 				units = append(units, models.RepoUnit{
 					RepoID: repo.ID,
 					Type:   models.UnitTypeIssues,
-					Index:  int(models.UnitTypeIssues),
 					Config: &models.IssuesConfig{
 						EnableTimetracker:                form.EnableTimetracker,
 						AllowOnlyContributorsToTrackTime: form.AllowOnlyContributorsToTrackTime,
@@ -214,7 +209,6 @@ func SettingsPost(ctx *context.Context, form auth.RepoSettingForm) {
 			units = append(units, models.RepoUnit{
 				RepoID: repo.ID,
 				Type:   models.UnitTypePullRequests,
-				Index:  int(models.UnitTypePullRequests),
 				Config: new(models.UnitConfig),
 			})
 		}