Skip to content

Commit 9711506

Browse files
committed
[Plugin Manager] Fix for compatibility check in QgsPluginInstaller and QgsPluginRegistry
1 parent 61e101d commit 9711506

File tree

3 files changed

+67
-23
lines changed

3 files changed

+67
-23
lines changed

python/pyplugin_installer/installer_data.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
import qgis.utils
3434
from qgis.core import *
3535
from qgis.utils import iface
36-
from version_compare import compareVersions, normalizeVersion
36+
from version_compare import compareVersions, normalizeVersion, isCompatible
3737

3838
"""
3939
Data structure:
@@ -487,7 +487,7 @@ def xmlDownloaded(self,nr,state):
487487
if not qgisMaximumVersion: qgisMaximumVersion = qgisMinimumVersion[0] + ".99"
488488
#if compatible, add the plugin to the list
489489
if not pluginNodes.item(i).firstChildElement("disabled").text().strip().upper() in ["TRUE","YES"]:
490-
if compareVersions(QGis.QGIS_VERSION, qgisMinimumVersion) < 2 and compareVersions(qgisMaximumVersion, QGis.QGIS_VERSION) < 2:
490+
if isCompatible(QGis.QGIS_VERSION, qgisMinimumVersion, qgisMaximumVersion):
491491
#add the plugin to the cache
492492
plugins.addFromRepository(plugin)
493493
# set state=2, even if the repo is empty
@@ -620,7 +620,7 @@ def pluginMetadata(fct):
620620
qgisMaximumVersion = pluginMetadata("qgisMaximumVersion").strip()
621621
if not qgisMaximumVersion: qgisMaximumVersion = qgisMinimumVersion[0] + ".999"
622622
#if compatible, add the plugin to the list
623-
if compareVersions(QGis.QGIS_VERSION, qgisMinimumVersion) == 2 or compareVersions(qgisMaximumVersion, QGis.QGIS_VERSION) == 2:
623+
if not isCompatible(QGis.QGIS_VERSION, qgisMinimumVersion, qgisMaximumVersion):
624624
error = "incompatible"
625625
errorDetails = "%s - %s" % (qgisMinimumVersion, qgisMaximumVersion)
626626

python/pyplugin_installer/version_compare.py

+50-1
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ def compareElements(s1,s2):
114114

115115
# ------------------------------------------------------------------------ #
116116
def compareVersions(a,b):
117-
""" Compare two version numbers. Return 0 if a==b or error, 1 if a<b and 2 if b>a """
117+
""" Compare two version numbers. Return 0 if a==b or error, 1 if a>b and 2 if b>a """
118118
if not a or not b:
119119
return 0
120120
a = normalizeVersion(a)
@@ -155,3 +155,52 @@ def compareVersions(a,b):
155155
return 1
156156
else:
157157
return 2
158+
159+
160+
161+
162+
163+
164+
## COMPARE CURRENT QGIS VERSION WITH qgisMinimumVersion AND qgisMaximumVersion """
165+
166+
def splitVersion(s):
167+
""" split string into 2 or 3 numerical segments """
168+
if not s or type(s) not in [str, unicode]:
169+
return None
170+
l = unicode(s).split('.')
171+
for c in l:
172+
if not c.isnumeric():
173+
return None
174+
if int(c)>999:
175+
return None
176+
if len(l) not in [2,3]:
177+
return None
178+
return l
179+
180+
181+
def isCompatible(curVer, minVer, maxVer=None):
182+
""" Compare current QGIS version with qgisMinVersion and qgisMaxVersion """
183+
minVer = splitVersion(minVer)
184+
maxVer = splitVersion(maxVer)
185+
curVer = splitVersion( curVer.split("-")[0] )
186+
187+
if not minVer or not curVer:
188+
return False
189+
190+
if not maxVer:
191+
maxVer = [minVer[0], "999", "999"]
192+
193+
if len(minVer)<3:
194+
minVer += ["0"]
195+
196+
if len(curVer)<3:
197+
curVer += ["0"]
198+
199+
if len(maxVer)<3:
200+
maxVer += ["999"]
201+
202+
minVer = "%03d%03d%03d" % ( int(minVer[0]), int(minVer[1]), int(minVer[2]) )
203+
maxVer = "%03d%03d%03d" % ( int(maxVer[0]), int(maxVer[1]), int(maxVer[2]) )
204+
curVer = "%03d%03d%03d" % ( int(curVer[0]), int(curVer[1]), int(curVer[2]) )
205+
206+
return ( minVer <= curVer and maxVer >= curVer)

src/app/qgspluginregistry.cpp

+14-19
Original file line numberDiff line numberDiff line change
@@ -207,12 +207,11 @@ bool QgsPluginRegistry::checkQgisVersion( QString minVersion, QString maxVersion
207207
}
208208

209209
// Parse qgisMaxVersion. Must be in form x.y.z or just x.y
210-
int maxVerMajor, maxVerMinor, maxVerBugfix = 0;
210+
int maxVerMajor, maxVerMinor, maxVerBugfix = 999;
211211
if ( maxVersion.isEmpty() || maxVersion == "__error__" )
212212
{
213213
maxVerMajor = minVerMajor;
214214
maxVerMinor = 999;
215-
maxVerBugfix = 999;
216215
}
217216
else
218217
{
@@ -253,23 +252,19 @@ bool QgsPluginRegistry::checkQgisVersion( QString minVersion, QString maxVersion
253252
int qgisMinor = qgisVersionParts.at( 1 ).toInt();
254253
int qgisBugfix = qgisVersionParts.at( 2 ).toInt();
255254

256-
// first check major version
257-
if ( minVerMajor > qgisMajor || maxVerMajor < qgisMajor )
258-
return false;
259-
if ( minVerMajor < qgisMajor || maxVerMajor > qgisMajor )
260-
return true;
261-
// if same, check minor version
262-
if ( minVerMinor > qgisMinor || maxVerMinor < qgisMinor )
263-
return false;
264-
if ( minVerMinor < qgisMinor || maxVerMinor > qgisMinor )
265-
return true;
266-
267-
// if still same, check bugfix version (lower range only)
268-
if ( minVerBugfix > qgisBugfix )
269-
return false;
270-
271-
// looks like min or max version is the same as our version - that's fine
272-
return true;
255+
// build strings with trailing zeroes
256+
QString minVer = QString( "%1%2%3" ).arg( minVerMajor, 3, 10, QChar( '0' ) )
257+
.arg( minVerMinor, 3, 10, QChar( '0' ) )
258+
.arg( minVerBugfix, 3, 10, QChar( '0' ) );
259+
QString maxVer = QString( "%1%2%3" ).arg( maxVerMajor, 3, 10, QChar( '0' ) )
260+
.arg( maxVerMinor, 3, 10, QChar( '0' ) )
261+
.arg( maxVerBugfix, 3, 10, QChar( '0' ) );
262+
QString curVer = QString( "%1%2%3" ).arg( qgisMajor, 3, 10, QChar( '0' ) )
263+
.arg( qgisMinor, 3, 10, QChar( '0' ) )
264+
.arg( qgisBugfix, 3, 10, QChar( '0' ) );
265+
266+
// compare
267+
return ( minVer <= curVer && maxVer >= curVer);
273268
}
274269

275270

0 commit comments

Comments
 (0)