aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKarsten Heimrich <karsten.heimrich@qt.io>2024-01-15 16:40:31 +0100
committerKarsten Heimrich <karsten.heimrich@qt.io>2024-01-16 10:45:55 +0000
commit975ff836028af16080583323f8a12ce9e3df3bf2 (patch)
tree315b7bf147952eba7c467460411aee1d18ec1378
parent36eacfea4227aef34f0d26853de653f5010e93df (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.cs4
-rw-r--r--QtVsTools.Core/HelperFunctions.cs2
-rw-r--r--QtVsTools.Core/MsBuild/MsBuildProject.cs2
-rw-r--r--QtVsTools.Core/MsBuild/MsBuildProjectReaderWriter.V2.cs2
-rw-r--r--QtVsTools.Core/ProjectImport/ProjectImporter.cs6
-rw-r--r--QtVsTools.Core/QtVersionManager.cs29
-rw-r--r--QtVsTools.Core/VersionInformation.cs61
-rw-r--r--QtVsTools.Package/Editors/Editor.cs2
-rw-r--r--QtVsTools.Package/MsBuild/QtModulesEditor.cs4
-rw-r--r--QtVsTools.Package/Package/QtHelp.cs2
-rw-r--r--QtVsTools.Package/QtVsToolsPackage.cs2
-rw-r--r--QtVsTools.Wizards/ProjectWizard/ConfigPage.xaml.cs8
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;