Browse Source

Merge remote-tracking branch 'origin/dev' into dev

Vanessa 2 years ago
parent
commit
30a8a38420

+ 2 - 1
app/appearance/langs/en_US.json

@@ -1160,6 +1160,7 @@
     "201": "Failed to purge data repo: %s",
     "201": "Failed to purge data repo: %s",
     "202": "Cleaning data repo...",
     "202": "Cleaning data repo...",
     "203": "The data repo is purged, [%d] snapshots and [%d] data objects have been deleted, and a total of [%s] disk space has been released",
     "203": "The data repo is purged, [%d] snapshots and [%d] data objects have been deleted, and a total of [%s] disk space has been released",
-    "204": "The doc in the user guide does not support sharing to the community"
+    "204": "The doc in the user guide does not support sharing to the community",
+    "205": "The plugin is not supported in the current environment"
   }
   }
 }
 }

+ 2 - 1
app/appearance/langs/es_ES.json

@@ -1160,6 +1160,7 @@
     "201": "Error al purgar el repositorio de datos: %s",
     "201": "Error al purgar el repositorio de datos: %s",
     "202": "Limpiando repositorio de datos...",
     "202": "Limpiando repositorio de datos...",
     "203": "El repositorio de datos se purgó, [%d] instantáneas y [%d] objetos de datos se eliminaron y se liberó un total de [%s] espacio en disco",
     "203": "El repositorio de datos se purgó, [%d] instantáneas y [%d] objetos de datos se eliminaron y se liberó un total de [%s] espacio en disco",
-    "204": "La documentación en la guía del usuario no permite compartir con la comunidad"
+    "204": "La documentación en la guía del usuario no permite compartir con la comunidad",
+    "205": "El complemento no es compatible con el entorno actual"
   }
   }
 }
 }

+ 2 - 1
app/appearance/langs/fr_FR.json

@@ -1160,6 +1160,7 @@
     "201": "Échec de la purge du référentiel de données : %s",
     "201": "Échec de la purge du référentiel de données : %s",
     "202": "Nettoyage du référentiel de données...",
     "202": "Nettoyage du référentiel de données...",
     "203": "Le référentiel de données est purgé, [%d] instantanés et [%d] objets de données ont été supprimés, et un total de [%s] espace disque a été libéré",
     "203": "Le référentiel de données est purgé, [%d] instantanés et [%d] objets de données ont été supprimés, et un total de [%s] espace disque a été libéré",
-    "204": "La documentation du guide de l'utilisateur ne prend pas en charge le partage avec la communauté"
+    "204": "La documentation du guide de l'utilisateur ne prend pas en charge le partage avec la communauté",
+    "205": "Le plugin n'est pas pris en charge dans l'environnement actuel"
   }
   }
 }
 }

+ 2 - 1
app/appearance/langs/zh_CHT.json

@@ -1160,6 +1160,7 @@
     "201": "清理數據倉庫失敗:%s",
     "201": "清理數據倉庫失敗:%s",
     "202": "正在清理數據倉庫...",
     "202": "正在清理數據倉庫...",
     "203": "數據倉庫清理完畢,已刪除 [%d] 個快照和 [%d] 個數據對象,共釋放 [%s] 磁盤空間",
     "203": "數據倉庫清理完畢,已刪除 [%d] 個快照和 [%d] 個數據對象,共釋放 [%s] 磁盤空間",
-    "204": "用戶指南中的文檔不支持分享到社區"
+    "204": "用戶指南中的文檔不支持分享到社區",
+    "205": "該插件不支持在當前環境下使用"
   }
   }
 }
 }

+ 2 - 1
app/appearance/langs/zh_CN.json

@@ -1162,6 +1162,7 @@
     "201": "清理数据仓库失败:%s",
     "201": "清理数据仓库失败:%s",
     "202": "正在清理数据仓库...",
     "202": "正在清理数据仓库...",
     "203": "数据仓库清理完毕,已删除 [%d] 个快照和 [%d] 个数据对象,共释放 [%s] 磁盘空间",
     "203": "数据仓库清理完毕,已删除 [%d] 个快照和 [%d] 个数据对象,共释放 [%s] 磁盘空间",
-    "204": "用户指南中的文档不支持分享到社区"
+    "204": "用户指南中的文档不支持分享到社区",
+    "205": "该插件不支持在当前环境下使用"
   }
   }
 }
 }

+ 2 - 3
kernel/api/bazaar.go

