From c21a399646e3001841b095c2faa96b17f2483048 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E8=83=A1=E7=8E=AE=E6=96=87?= <huww98@outlook.com>
Date: Tue, 22 Dec 2020 07:03:18 +0800
Subject: [PATCH] more test case for STORAGE_TYPE overrides (and fixes)
 (#14096)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: 胡玮文 <huww98@outlook.com>
---
 modules/setting/storage.go      | 32 ++++++++++++++++++++++++--------
 modules/setting/storage_test.go | 33 +++++++++++++++++++++++++++++++++
 2 files changed, 57 insertions(+), 8 deletions(-)

diff --git a/modules/setting/storage.go b/modules/setting/storage.go
index 43890371fa..3ab08d8d2a 100644
--- a/modules/setting/storage.go
+++ b/modules/setting/storage.go
@@ -43,20 +43,36 @@ func getStorage(name, typ string, targetSec *ini.Section) Storage {
 	sec.Key("MINIO_LOCATION").MustString("us-east-1")
 	sec.Key("MINIO_USE_SSL").MustBool(false)
 
-	nameSec := Cfg.Section(sectionName + "." + name)
-	typeSec := Cfg.Section(sectionName + "." + typ)
-	for _, override := range []*ini.Section{nameSec, typeSec, sec} {
+	var storage Storage
+	storage.Section = targetSec
+	storage.Type = typ
+
+	overrides := make([]*ini.Section, 0, 3)
+	nameSec, err := Cfg.GetSection(sectionName + "." + name)
+	if err == nil {
+		overrides = append(overrides, nameSec)
+	}
+
+	typeSec, err := Cfg.GetSection(sectionName + "." + typ)
+	if err == nil {
+		overrides = append(overrides, typeSec)
+		nextType := typeSec.Key("STORAGE_TYPE").String()
+		if len(nextType) > 0 {
+			storage.Type = nextType // Support custom STORAGE_TYPE
+		}
+	}
+	overrides = append(overrides, sec)
+
+	for _, override := range overrides {
 		for _, key := range override.Keys() {
 			if !targetSec.HasKey(key.Name()) {
 				_, _ = targetSec.NewKey(key.Name(), key.Value())
 			}
 		}
+		if len(storage.Type) == 0 {
+			storage.Type = override.Key("STORAGE_TYPE").String()
+		}
 	}
-
-	var storage Storage
-	storage.Section = targetSec
-
-	storage.Type = typeSec.Key("STORAGE_TYPE").MustString(typ)
 	storage.ServeDirect = storage.Section.Key("SERVE_DIRECT").MustBool(false)
 
 	// Specific defaults
diff --git a/modules/setting/storage_test.go b/modules/setting/storage_test.go
index 00c255a9c9..ffd8b7aa01 100644
--- a/modules/setting/storage_test.go
+++ b/modules/setting/storage_test.go
@@ -77,10 +77,14 @@ MINIO_BUCKET = gitea
 func Test_getStorageSpecificOverridesStorage(t *testing.T) {
 	iniStr := `
 [attachment]
+STORAGE_TYPE = minio
 MINIO_BUCKET = gitea-attachment
 
 [storage.attachments]
 MINIO_BUCKET = gitea
+
+[storage]
+STORAGE_TYPE = local
 `
 	Cfg, _ = ini.Load([]byte(iniStr))
 
@@ -88,6 +92,7 @@ MINIO_BUCKET = gitea
 	storageType := sec.Key("STORAGE_TYPE").MustString("")
 	storage := getStorage("attachments", storageType, sec)
 
+	assert.EqualValues(t, "minio", storage.Type)
 	assert.EqualValues(t, "gitea-attachment", storage.Section.Key("MINIO_BUCKET").String())
 }
 
@@ -162,3 +167,31 @@ MINIO_BUCKET = gitea-storage
 		assert.EqualValues(t, "gitea-storage", storage.Section.Key("MINIO_BUCKET").String())
 	}
 }
+
+func Test_getStorageInheritStorageType(t *testing.T) {
+	iniStr := `
+[storage]
+STORAGE_TYPE = minio
+`
+	Cfg, _ = ini.Load([]byte(iniStr))
+
+	sec := Cfg.Section("attachment")
+	storageType := sec.Key("STORAGE_TYPE").MustString("")
+	storage := getStorage("attachments", storageType, sec)
+
+	assert.EqualValues(t, "minio", storage.Type)
+}
+
+func Test_getStorageInheritNameSectionType(t *testing.T) {
+	iniStr := `
+[storage.attachments]
+STORAGE_TYPE = minio
+`
+	Cfg, _ = ini.Load([]byte(iniStr))
+
+	sec := Cfg.Section("attachment")
+	storageType := sec.Key("STORAGE_TYPE").MustString("")
+	storage := getStorage("attachments", storageType, sec)
+
+	assert.EqualValues(t, "minio", storage.Type)
+}