diff --git a/kernel/api/bazaar.go b/kernel/api/bazaar.go index 38bf7febe..b1f663add 100644 --- a/kernel/api/bazaar.go +++ b/kernel/api/bazaar.go @@ -46,8 +46,15 @@ func getBazaarPlugin(c *gin.Context) { ret := gulu.Ret.NewResult() defer c.JSON(http.StatusOK, ret) + arg, ok := util.JsonArg(c, ret) + if !ok { + return + } + + frontend := arg["frontend"].(string) + ret.Data = map[string]interface{}{ - "packages": model.BazaarPlugins(), + "packages": model.BazaarPlugins(frontend), } } @@ -55,8 +62,15 @@ func getInstalledPlugin(c *gin.Context) { ret := gulu.Ret.NewResult() defer c.JSON(http.StatusOK, ret) + arg, ok := util.JsonArg(c, ret) + if !ok { + return + } + + frontend := arg["frontend"].(string) + ret.Data = map[string]interface{}{ - "packages": model.InstalledPlugins(), + "packages": model.InstalledPlugins(frontend), } } @@ -79,9 +93,11 @@ func installBazaarPlugin(c *gin.Context) { return } + frontend := arg["frontend"].(string) + util.PushMsg(model.Conf.Language(69), 3000) ret.Data = map[string]interface{}{ - "packages": model.BazaarPlugins(), + "packages": model.BazaarPlugins(frontend), } } @@ -102,8 +118,10 @@ func uninstallBazaarPlugin(c *gin.Context) { return } + frontend := arg["frontend"].(string) + ret.Data = map[string]interface{}{ - "packages": model.BazaarPlugins(), + "packages": model.BazaarPlugins(frontend), } } diff --git a/kernel/api/plugin.go b/kernel/api/plugin.go index a44298502..3d59db613 100644 --- a/kernel/api/plugin.go +++ b/kernel/api/plugin.go @@ -44,5 +44,6 @@ func setPetalEnabled(c *gin.Context) { packageName := arg["packageName"].(string) enabled := arg["enabled"].(bool) - ret.Data = model.SetPetalEnabled(packageName, enabled) + frontend := arg["frontend"].(string) + ret.Data = model.SetPetalEnabled(packageName, enabled, frontend) } diff --git a/kernel/bazaar/icon.go b/kernel/bazaar/icon.go index d065598c4..029a5a283 100644 --- a/kernel/bazaar/icon.go +++ b/kernel/bazaar/icon.go @@ -63,7 +63,7 @@ func Icons() (icons []*Icon) { return } - if disallowDisplayBazaarPackage(icon.MinAppVersion) { + if disallowDisplayBazaarPackage(icon.Package) { return } diff --git a/kernel/bazaar/package.go b/kernel/bazaar/package.go index 0762cf676..d16ee3597 100644 --- a/kernel/bazaar/package.go +++ b/kernel/bazaar/package.go @@ -69,6 +69,8 @@ type Package struct { URL string `json:"url"` Version string `json:"version"` MinAppVersion string `json:"minAppVersion"` + Backends []string `json:"backends"` + Frontends []string `json:"frontends"` DisplayName *DisplayName `json:"displayName"` Description *Description `json:"description"` Readme *Readme `json:"readme"` @@ -99,6 +101,8 @@ type Package struct { HInstallDate string `json:"hInstallDate"` HUpdated string `json:"hUpdated"` Downloads int `json:"downloads"` + + Incompatible bool `json:"incompatible"` } type StagePackage struct { @@ -655,9 +659,17 @@ func getBazaarIndex() map[string]*bazaarPackage { // Add marketplace package config item `minAppVersion` https://github.com/siyuan-note/siyuan/issues/8330 const defaultMinAppVersion = "2.9.0" -func disallowDisplayBazaarPackage(minAppVersion string) bool { - if "" == minAppVersion { // 目前暂时放过所有不带 minAppVersion 的集市包,后续版本会使用 defaultMinAppVersion +func disallowDisplayBazaarPackage(pkg *Package) bool { + if "" == pkg.MinAppVersion { // 目前暂时放过所有不带 minAppVersion 的集市包,后续版本会使用 defaultMinAppVersion return false } - return 0 < semver.Compare("v"+minAppVersion, "v"+util.Ver) + if 0 < semver.Compare("v"+pkg.MinAppVersion, "v"+util.Ver) { + return true + } + + if 0 < len(pkg.Backends) { + + } + + return false } diff --git a/kernel/bazaar/plugin.go b/kernel/bazaar/plugin.go index c5b982647..082697cb5 100644 --- a/kernel/bazaar/plugin.go +++ b/kernel/bazaar/plugin.go @@ -20,6 +20,7 @@ import ( "errors" "os" "path/filepath" + "runtime" "sort" "strings" "sync" @@ -36,7 +37,7 @@ type Plugin struct { Enabled bool `json:"enabled"` } -func Plugins() (plugins []*Plugin) { +func Plugins(frontend string) (plugins []*Plugin) { plugins = []*Plugin{} stageIndex, err := getStageIndex("plugins") @@ -65,10 +66,12 @@ func Plugins() (plugins []*Plugin) { return } - if disallowDisplayBazaarPackage(plugin.MinAppVersion) { + if disallowDisplayBazaarPackage(plugin.Package) { return } + plugin.Incompatible = isIncompatiblePlugin(plugin, frontend) + plugin.URL = strings.TrimSuffix(plugin.URL, "/") repoURLHash := strings.Split(repoURL, "@") plugin.RepoURL = "https://github.com/" + repoURLHash[0] @@ -105,7 +108,7 @@ func Plugins() (plugins []*Plugin) { return } -func InstalledPlugins() (ret []*Plugin) { +func InstalledPlugins(frontend string) (ret []*Plugin) { ret = []*Plugin{} pluginsPath := filepath.Join(util.DataDir, "plugins") @@ -119,7 +122,7 @@ func InstalledPlugins() (ret []*Plugin) { return } - bazaarPlugins := Plugins() + bazaarPlugins := Plugins(frontend) for _, pluginDir := range pluginDirs { if !util.IsDirRegularOrSymlink(pluginDir) { @@ -133,7 +136,6 @@ func InstalledPlugins() (ret []*Plugin) { } installPath := filepath.Join(util.DataDir, "plugins", dirName) - plugin.Installed = true plugin.RepoURL = plugin.URL plugin.PreviewURL = "/plugins/" + dirName + "/preview.png" @@ -160,6 +162,7 @@ func InstalledPlugins() (ret []*Plugin) { plugin.PreferredReadme, _ = renderREADME(plugin.URL, readme) plugin.Outdated = isOutdatedPlugin(plugin, bazaarPlugins) + plugin.Incompatible = isIncompatiblePlugin(plugin, frontend) ret = append(ret, plugin) } return @@ -182,3 +185,39 @@ func UninstallPlugin(installPath string) error { //logging.Logger.Infof("uninstalled plugin [%s]", installPath) return nil } + +func isIncompatiblePlugin(plugin *Plugin, currentFrontend string) bool { + if 1 > len(plugin.Backends) { + return false + } + + backendOk := false + for _, backend := range plugin.Backends { + if backend == getCurrentBackend() || "all" == backend { + backendOk = true + break + } + } + + frontendOk := false + for _, frontend := range plugin.Frontends { + if frontend == currentFrontend || "all" == frontend { + frontendOk = true + break + } + } + return !backendOk || !frontendOk +} + +func getCurrentBackend() string { + switch util.Container { + case util.ContainerDocker: + return "docker" + case util.ContainerIOS: + return "ios" + case util.ContainerAndroid: + return "android" + default: + return runtime.GOOS + } +} diff --git a/kernel/bazaar/template.go b/kernel/bazaar/template.go index 211f0f602..5c858820e 100644 --- a/kernel/bazaar/template.go +++ b/kernel/bazaar/template.go @@ -64,7 +64,7 @@ func Templates() (templates []*Template) { return } - if disallowDisplayBazaarPackage(template.MinAppVersion) { + if disallowDisplayBazaarPackage(template.Package) { return } diff --git a/kernel/bazaar/theme.go b/kernel/bazaar/theme.go index 8ef724e88..a0dbd4c90 100644 --- a/kernel/bazaar/theme.go +++ b/kernel/bazaar/theme.go @@ -65,7 +65,7 @@ func Themes() (ret []*Theme) { return } - if disallowDisplayBazaarPackage(theme.MinAppVersion) { + if disallowDisplayBazaarPackage(theme.Package) { return } diff --git a/kernel/bazaar/widget.go b/kernel/bazaar/widget.go index c3a7f61da..77012be39 100644 --- a/kernel/bazaar/widget.go +++ b/kernel/bazaar/widget.go @@ -64,7 +64,7 @@ func Widgets() (widgets []*Widget) { return } - if disallowDisplayBazaarPackage(widget.MinAppVersion) { + if disallowDisplayBazaarPackage(widget.Package) { return } diff --git a/kernel/model/bazzar.go b/kernel/model/bazzar.go index 72ba49425..b19c344bd 100644 --- a/kernel/model/bazzar.go +++ b/kernel/model/bazzar.go @@ -32,8 +32,8 @@ func GetPackageREADME(repoURL, repoHash, packageType string) (ret string) { return } -func BazaarPlugins() (plugins []*bazaar.Plugin) { - plugins = bazaar.Plugins() +func BazaarPlugins(frontend string) (plugins []*bazaar.Plugin) { + plugins = bazaar.Plugins(frontend) for _, plugin := range plugins { plugin.Installed = util.IsPathRegularDirOrSymlinkDir(filepath.Join(util.DataDir, "plugins", plugin.Name)) if plugin.Installed { @@ -49,8 +49,8 @@ func BazaarPlugins() (plugins []*bazaar.Plugin) { return } -func InstalledPlugins() (plugins []*bazaar.Plugin) { - plugins = bazaar.InstalledPlugins() +func InstalledPlugins(frontend string) (plugins []*bazaar.Plugin) { + plugins = bazaar.InstalledPlugins(frontend) petals := getPetals() for _, plugin := range plugins { diff --git a/kernel/model/plugin.go b/kernel/model/plugin.go index 3c8cbe087..fe2b6f37a 100644 --- a/kernel/model/plugin.go +++ b/kernel/model/plugin.go @@ -38,10 +38,10 @@ type Petal struct { I18n map[string]interface{} `json:"i18n"` // i18n text } -func SetPetalEnabled(name string, enabled bool) (ret *Petal) { +func SetPetalEnabled(name string, enabled bool, frontend string) (ret *Petal) { petals := getPetals() - plugins := bazaar.InstalledPlugins() + plugins := bazaar.InstalledPlugins(frontend) var plugin *bazaar.Plugin for _, p := range plugins { if p.Name == name {