@@ -110,16 +110,15 @@ func uninstallBazaarPlugin(c *gin.Context) {
 		return
 		return
 	}
 	}
 
 
+	frontend := arg["frontend"].(string)
 	packageName := arg["packageName"].(string)
 	packageName := arg["packageName"].(string)
-	err := model.UninstallBazaarPlugin(packageName)
+	err := model.UninstallBazaarPlugin(packageName, frontend)
 	if nil != err {
 	if nil != err {
 		ret.Code = -1
 		ret.Code = -1
 		ret.Msg = err.Error()
 		ret.Msg = err.Error()
 		return
 		return
 	}
 	}
 
 
-	frontend := arg["frontend"].(string)
-
 	ret.Data = map[string]interface{}{
 	ret.Data = map[string]interface{}{
 		"packages": model.BazaarPlugins(frontend),
 		"packages": model.BazaarPlugins(frontend),
 	}
 	}

+ 16 - 2
kernel/api/plugin.go

@@ -29,7 +29,14 @@ func loadPetals(c *gin.Context) {
 	ret := gulu.Ret.NewResult()
 	ret := gulu.Ret.NewResult()
 	defer c.JSON(http.StatusOK, ret)
 	defer c.JSON(http.StatusOK, ret)
 
 
-	petals := model.LoadPetals()
+	arg, ok := util.JsonArg(c, ret)
+	if !ok {
+		return
+	}
+
+	frontend := arg["frontend"].(string)
+
+	petals := model.LoadPetals(frontend)
 	ret.Data = petals
 	ret.Data = petals
 }
 }
 
 
@@ -45,5 +52,12 @@ func setPetalEnabled(c *gin.Context) {
 	packageName := arg["packageName"].(string)
 	packageName := arg["packageName"].(string)
 	enabled := arg["enabled"].(bool)
 	enabled := arg["enabled"].(bool)
 	frontend := arg["frontend"].(string)
 	frontend := arg["frontend"].(string)
-	ret.Data = model.SetPetalEnabled(packageName, enabled, frontend)
+	data, err := model.SetPetalEnabled(packageName, enabled, frontend)
+	if nil != err {
+		ret.Code = -1
+		ret.Msg = err.Error()
+		return
+	}
+
+	ret.Data = data
 }
 }

+ 37 - 2
kernel/bazaar/plugin.go

@@ -108,7 +108,39 @@ func Plugins(frontend string) (plugins []*Plugin) {
 	return
 	return
 }
 }
 
 
