Support plugin and Theme compatibility version manifests (#9995)

Adds a new rake task `plugin:checkout_compatible_all` and
`plugin:checkout_compatible[plugin-name]` that check out compatible plugin
versions.

Supports a .discourse-compatibility file in the root of plugins and themes that
list out a plugin's compatibility with certain discourse versions:

eg: .discourse-compatibility
```
2.5.0.beta6: some-git-hash
2.4.4.beta4: some-git-tag
2.2.0: git-reference
```

This ensures older Discourse installs are able to find and install older
versions of plugins without intervention, through the manifest only.

It iterates through the versions in descending order. If the current Discourse
version matches an item in the manifest, it checks out the listed plugin target.
If the Discourse version is greater than an item in the manifest, it checks out
the next highest version listed in the manifest.

If no versions match, it makes no change.
This commit is contained in:
Jeff Wong
2020-07-06 11:48:00 -10:00
committed by GitHub
parent 2e13ed061d
commit 339549d14a
4 changed files with 140 additions and 0 deletions

View File

@ -46,4 +46,61 @@ describe Discourse::VERSION do
end
end
context "compatible_resource" do
after do
# Cleanup versions
::Discourse::VERSION::STRING = [::Discourse::VERSION::MAJOR, ::Discourse::VERSION::MINOR, ::Discourse::VERSION::TINY, ::Discourse::VERSION::PRE].compact.join('.')
end
shared_examples "test compatible resource" do
it "returns nil when the current version is above all pinned versions" do
::Discourse::VERSION::STRING = "2.6.0"
expect(Discourse.find_compatible_resource(version_list)).to be_nil
end
it "returns the correct version if matches exactly" do
::Discourse::VERSION::STRING = "2.5.0.beta4"
expect(Discourse.find_compatible_resource(version_list)).to eq("twofivebetafour")
end
it "returns the closest matching version" do
::Discourse::VERSION::STRING = "2.4.6.beta12"
expect(Discourse.find_compatible_resource(version_list)).to eq("twofivebetatwo")
end
it "returns the lowest version possible when using an older version" do
::Discourse::VERSION::STRING = "1.4.6.beta12"
expect(Discourse.find_compatible_resource(version_list)).to eq("twofourtwobetaone")
end
end
it "returns nil when nil" do
expect(Discourse.find_compatible_resource(nil)).to be_nil
end
context "with a regular compatible list" do
let(:version_list) { <<~VERSION_LIST
2.5.0.beta6: twofivebetasix
2.5.0.beta4: twofivebetafour
2.5.0.beta2: twofivebetatwo
2.4.4.beta6: twofourfourbetasix
2.4.2.beta1: twofourtwobetaone
VERSION_LIST
}
include_examples "test compatible resource"
end
context "handle a compatible resource out of order" do
let(:version_list) { <<~VERSION_LIST
2.4.2.beta1: twofourtwobetaone
2.5.0.beta4: twofivebetafour
2.5.0.beta6: twofivebetasix
2.5.0.beta2: twofivebetatwo
2.4.4.beta6: twofourfourbetasix
VERSION_LIST
}
include_examples "test compatible resource"
end
end
end