Read a local plugin's version from its file header (#16118)

* Read a local plugin's version from its file header

read_install_state() let the sidecar's installed_version override the version
parsed from the entry file's PEP 723 header. That is right for cloud plugins,
whose header may be stale, but a local plugin has no other source of truth, so
the UI kept showing the version recorded at first install after the file was
edited. For local installs, use the header version.

* Keep the cloud installed version of an unsubscribed plugin

A cloud plugin kept as local after unsubscribing is rewritten with installed_from=local and no cloud_uuid, which the local-header rule could not tell apart from a real local install. Its installed_version is still the cloud one while the header may lag, so the next scan showed the stale header version. Record the conversion in the install state and exclude those plugins from the header rule. Add tests for a local plugin following its header and for an unsubscribed cloud plugin keeping its cloud version.

* Add tests for the version of a local plugin

A local plugin's version comes from its entry file header. Cover the case of a plugin edited after install, and a plugin unsubscribed from the cloud, which is now a normal local package.
This commit is contained in:
Riccardo BRAMATI
2026-10-11 03:09:32 +08:00
committed by GitHub
parent ea10c84d6b
commit 07a12f5fe4
2 changed files with 48 additions and 1 deletions
+8 -1
View File
@@ -754,7 +754,14 @@ bool read_install_state(const boost::filesystem::path& plugin_dir, PluginDescrip
// truth for a cloud plugin's installed version: it records the version fetched from
// the cloud at install time, independent of the (possibly stale) manifest/PEP723
// header that scan_directory parses into entry.version.
if (!state.installed_version.empty())
//
// A local plugin has no cloud copy to diverge from: the entry file's own header is the only
// source of truth for its version. Trusting the sidecar there would pin the version shown
// in the UI to whatever it was at first install, even after the file is edited.
const bool is_local_install = state.installed_from == "local" && state.cloud_uuid.empty();
if (is_local_install && !entry.version.empty())
entry.installed_version = entry.version;
else if (!state.installed_version.empty())
entry.installed_version = state.installed_version;
if (!state.cloud_uuid.empty())
entry.cloud = CloudPluginState{state.cloud_uuid, true, false, false};