-func InstalledPlugins(frontend string) (ret []*Plugin) {
+func IsIncompatibleInstalledPlugin(name, frontend string) (found, incompatible bool) {
+	pluginsPath := filepath.Join(util.DataDir, "plugins")
+	if !util.IsPathRegularDirOrSymlinkDir(pluginsPath) {
+		return
+	}
+
+	pluginDirs, err := os.ReadDir(pluginsPath)
+	if nil != err {
+		logging.LogWarnf("read plugins folder failed: %s", err)
+		return
+	}
+
+	for _, pluginDir := range pluginDirs {
+		if !util.IsDirRegularOrSymlink(pluginDir) {
+			continue
+		}
+		dirName := pluginDir.Name()
+		if name != dirName {
+			continue
+		}
+
+		plugin, parseErr := PluginJSON(dirName)
+		if nil != parseErr || nil == plugin {
+			return
+		}
+
+		found = true
+		incompatible = isIncompatiblePlugin(plugin, frontend)
+	}
+	return
+}
+
+func InstalledPlugins(frontend string, checkUpdate bool) (ret []*Plugin) {
 	ret = []*Plugin{}
 	ret = []*Plugin{}
 
 
 	pluginsPath := filepath.Join(util.DataDir, "plugins")
 	pluginsPath := filepath.Join(util.DataDir, "plugins")
@@ -122,7 +154,10 @@ func InstalledPlugins(frontend string) (ret []*Plugin) {
 		return
 		return
 	}
 	}
 
 
-	bazaarPlugins := Plugins(frontend)
+	var bazaarPlugins []*Plugin
+	if checkUpdate {
+		bazaarPlugins = Plugins(frontend)
+	}
 
 
 	for _, pluginDir := range pluginDirs {
 	for _, pluginDir := range pluginDirs {
 		if !util.IsDirRegularOrSymlink(pluginDir) {
 		if !util.IsDirRegularOrSymlink(pluginDir) {

+ 2 - 2
kernel/model/bazzar.go

@@ -50,7 +50,7 @@ func BazaarPlugins(frontend string) (plugins []*bazaar.Plugin) {
 }
 }
 
 
 func InstalledPlugins(frontend string) (plugins []*bazaar.Plugin) {
 func InstalledPlugins(frontend string) (plugins []*bazaar.Plugin) {
-	plugins = bazaar.InstalledPlugins(frontend)
+	plugins = bazaar.InstalledPlugins(frontend, true)
 
 
 	petals := getPetals()
 	petals := getPetals()
 	for _, plugin := range plugins {
 	for _, plugin := range plugins {
@@ -71,7 +71,7 @@ func InstallBazaarPlugin(repoURL, repoHash, pluginName string) error {
 	return nil
 	return nil
 }
 }
 
 
-func UninstallBazaarPlugin(pluginName string) error {
+func UninstallBazaarPlugin(pluginName, frontend string) error {
 	installPath := filepath.Join(util.DataDir, "plugins", pluginName)
 	installPath := filepath.Join(util.DataDir, "plugins", pluginName)
 	err := bazaar.UninstallPlugin(installPath)
 	err := bazaar.UninstallPlugin(installPath)
 	if nil != err {
 	if nil != err {

+ 19 - 20
kernel/model/plugin.go

@@ -17,6 +17,7 @@
 package model
 package model
 
 
 import (
 import (
+	"fmt"
 	"os"
 	"os"
 	"path/filepath"
 	"path/filepath"
 	"sync"
 	"sync"
@@ -30,52 +31,50 @@ import (
 
 
 // Petal represents a plugin's management status.
 // Petal represents a plugin's management status.
 type Petal struct {
 type Petal struct {
-	Name    string `json:"name"`    // Plugin name
-	Enabled bool   `json:"enabled"` // Whether enabled
+	Name         string `json:"name"`         // Plugin name
+	Enabled      bool   `json:"enabled"`      // Whether enabled
+	Incompatible bool   `json:"incompatible"` // Whether incompatible
 
 
 	JS   string                 `json:"js"`   // JS code
 	JS   string                 `json:"js"`   // JS code
 	CSS  string                 `json:"css"`  // CSS code
 	CSS  string                 `json:"css"`  // CSS code
 	I18n map[string]interface{} `json:"i18n"` // i18n text
 	I18n map[string]interface{} `json:"i18n"` // i18n text
 }
 }
 
 
-func SetPetalEnabled(name string, enabled bool, frontend string) (ret *Petal) {
+func SetPetalEnabled(name string, enabled bool, frontend string) (ret *Petal, err error) {
 	petals := getPetals()
 	petals := getPetals()
 
 
-	plugins := bazaar.InstalledPlugins(frontend)
-	var plugin *bazaar.Plugin
-	for _, p := range plugins {
-		if p.Name == name {
-			plugin = p
-			break
-		}
-	}
-	if nil == plugin {
+	found, incompatible := bazaar.IsIncompatibleInstalledPlugin(name, frontend)
+	if !found {
 		logging.LogErrorf("plugin [%s] not found", name)
 		logging.LogErrorf("plugin [%s] not found", name)
 		return
 		return
 	}
 	}
 
 
-	ret = getPetalByName(plugin.Name, petals)
+	ret = getPetalByName(name, petals)
 	if nil == ret {
 	if nil == ret {
 		ret = &Petal{
 		ret = &Petal{
-			Name:    plugin.Name,
-			Enabled: enabled,
+			Name: name,
 		}
 		}
 		petals = append(petals, ret)
 		petals = append(petals, ret)
-	} else {
-		ret.Enabled = enabled
 	}
 	}
+	ret.Enabled = enabled
+	ret.Incompatible = incompatible
 
 
-	savePetals(petals)
+	if incompatible {
+		err = fmt.Errorf(Conf.Language(205))
+		return
+	}
 
 
+	savePetals(petals)
 	loadCode(ret)
 	loadCode(ret)
 	return
 	return
 }
 }
 
 
-func LoadPetals() (ret []*Petal) {
+func LoadPetals(frontend string) (ret []*Petal) {
 	ret = []*Petal{}
 	ret = []*Petal{}
 	petals := getPetals()
 	petals := getPetals()
 	for _, petal := range petals {
 	for _, petal := range petals {
-		if !petal.Enabled {
+		_, petal.Incompatible = bazaar.IsIncompatibleInstalledPlugin(petal.Name, frontend)
+		if !petal.Enabled || petal.Incompatible {
 			continue
 			continue
 		}
 		}