diff --git a/api4/plugin_test.go b/api4/plugin_test.go index 7780ec9f54..f7bf66f84f 100644 --- a/api4/plugin_test.go +++ b/api4/plugin_test.go @@ -614,9 +614,10 @@ func TestGetInstalledMarketplacePlugins(t *testing.T) { expectedPlugins := append(samplePlugins, &model.MarketplacePlugin{ BaseMarketplacePlugin: &model.BaseMarketplacePlugin{ - HomepageURL: "https://example.com/homepage", - IconData: testIconData, - DownloadURL: "", + HomepageURL: "https://example.com/homepage", + IconData: testIconData, + DownloadURL: "", + ReleaseNotesURL: "https://example.com/releases/v0.0.1", Labels: []model.MarketplaceLabel{{ Name: "Local", Description: "This plugin is not listed in the marketplace", @@ -754,9 +755,10 @@ func TestSearchGetMarketplacePlugins(t *testing.T) { plugin1 := &model.MarketplacePlugin{ BaseMarketplacePlugin: &model.BaseMarketplacePlugin{ - HomepageURL: "https://example.com/homepage", - IconData: testIconData, - DownloadURL: "", + HomepageURL: "https://example.com/homepage", + IconData: testIconData, + DownloadURL: "", + ReleaseNotesURL: "https://example.com/releases/v0.0.1", Labels: []model.MarketplaceLabel{{ Name: "Local", Description: "This plugin is not listed in the marketplace", @@ -772,9 +774,10 @@ func TestSearchGetMarketplacePlugins(t *testing.T) { plugin2 := &model.MarketplacePlugin{ BaseMarketplacePlugin: &model.BaseMarketplacePlugin{ - IconData: testIconData, - HomepageURL: "https://example.com/homepage", - DownloadURL: "", + IconData: testIconData, + HomepageURL: "https://example.com/homepage", + DownloadURL: "", + ReleaseNotesURL: "https://example.com/releases/v1.2.3", Labels: []model.MarketplaceLabel{{ Name: "Local", Description: "This plugin is not listed in the marketplace", @@ -919,9 +922,10 @@ func TestGetLocalPluginInMarketplace(t *testing.T) { newPlugin := &model.MarketplacePlugin{ BaseMarketplacePlugin: &model.BaseMarketplacePlugin{ - IconData: testIconData, - HomepageURL: "https://example.com/homepage", - Manifest: manifest, + IconData: testIconData, + HomepageURL: "https://example.com/homepage", + ReleaseNotesURL: "https://example.com/releases/v0.0.1", + Manifest: manifest, }, InstalledVersion: manifest.Version, } @@ -959,9 +963,10 @@ func TestGetLocalPluginInMarketplace(t *testing.T) { newPlugin := &model.MarketplacePlugin{ BaseMarketplacePlugin: &model.BaseMarketplacePlugin{ - Manifest: manifest, - IconData: testIconData, - HomepageURL: "https://example.com/homepage", + Manifest: manifest, + IconData: testIconData, + HomepageURL: "https://example.com/homepage", + ReleaseNotesURL: "https://example.com/releases/v0.0.1", Labels: []model.MarketplaceLabel{{ Name: "Local", Description: "This plugin is not listed in the marketplace", diff --git a/app/plugin.go b/app/plugin.go index 61f572480e..7196e4e0e0 100644 --- a/app/plugin.go +++ b/app/plugin.go @@ -534,9 +534,10 @@ func (a *App) mergePrepackagedPlugins(remoteMarketplacePlugins map[string]*model prepackagedMarketplace := &model.MarketplacePlugin{ BaseMarketplacePlugin: &model.BaseMarketplacePlugin{ - HomepageURL: prepackaged.Manifest.HomepageURL, - IconData: prepackaged.IconData, - Manifest: prepackaged.Manifest, + HomepageURL: prepackaged.Manifest.HomepageURL, + IconData: prepackaged.IconData, + ReleaseNotesURL: prepackaged.Manifest.ReleaseNotesURL, + Manifest: prepackaged.Manifest, }, } @@ -608,10 +609,11 @@ func (a *App) mergeLocalPlugins(remoteMarketplacePlugins map[string]*model.Marke remoteMarketplacePlugins[plugin.Manifest.Id] = &model.MarketplacePlugin{ BaseMarketplacePlugin: &model.BaseMarketplacePlugin{ - IconData: iconData, - HomepageURL: plugin.Manifest.HomepageURL, - Labels: labels, - Manifest: plugin.Manifest, + HomepageURL: plugin.Manifest.HomepageURL, + IconData: iconData, + ReleaseNotesURL: plugin.Manifest.ReleaseNotesURL, + Labels: labels, + Manifest: plugin.Manifest, }, InstalledVersion: plugin.Manifest.Version, } diff --git a/model/manifest.go b/model/manifest.go index 2befe60f96..b1b3a9237c 100644 --- a/model/manifest.go +++ b/model/manifest.go @@ -154,6 +154,9 @@ type Manifest struct { // SupportURL is an optional URL where plugin issues can be reported. SupportURL string `json:"support_url,omitempty" yaml:"support_url,omitempty"` + // ReleaseNotesURL is an optional URL where a changelog for the release can be found. + ReleaseNotesURL string `json:"release_notes_url,omitempty" yaml:"release_notes_url,omitempty"` + // A relative file path in the bundle that points to the plugins svg icon for use with the Plugin Marketplace. // This should be relative to the root of your bundle and the location of the manifest file. Bitmap image formats are not supported. IconPath string `json:"icon_path,omitempty" yaml:"icon_path,omitempty"` @@ -330,6 +333,10 @@ func (m *Manifest) IsValid() error { return errors.New("invalid SupportURL") } + if m.ReleaseNotesURL != "" && !IsValidHttpUrl(m.ReleaseNotesURL) { + return errors.New("invalid SupportURL") + } + _, err := semver.Parse(m.Version) if err != nil { return errors.Wrap(err, "failed to parse Version") diff --git a/model/manifest_test.go b/model/manifest_test.go index f5efd508af..cf4b2061d6 100644 --- a/model/manifest_test.go +++ b/model/manifest_test.go @@ -25,7 +25,8 @@ func TestIsValid(t *testing.T) { }{ {"Invalid Id", &Manifest{Id: "some id"}, true}, {"Invalid homePageURL", &Manifest{Id: "com.company.test", HomepageURL: "some url"}, true}, - {"Invalid supportURL", &Manifest{Id: "com.company.test", HomepageURL: "http://someurl.com", SupportURL: "some url"}, true}, + {"Invalid supportURL", &Manifest{Id: "com.company.test", SupportURL: "some url"}, true}, + {"Invalid ReleaseNotesURL", &Manifest{Id: "com.company.test", ReleaseNotesURL: "some url"}, true}, {"Invalid version", &Manifest{Id: "com.company.test", HomepageURL: "http://someurl.com", SupportURL: "http://someotherurl.com", Version: "version"}, true}, {"Invalid min version", &Manifest{Id: "com.company.test", HomepageURL: "http://someurl.com", SupportURL: "http://someotherurl.com", Version: "5.10.0", MinServerVersion: "version"}, true}, {"SettingSchema error", &Manifest{Id: "com.company.test", HomepageURL: "http://someurl.com", SupportURL: "http://someotherurl.com", Version: "5.10.0", MinServerVersion: "5.10.8", SettingsSchema: &PluginSettingsSchema{ @@ -37,6 +38,7 @@ func TestIsValid(t *testing.T) { Description: "thedescription", HomepageURL: "http://someurl.com", SupportURL: "http://someotherurl.com", + ReleaseNotesURL: "http://someotherurl.com/releases/v0.0.1", Version: "0.0.1", MinServerVersion: "5.6.0", Server: &ManifestServer{ diff --git a/tests/README.md b/tests/README.md index 27b9d185bc..05c91a2eee 100644 --- a/tests/README.md +++ b/tests/README.md @@ -34,5 +34,6 @@ Then update the sigantures: $ gpg -u F3FACE45E0DE642C8BD6A8E64C7C6562C192CC1F --verbose --personal-digest-preferences SHA256 --detach-sign testplugin.tar.gz $ gpg -u F3FACE45E0DE642C8BD6A8E64C7C6562C192CC1F --verbose --personal-digest-preferences SHA256 --detach-sign --armor testplugin.tar.gz $ gpg -u F3FACE45E0DE642C8BD6A8E64C7C6562C192CC1F --verbose --personal-digest-preferences SHA256 --detach-sign testplugin2.tar.gz +$ gpg -u F3FACE45E0DE642C8BD6A8E64C7C6562C192CC1F --verbose --personal-digest-preferences SHA256 --detach-sign --armor testplugin2.tar.gz Finally, include the updates bundles and signatures in your commit. diff --git a/tests/testplugin.tar.gz b/tests/testplugin.tar.gz index 4685d1c345..da716bbee3 100644 Binary files a/tests/testplugin.tar.gz and b/tests/testplugin.tar.gz differ diff --git a/tests/testplugin.tar.gz.asc b/tests/testplugin.tar.gz.asc index 0fe8e1ad1e..2ea3c9f3b1 100644 --- a/tests/testplugin.tar.gz.asc +++ b/tests/testplugin.tar.gz.asc @@ -1,14 +1,14 @@ -----BEGIN PGP SIGNATURE----- -iQGzBAABCAAdFiEE8/rOReDeZCyL1qjmTHxlYsGSzB8FAl4hzNEACgkQTHxlYsGS -zB9+oQv+LoGzdDKmJu1J021S5lw6fIoUtEB0AUFHXZyij9bSLhMxey8LbW5l6JnG -0Op0SEDU4c97eQMwFvfrLnJDepziFrlSZmt60v/6LxEraB4CfCQ/D6M2/dkcERnG -c7AUsbObiS6eYpkw5isLz6dP8LoHZBSl4Sw2aSujQL1IvPC3tAzkBDZ7HlxRK4Py -x9ekBj26mrkwY+1A6to3GofK1fSo8NZtstuJ2408r4crGplOXahLrW2hW5f++4pJ -L0c4945emSO5XkHXMlz46WcRNvgEAeaLMZwmKxfVH5gDR9kbzrrEgDQibSZtn+mF -mfMk22vlJ4wZUGnvWnbpEKUWllwmJcCXUkHc/Xw8s8vB+qcToAWZYFzIxydiUdVm -oUzDvh/QcG2G4I6q+Qp2YqZs8QVCSJIQN50AAXKnNEh1D0M9EiK/3e/GfHvNnPwQ -uWjNw0bXKBIduDl/dZp7DSSRmtkFAmwu+tAZZbzaqb+qRzL1GuWneZbcgyCpze1C -KXSi4aDJ -=1iVn +iQGzBAABCAAdFiEE8/rOReDeZCyL1qjmTHxlYsGSzB8FAl4sogwACgkQTHxlYsGS +zB+CiwwAqNhwq6PQeKCQyJ4F1kZBpSkHrlbaT+V89tcj5BomhxFin30XukW2tiov ++U4cfeKI+NAu9uPUxN6f4r6khQOGQK0bvun3YDemhbVozaPneNoxs+ugkBLMrwvp +v3Vbi241bTWsi6NxlwJDSM+LEYWkFXZKCjQFjX2UWEM86uocKZnjHHqqke4ZkXWm +Sal1mOvfZtx/R0+8aKt7FEbdUy4s15gRcVfnp017PD9VDwfiXSMVrdaYr3HqD2Q/ +WMMmZ9lW4Y0I6qtv+1Ud9YZAXPr8OzsgU13FXU1GcUG+L/W8jSb9XY/4EIFpb4O6 +tQGRBBtjq0EofVq8S9V6/LMPH3/CPgHufK7TWl12mnyGUOac4YmFlGtStkovIHZJ ++nxcMsV5xU3UhdM+/uBJnC5EH8sH2hQpkJugZIFruswfHNSiNKUpiHjupepfsV7v +jzKCEgh7Rv99QBSSBtZSuBitnzEWAE3X9UsEYx5qCQJvBBVLiugFHFv6MtkePRNd +ElLLqMat +=KHZP -----END PGP SIGNATURE----- diff --git a/tests/testplugin.tar.gz.sig b/tests/testplugin.tar.gz.sig index d983985624..39efc817b7 100644 Binary files a/tests/testplugin.tar.gz.sig and b/tests/testplugin.tar.gz.sig differ diff --git a/tests/testplugin2.tar.gz b/tests/testplugin2.tar.gz index 7e822f37e6..f9f0de32d5 100644 Binary files a/tests/testplugin2.tar.gz and b/tests/testplugin2.tar.gz differ diff --git a/tests/testplugin2.tar.gz.asc b/tests/testplugin2.tar.gz.asc index 704155e829..e460b3fd07 100644 --- a/tests/testplugin2.tar.gz.asc +++ b/tests/testplugin2.tar.gz.asc @@ -1,14 +1,14 @@ -----BEGIN PGP SIGNATURE----- -iQGzBAABCAAdFiEE8/rOReDeZCyL1qjmTHxlYsGSzB8FAl4fca4ACgkQTHxlYsGS -zB8qkgv/cTe71xkIHALB0HAvnd2HD6NqA3/AdOWIvZtmtU8une2s6Int28sPMkt9 -HNmVsBpiDnsmB+jfkrf4NXpCVn3to/gB1qWSmudPWb+b54XGdD8SGOpmCT9Fd2qN -EGHjgvmHJ/2F5PQ5B+FazLflyFn0JcA+BCikBcJfmTvDdBgEwR5QEsowDy5mLb3v -AxKZR9PnmOkAt0/fs2geyqPZ1s+NTlsIHRP0Hvtkxq7BvQJWoTmcJb5mFbBvAz24 -nsXzGpAFKpBjx9v9WErcq8Fy2Ad3Iqu7mKgTQxPrpreCRZceWJg327fFr8A2YVCU -Zo2cC/+By2GUmnotHVD4abead0J8t3eVyexg0CwOstQCeIEKfYtuU8UuyJtqhO6t -cKkE1oiBOo7TtYdWRQyR/9zlim7Wlj94WvquJLemCfazoQdq68hyvGa6C2lakZx3 -iSzYw00V6U+aEXffadzXnmbQiJKcOu7gIyumBbGIDLOfM5ypACvnCNHxQ/mlYHjD -+HOR5g+1 -=FsxQ +iQGzBAABCAAdFiEE8/rOReDeZCyL1qjmTHxlYsGSzB8FAl4soo8ACgkQTHxlYsGS +zB+7RwwAmwLH64J1G9LUQRD1rJFlvlIGgEE6leaJO4bKkOACD4QQs70q+rLzNazA +maVKjOddKq5fslIsQxHHlIeIMfuTioQ12ZOU6pVY1o1gw5RPolCopLdgac1lA0Fg +dDMCtB62iRJqcsnUWFJwhf9fBCwNVGjG6+fPnLyHOXNmDGWDnxxPLNevSEya/Yzg +68C1ervBJ4AV6x6Wyc4ejaAliHOBMzv1Z8NclWisKYllaigUUtWauctiM00Ga7kM +ADOMVBljI8QauV7E39mxr89Z9ULo8moI2dIPwyrC2vWaW0RnK1XXO2+pDugrlSN7 +ZLGFMdcD6kjnwaZXfSNXeXh2PeERjhRk8Zw5mvrg51VgUaqv2pZjP4g2hA5D1D0U +BGgPLVrlkqEV9my8MNLMhBmj1WfBzDNMEcUu4UbeVpnkj3Px0cnWAAFQgSAMniON +c8ng0VEuEHo2z3kiQcBT//mHgFuzaX47OYgPsBPZzMpIAlQ+giryHT8byXcOLcfc +KuwzQRZj +=Z3mM -----END PGP SIGNATURE----- diff --git a/tests/testplugin2.tar.gz.sig b/tests/testplugin2.tar.gz.sig index 9c4221b1f4..90f6d24be4 100644 Binary files a/tests/testplugin2.tar.gz.sig and b/tests/testplugin2.tar.gz.sig differ