aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKarsten Heimrich <karsten.heimrich@qt.io>2022-08-01 14:57:35 +0200
committerKarsten Heimrich <karsten.heimrich@qt.io>2022-08-11 13:26:50 +0000
commita44eea3801e798041f18c3a916dea98d6560ae6b (patch)
tree05c88f616a64cdae5adafc85b3bb6651f08b7c2b
parentaf4fff1b576097afce05cecc35a289728a17f802 (diff)
Split/ rewrite and improve performance of HasInvalidVersions()
* Actually check for valid versions only. * Delay reading and parsing of qtconfig.pri unitl necessary. * Slim down reading the default version, as it makes no sense to check for its existence again in GetDefaultVersion() while we want to verify if it is valid (we will find out anyway). Change-Id: I449bdc3907699b464b80e10661bebcf62300af27 Reviewed-by: Miguel Costa <miguel.costa@qt.io>
-rw-r--r--QtVsTools.Core/QtConfig.cs3
-rw-r--r--QtVsTools.Core/QtVersionManager.cs124
-rw-r--r--QtVsTools.Package/QtVsToolsPackage.cs5
3 files changed, 68 insertions, 64 deletions
diff --git a/QtVsTools.Core/QtConfig.cs b/QtVsTools.Core/QtConfig.cs
index 240f2021..93ca8252 100644
--- a/QtVsTools.Core/QtConfig.cs
+++ b/QtVsTools.Core/QtConfig.cs
@@ -55,6 +55,7 @@ namespace QtVsTools.Core
public uint VersionMajor { get; }
public uint VersionMinor { get; }
public uint VersionPatch { get; }
+ public string VersionString { get; }
public QtConfig(string qtdir)
{
@@ -110,6 +111,8 @@ namespace QtVsTools.Core
Is64Bit = (data == "x86_64");
} else if (name == "QT_NAMESPACE") {
Namespace = data;
+ } else if (name == "QT_VERSION") {
+ VersionString = data;
} else if (name == "QT_MAJOR_VERSION") {
if (uint.TryParse(data, out uint versionMajor))
VersionMajor = versionMajor;
diff --git a/QtVsTools.Core/QtVersionManager.cs b/QtVsTools.Core/QtVersionManager.cs
index 74a342bd..9eb7e92a 100644
--- a/QtVsTools.Core/QtVersionManager.cs
+++ b/QtVsTools.Core/QtVersionManager.cs
@@ -132,78 +132,61 @@ namespace QtVsTools.Core
/// <summary>
/// Check if all Qt versions are valid and readable.
/// </summary>
- /// Also sets the default Qt version to the newest version, if needed.
/// <param name="errorMessage"></param>
- /// <returns>true, if we found an invalid version</returns>
- public bool HasInvalidVersions(out string errorMessage)
+ /// <returns>true, if there are one or more invalid Qt version</returns>
+ public bool HasInvalidVersions(out string errorMessage, out bool defaultVersionInvalid)
{
- var validVersions = new Dictionary<string, QtConfig>();
- var invalidVersions = new List<string>();
+ var defaultVersion = GetDefaultVersionString();
+ defaultVersionInvalid = string.IsNullOrEmpty(defaultVersion);
- foreach (var v in GetVersions()) {
- if (v == "$(DefaultQtVersion)")
+ errorMessage = null;
+ foreach (var version in GetVersions()) {
+ if (version == "$(DefaultQtVersion)")
continue;
- var path = GetInstallPath(v);
- if (string.IsNullOrEmpty(path)) {
- invalidVersions.Add(v);
+ var path = GetInstallPath(version);
+ if (path != null && (path.StartsWith("SSH:") || path.StartsWith("WSL:")))
continue;
+
+ if (string.IsNullOrEmpty(path) || !QMake.Exists(path)) {
+ errorMessage += version + " in " + path + "\n";
+ defaultVersionInvalid |= version == defaultVersion;
}
- if (path.StartsWith("SSH:") || path.StartsWith("WSL:"))
- continue;
+ if (!string.IsNullOrEmpty(errorMessage)) {
+ errorMessage = "These Qt version are inaccessible:\n"
+ + errorMessage
+ + "Make sure that you have read access to all files in your Qt directories.";
+ }
+ }
+ return errorMessage != null;
+ }
- if (QMake.Exists(path))
+ public void SetLatestQtVersionAsDefault()
+ {
+ var validVersions = new Dictionary<string, Version>();
+ foreach (var version in GetVersions()) {
+ if (version == "$(DefaultQtVersion)")
continue;
- validVersions[v] = new QtConfig(path);
+
+ var path = GetInstallPath(version);
+ if (!string.IsNullOrEmpty(path) && QMake.Exists(path))
+ validVersions[version] = new Version(new QtConfig(path).VersionString);
}
- if (invalidVersions.Count > 0) {
- errorMessage = "These Qt version are inaccessible:\n";
- foreach (var invalidVersion in invalidVersions)
- errorMessage += invalidVersion + " in " + GetInstallPath(invalidVersion) + "\n";
- errorMessage += "Make sure that you have read access to all files in your Qt directories.";
-
- // Is the default Qt version invalid?
- var isDefaultQtVersionInvalid = false;
- var defaultQtVersionName = GetDefaultVersion();
- if (string.IsNullOrEmpty(defaultQtVersionName)) {
- isDefaultQtVersionInvalid = true;
- } else {
- foreach (var name in invalidVersions) {
- if (name == defaultQtVersionName) {
- isDefaultQtVersionInvalid = true;
- break;
- }
- }
- }
+ if (validVersions.Count <= 0)
+ return;
- // find the newest valid Qt version that can be used as default version
- if (isDefaultQtVersionInvalid && validVersions.Count > 0) {
- QtConfig defaultQtVersionConfig = null;
- foreach (var vNameConfig in validVersions) {
- var vName = vNameConfig.Key;
- var v = vNameConfig.Value;
- if (defaultQtVersionConfig == null) {
- defaultQtVersionConfig = v;
- defaultQtVersionName = vName;
- continue;
- }
- if (defaultQtVersionConfig.VersionMajor < v.VersionMajor ||
- (defaultQtVersionConfig.VersionMajor == v.VersionMajor && (defaultQtVersionConfig.VersionMinor < v.VersionMinor ||
- (defaultQtVersionConfig.VersionMinor == v.VersionMinor && defaultQtVersionConfig.VersionPatch < v.VersionPatch)))) {
- defaultQtVersionConfig = v;
- defaultQtVersionName = vName;
- }
- }
- if (defaultQtVersionConfig != null)
- SaveDefaultVersion(defaultQtVersionName);
+ var defaultName = "";
+ Version defaultVersion = null;
+ foreach (var tmp in validVersions) {
+ var version = tmp.Value;
+ if (defaultVersion == null || defaultVersion < version) {
+ defaultName = tmp.Key;
+ defaultVersion = version;
}
-
- return true;
}
- errorMessage = null;
- return false;
+ SaveDefaultVersion(defaultName);
}
public string GetInstallPath(string version)
@@ -221,12 +204,8 @@ namespace QtVsTools.Core
return Environment.GetEnvironmentVariable("QTDIR");
var key = root.OpenSubKey("SOFTWARE\\" + Resources.registryRootPath, false);
- if (key == null)
- return null;
- var versionKey = key.OpenSubKey(strVersionKey + "\\" + version, false);
- if (versionKey == null)
- return null;
- return (string)versionKey.GetValue("InstallDir");
+ var versionKey = key?.OpenSubKey(strVersionKey + "\\" + version, false);
+ return versionKey?.GetValue("InstallDir") as string;
}
public string GetInstallPath(EnvDTE.Project project)
@@ -447,6 +426,25 @@ namespace QtVsTools.Core
return VerifyIfQtVersionExists(defaultVersion) ? defaultVersion : null;
}
+ public string GetDefaultVersionString()
+ {
+ string defaultVersion = null;
+ try {
+ var key = Registry.CurrentUser.OpenSubKey("SOFTWARE\\" + regVersionPath, false);
+ if (key != null)
+ defaultVersion = key.GetValue("DefaultQtVersion") as string;
+ } catch {
+ Messages.Print("Cannot read the default Qt version from registry.");
+ }
+
+ if (defaultVersion == null) {
+ var qtDir = Environment.GetEnvironmentVariable("QTDIR");
+ if (string.IsNullOrEmpty(qtDir))
+ return defaultVersion;
+ }
+ return defaultVersion;
+ }
+
public bool SaveDefaultVersion(string version)
{
if (version == "$(DefaultQtVersion)")
diff --git a/QtVsTools.Package/QtVsToolsPackage.cs b/QtVsTools.Package/QtVsToolsPackage.cs
index e9cad039..f08e7a7d 100644
--- a/QtVsTools.Package/QtVsToolsPackage.cs
+++ b/QtVsTools.Package/QtVsToolsPackage.cs
@@ -204,8 +204,11 @@ namespace QtVsTools
var timeUiThreadEnd = initTimer.Elapsed;
var vm = QtVersionManager.The(initDone);
- if (vm.HasInvalidVersions(out string error))
+ if (vm.HasInvalidVersions(out string error, out bool defaultInvalid)) {
+ if (defaultInvalid)
+ vm.SetLatestQtVersionAsDefault();
Messages.Print(error);
+ }
///////////
// Install Qt/MSBuild files from package folder to standard location