diff options
author | Karsten Heimrich <karsten.heimrich@qt.io> | 2024-01-15 16:40:31 +0100 |
---|---|---|
committer | Karsten Heimrich <karsten.heimrich@qt.io> | 2024-01-16 10:45:55 +0000 |
commit | 975ff836028af16080583323f8a12ce9e3df3bf2 (patch) | |
tree | 315b7bf147952eba7c467460411aee1d18ec1378 | |
parent | 36eacfea4227aef34f0d26853de653f5010e93df (diff) |
Merge both getter methods to fetch Qt version information
* Merges both caches into the version information class itself.
* Adapt depending code and classes to the function name changes.
Change-Id: I308a0646af815be220f17902e01391819cb33ac8
Reviewed-by: Miguel Costa <miguel.costa@qt.io>
-rw-r--r-- | QtVsTools.Core/CMake/CMakeProject.Presets.cs | 4 | ||||
-rw-r--r-- | QtVsTools.Core/HelperFunctions.cs | 2 | ||||
-rw-r--r-- | QtVsTools.Core/MsBuild/MsBuildProject.cs | 2 | ||||
-rw-r--r-- | QtVsTools.Core/MsBuild/MsBuildProjectReaderWriter.V2.cs | 2 | ||||
-rw-r--r-- | QtVsTools.Core/ProjectImport/ProjectImporter.cs | 6 | ||||
-rw-r--r-- | QtVsTools.Core/QtVersionManager.cs | 29 | ||||
-rw-r--r-- | QtVsTools.Core/VersionInformation.cs | 61 | ||||
-rw-r--r-- | QtVsTools.Package/Editors/Editor.cs | 2 | ||||
-rw-r--r-- | QtVsTools.Package/MsBuild/QtModulesEditor.cs | 4 | ||||
-rw-r--r-- | QtVsTools.Package/Package/QtHelp.cs | 2 | ||||
-rw-r--r-- | QtVsTools.Package/QtVsToolsPackage.cs | 2 | ||||
-rw-r--r-- | QtVsTools.Wizards/ProjectWizard/ConfigPage.xaml.cs | 8 |
12 files changed, 63 insertions, 61 deletions
diff --git a/QtVsTools.Core/CMake/CMakeProject.Presets.cs b/QtVsTools.Core/CMake/CMakeProject.Presets.cs index d76804bc..1ca05d4e 100644 --- a/QtVsTools.Core/CMake/CMakeProject.Presets.cs +++ b/QtVsTools.Core/CMake/CMakeProject.Presets.cs @@ -68,7 +68,7 @@ namespace QtVsTools.Core.CMake .Where(x => x["vendor"]?["qt-project.org/Version"] != null) .ToList(); foreach (var versionPreset in versionPresets) { - if (QtVersionManager.GetVersionInfo((string)versionPreset["name"]) is { } version) { + if (VersionInformation.GetOrAddByName((string)versionPreset["name"]) is {} version) { var qtDir = version.InstallPrefix.Replace('\\', '/'); var presetQtDir = versionPreset["environment"]?["QTDIR"]?.Value<string>(); if (qtDir.Equals(presetQtDir, IgnoreCase)) @@ -129,7 +129,7 @@ namespace QtVsTools.Core.CMake .Where(x => !versionRecords.ContainsKey(x)); var missingVersions = missingVersionNames - .Select(QtVersionManager.GetVersionInfo) + .Select(VersionInformation.GetOrAddByName) .Where(x => x != null && !string.IsNullOrEmpty(x.InstallPrefix)); foreach (var missingVersion in missingVersions) { diff --git a/QtVsTools.Core/HelperFunctions.cs b/QtVsTools.Core/HelperFunctions.cs index 91655d60..7a0440fa 100644 --- a/QtVsTools.Core/HelperFunctions.cs +++ b/QtVsTools.Core/HelperFunctions.cs @@ -488,7 +488,7 @@ namespace QtVsTools.Core public static string VcPath { get; set; } public static bool SetVcVars(VersionInformation versionInfo, ProcessStartInfo startInfo) { - versionInfo ??= QtVersionManager.GetVersionInfo(QtVersionManager.GetDefaultVersion()); + versionInfo ??= VersionInformation.GetOrAddByName(QtVersionManager.GetDefaultVersion()); if (string.IsNullOrEmpty(VcPath)) return false; diff --git a/QtVsTools.Core/MsBuild/MsBuildProject.cs b/QtVsTools.Core/MsBuild/MsBuildProject.cs index 020a9192..dd6c2018 100644 --- a/QtVsTools.Core/MsBuild/MsBuildProject.cs +++ b/QtVsTools.Core/MsBuild/MsBuildProject.cs @@ -127,7 +127,7 @@ namespace QtVsTools.Core.MsBuild get { ThreadHelper.ThrowIfNotOnUIThread(); - return QtVersionManager.GetVersionInfo(QtVersion); + return VersionInformation.GetOrAddByName(QtVersion); } } diff --git a/QtVsTools.Core/MsBuild/MsBuildProjectReaderWriter.V2.cs b/QtVsTools.Core/MsBuild/MsBuildProjectReaderWriter.V2.cs index b0db6789..2b323ae0 100644 --- a/QtVsTools.Core/MsBuild/MsBuildProjectReaderWriter.V2.cs +++ b/QtVsTools.Core/MsBuild/MsBuildProjectReaderWriter.V2.cs @@ -171,7 +171,7 @@ namespace QtVsTools.Core.MsBuild } Commit("Removing Qt module macros from resource compiler properties"); - var qtVersion = QtVersionManager.GetVersionInfo(qtInstallValue); + var qtVersion = VersionInformation.GetOrAddByName(qtInstallValue); moduleNames = QtModules.Instance.GetAvailableModules(qtVersion.qtMajor) // remove proVarQT values not provided by the used Qt version .SelectMany(x => x.proVarQT?.Split(' ') ?? Array.Empty<string>()) diff --git a/QtVsTools.Core/ProjectImport/ProjectImporter.cs b/QtVsTools.Core/ProjectImport/ProjectImporter.cs index 1ae97ee8..a1763ffe 100644 --- a/QtVsTools.Core/ProjectImport/ProjectImporter.cs +++ b/QtVsTools.Core/ProjectImport/ProjectImporter.cs @@ -34,7 +34,7 @@ namespace QtVsTools.Core if (_dteObject is null || GetQtInstallPath() is not {} qtDir) return; - var vi = VersionInformation.Get(qtDir); + var vi = VersionInformation.GetOrAddByPath(qtDir); if (vi.qtMajor < 5) { Messages.DisplayErrorMessage("The default Qt version does not support Visual " + "Studio. To import .pro files, specify Qt 5.0 or later as the default."); @@ -127,7 +127,7 @@ namespace QtVsTools.Core { ThreadHelper.ThrowIfNotOnUIThread(); - var versionInfo = QtVersionManager.GetVersionInfo(qtVersion); + var versionInfo = VersionInformation.GetOrAddByName(qtVersion); var vcInfo = RunQmake(mainInfo, ".sln", true, versionInfo); if (null == vcInfo) return; @@ -156,7 +156,7 @@ namespace QtVsTools.Core { ThreadHelper.ThrowIfNotOnUIThread(); - var versionInfo = QtVersionManager.GetVersionInfo(qtVersion); + var versionInfo = VersionInformation.GetOrAddByName(qtVersion); var vcInfo = RunQmake(mainInfo, ProjectFileExtension, false, versionInfo); if (null == vcInfo) return; diff --git a/QtVsTools.Core/QtVersionManager.cs b/QtVsTools.Core/QtVersionManager.cs index 73c1274c..4f8d43f3 100644 --- a/QtVsTools.Core/QtVersionManager.cs +++ b/QtVsTools.Core/QtVersionManager.cs @@ -4,11 +4,9 @@ ***************************************************************************************************/ using System; -using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Linq; -using System.Threading; using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.VCProjectEngine; using Microsoft.Win32; @@ -25,33 +23,6 @@ namespace QtVsTools.Core private const string VersionsKey = "Versions"; private const string RegistryVersionsPath = Resources.RegistryRootPath + "\\" + VersionsKey; - private static readonly SemaphoreSlim CacheSemaphore = new (1, 1); - private static readonly ConcurrentDictionary<string, VersionInformation> VersionCache = new(); - - public static VersionInformation GetVersionInfo(string name) - { - if (name == "$(DefaultQtVersion)") - name = GetDefaultVersion(); - if (name == null) - return null; - - if (VersionCache.TryGetValue(name, out var vi)) - return vi; - - CacheSemaphore.Wait(); - try { - vi = VersionCache.GetOrAdd(name, VersionInformation.Get(GetInstallPath(name))); - if (vi != null) - vi.name = name; - return vi; - } catch (Exception exception) { - exception.Log(); - return null; - } finally { - CacheSemaphore.Release(); - } - } - public static string[] GetVersions() { var key = Registry.CurrentUser.OpenSubKey(Resources.RegistryRootPath, false); diff --git a/QtVsTools.Core/VersionInformation.cs b/QtVsTools.Core/VersionInformation.cs index 1deb4b34..7ef0bfcc 100644 --- a/QtVsTools.Core/VersionInformation.cs +++ b/QtVsTools.Core/VersionInformation.cs @@ -4,15 +4,17 @@ ***************************************************************************************************/ using System; -using System.Collections; +using System.Collections.Concurrent; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Text.RegularExpressions; +using System.Threading; namespace QtVsTools.Core { + using Common; using MsBuild; [DebuggerDisplay("Name = {name}, Version = {qtMajor}.{qtMinor}.{qtPatch}")] @@ -28,28 +30,58 @@ namespace QtVsTools.Core private QMakeConf qmakeConf; private readonly QMakeQuery qmakeQuery; private string vsPlatformName; - private static readonly Hashtable _cache = new(); - public static VersionInformation Get(string qtDir) + private static readonly SemaphoreSlim CacheSemaphore = new (1, 1); + private static readonly ConcurrentDictionary<string, VersionInformation> Cache + = new(Utils.CaseIgnorer); + + public static VersionInformation GetOrAddByName(string name) { - qtDir ??= Environment.GetEnvironmentVariable("QTDIR"); - if (qtDir == null || !Directory.Exists(qtDir)) - return null; + try { + if (!string.IsNullOrEmpty(name)) + return GetOrAddByPath(QtVersionManager.GetInstallPath(name), name); + } catch (Exception exception) { + exception.Log(); + } + return null; + } + public static VersionInformation GetOrAddByPath(string dir, string name = null) + { try { - qtDir = new FileInfo(qtDir).FullName.ToUpperInvariant(); + dir ??= Environment.GetEnvironmentVariable("QTDIR"); + dir = new FileInfo(dir?.TrimEnd('\\', '/', ' ') ?? "").FullName; } catch { return null; } + if (!Directory.Exists(dir)) + return null; - if (_cache[qtDir] is not VersionInformation versionInfo) { - versionInfo = new VersionInformation(qtDir); - _cache.Add(qtDir, versionInfo); - } else if (versionInfo.qtDir == null) { - versionInfo = new VersionInformation(qtDir); - _cache[qtDir] = versionInfo; + CacheSemaphore.Wait(); + try { + var vi = Cache.AddOrUpdate(dir, + _ => // Add value factory + { + var vi = new VersionInformation(dir); + if (string.IsNullOrEmpty(vi.name) && !string.IsNullOrEmpty(name)) + vi.name = name; + return vi; + }, + (key, value) => // Update value factory + { + if (string.IsNullOrEmpty(value.qtDir)) + value = new VersionInformation(key); + if (string.IsNullOrEmpty(value.name) && !string.IsNullOrEmpty(name)) + value.name = name; + return value; + }); + return vi; + } catch (Exception exception) { + exception.Log(); + return null; + } finally { + CacheSemaphore.Release(); } - return versionInfo; } private string vcLinkTargetMachine; @@ -100,7 +132,6 @@ namespace QtVsTools.Core private VersionInformation(string qtDirIn) { qtDir = qtDirIn; - try { qmakeQuery = new QMakeQuery(qtDirIn); SetupPlatformSpecificData(); diff --git a/QtVsTools.Package/Editors/Editor.cs b/QtVsTools.Package/Editors/Editor.cs index 8a9d0e14..2b479262 100644 --- a/QtVsTools.Package/Editors/Editor.cs +++ b/QtVsTools.Package/Editors/Editor.cs @@ -62,7 +62,7 @@ namespace QtVsTools.Editors string GetDefaultQtToolsPath() { var defaultVersion = QtVersionManager.GetDefaultVersion(); - var defaultVersionInfo = QtVersionManager.GetVersionInfo(defaultVersion); + var defaultVersionInfo = VersionInformation.GetOrAddByName(defaultVersion); if (defaultVersionInfo == null || string.IsNullOrEmpty(defaultVersionInfo.qtDir)) return null; diff --git a/QtVsTools.Package/MsBuild/QtModulesEditor.cs b/QtVsTools.Package/MsBuild/QtModulesEditor.cs index b0acdcc4..4fecb2c1 100644 --- a/QtVsTools.Package/MsBuild/QtModulesEditor.cs +++ b/QtVsTools.Package/MsBuild/QtModulesEditor.cs @@ -38,8 +38,8 @@ namespace QtVsTools.Package.MsBuild var qtSettings = ruleProperty.ContainingRule; var qtVersion = await qtSettings.GetPropertyValueAsync("QtInstall"); - var versionInfo = QtVersionManager.GetVersionInfo(qtVersion) - ?? QtVersionManager.GetVersionInfo(QtVersionManager.GetDefaultVersion()); + var versionInfo = VersionInformation.GetOrAddByName(qtVersion) + ?? VersionInformation.GetOrAddByName(QtVersionManager.GetDefaultVersion()); var modules = QtModules.Instance.GetAvailableModules(versionInfo.qtMajor) .Where(x => !string.IsNullOrEmpty(x.proVarQT)) diff --git a/QtVsTools.Package/Package/QtHelp.cs b/QtVsTools.Package/Package/QtHelp.cs index 4ba34e0f..6bd60b45 100644 --- a/QtVsTools.Package/Package/QtHelp.cs +++ b/QtVsTools.Package/Package/QtHelp.cs @@ -131,7 +131,7 @@ namespace QtVsTools if (HelperFunctions.GetSelectedQtProject(dte) is {} project) qtVersion = project.QtVersion; - var info = QtVersionManager.GetVersionInfo(qtVersion); + var info = VersionInformation.GetOrAddByName(qtVersion); var docPath = info?.QtInstallDocs; if (string.IsNullOrEmpty(docPath) || !Directory.Exists(docPath)) return false; diff --git a/QtVsTools.Package/QtVsToolsPackage.cs b/QtVsTools.Package/QtVsToolsPackage.cs index 867e8a29..e86fabec 100644 --- a/QtVsTools.Package/QtVsToolsPackage.cs +++ b/QtVsTools.Package/QtVsToolsPackage.cs @@ -396,7 +396,7 @@ namespace QtVsTools Messages.Print($@" --- Checking {version} ..."); var timer = Stopwatch.StartNew(); - var qt = QtVersionManager.GetVersionInfo(version); + var qt = VersionInformation.GetOrAddByName(version); if (Directory.Exists(qt?.InstallPrefix ?? string.Empty)) { Messages.Print($@" --- {version} check OK ({timer.Elapsed.TotalSeconds:0.##} secs)"); diff --git a/QtVsTools.Wizards/ProjectWizard/ConfigPage.xaml.cs b/QtVsTools.Wizards/ProjectWizard/ConfigPage.xaml.cs index 67c1ef4f..f16470bd 100644 --- a/QtVsTools.Wizards/ProjectWizard/ConfigPage.xaml.cs +++ b/QtVsTools.Wizards/ProjectWizard/ConfigPage.xaml.cs @@ -133,7 +133,7 @@ namespace QtVsTools.Wizards.ProjectWizard InitializeComponent(); string defaultQtVersionName = QtVersionManager.GetDefaultVersion(); - defaultQtVersionInfo = QtVersionManager.GetVersionInfo(defaultQtVersionName); + defaultQtVersionInfo = VersionInformation.GetOrAddByName(defaultQtVersionName); DataContext = this; Loaded += OnLoaded; @@ -332,7 +332,7 @@ namespace QtVsTools.Wizards.ProjectWizard break; case QT_VERSION_BROWSE: if (BrowseForAndGetQtVersion() is {} qtVersion) { - if (VersionInformation.Get(qtVersion) is {} versionInfo) { + if (VersionInformation.GetOrAddByPath(qtVersion) is {} versionInfo) { versionInfo.name = qtVersion; config.QtVersion = versionInfo; config.QtVersionName = versionInfo.name; @@ -343,7 +343,7 @@ namespace QtVsTools.Wizards.ProjectWizard break; default: if (QtVersionManager.GetVersions().Contains(comboBoxQtVersion.Text)) { - config.QtVersion = QtVersionManager.GetVersionInfo(comboBoxQtVersion.Text); + config.QtVersion = VersionInformation.GetOrAddByName(comboBoxQtVersion.Text); config.QtVersionName = comboBoxQtVersion.Text; config.QtVersionPath = QtVersionManager.GetInstallPath(comboBoxQtVersion.Text); } else { @@ -522,7 +522,7 @@ namespace QtVsTools.Wizards.ProjectWizard private void ErrorMsg_OnMouseDown(object sender, MouseButtonEventArgs e) { var qmakePath = BrowseForAndGetQtVersion(); - if (VersionInformation.Get(qmakePath) is not {} versionInfo) + if (VersionInformation.GetOrAddByPath(qmakePath) is not {} versionInfo) return; versionInfo.name = qmakePath; |