diff --git a/src/DynamoCore/Configuration/PathManager.cs b/src/DynamoCore/Configuration/PathManager.cs index e4c6e4a9af3..3c1dc0253cb 100644 --- a/src/DynamoCore/Configuration/PathManager.cs +++ b/src/DynamoCore/Configuration/PathManager.cs @@ -50,12 +50,49 @@ struct PathManagerParams internal class PathManager : IPathManager { - internal static Lazy - lazy = - new Lazy - (() => new PathManager(new PathManagerParams())); + private static Lazy lazy; + private static readonly object lockObject = new object(); - public static PathManager Instance { get { return lazy.Value; } } + /// + /// Initialize the PathManager singleton passing as a parameter a PathManagerParams object (which contains the Major and Minor version values). + /// + /// + public static void Initialize(PathManagerParams parameters) + { + lock (lockObject) + { + if (lazy != null) + { + // Or do we want to reset the existing instance? See below for discussions. + throw new InvalidOperationException("PathManager has already been initialized."); + } + + lazy = new Lazy(() => new PathManager(parameters)); + } + } + + /// + /// Instance is the property used as an access point to the PathManager singleton (if is not created will be created with default parameters). + /// + public static PathManager Instance + { + get + { + if (lazy == null) + { + lock (lockObject) + { + if (lazy == null) + { + // Fallback to default if not initialized + lazy = new Lazy(() => new PathManager(new PathManagerParams())); + } + } + } + + return lazy.Value; + } + } #region Class Private Data Members diff --git a/src/DynamoCore/Models/DynamoModel.cs b/src/DynamoCore/Models/DynamoModel.cs index 51c501b2fef..175155f2be9 100644 --- a/src/DynamoCore/Models/DynamoModel.cs +++ b/src/DynamoCore/Models/DynamoModel.cs @@ -1109,6 +1109,18 @@ private void SearchModel_ItemProduced(NodeModel node) /// internal PathManager CreatePathManager(IStartConfiguration config) { + var pathManagerParams = new PathManagerParams(); + + var version = config.HostAnalyticsInfo.HostVersion; + if (version != null) + { + // Use host versions if provided + pathManagerParams.MajorFileVersion = version.Major; + pathManagerParams.MinorFileVersion = version.Minor; + + Dynamo.Core.PathManager.Initialize(pathManagerParams); + } + if (!config.StartInTestMode) { if (!Core.PathManager.Instance.HasPathResolver) diff --git a/src/Tools/DynamoInstallDetective/ProductLookUp.cs b/src/Tools/DynamoInstallDetective/ProductLookUp.cs index 99dd112748b..1198a389c2b 100644 --- a/src/Tools/DynamoInstallDetective/ProductLookUp.cs +++ b/src/Tools/DynamoInstallDetective/ProductLookUp.cs @@ -522,7 +522,7 @@ public static string GetDynamoPath(Version version, string debugPath = null) if (installs == null) return string.Empty; return installs.Products - .Where(p => p.VersionInfo.Item1 == version.Major) + .Where(p => p.VersionInfo.Item1 <= version.Major) .Where(p => p.VersionInfo.Item2 >= version.Minor) .Select(p => p.InstallLocation) .LastOrDefault(); diff --git a/test/DynamoCoreTests/PackageDependencyTests.cs b/test/DynamoCoreTests/PackageDependencyTests.cs index 93c90ce0eea..07789cd64d6 100644 --- a/test/DynamoCoreTests/PackageDependencyTests.cs +++ b/test/DynamoCoreTests/PackageDependencyTests.cs @@ -2,7 +2,9 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Reflection; using Dynamo.Configuration; +using Dynamo.Core; using Dynamo.Graph.Workspaces; using Dynamo.Interfaces; using Dynamo.Models; @@ -213,6 +215,32 @@ public void PackageDependencyIsCollectedForNewWorkspace() } } + + /// + /// This test verifies that the PathManager singleton instance is created with the expected properties + /// e.g. DefaultPackagesDirectory has a structure like C:\Users\\AppData\Roaming\Dynamo\Dynamo Core\4.0\packages + /// + [Test] + public void PackageInstallationPathTest() + { + int CurrentMajorFileVersion = 4; + int CurrentMinorFileVersion = 0; + + //The PathManager was already created with empty parameters when PreferenceSettings is created. + PathManager singletonPathManager = PathManager.Instance; + var dynCorePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); + var appDataFolder = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); + + var commonDataDirectory = dynCorePath; + var defaultPackagesDirectory = Path.Combine(appDataFolder, "Dynamo","Dynamo Core", CurrentMajorFileVersion.ToString("F1"), "packages"); + + //Checking that the properties in PathManager are the expected ones + Assert.IsTrue(singletonPathManager.MajorFileVersion == CurrentMajorFileVersion); + Assert.IsTrue(singletonPathManager.MinorFileVersion == CurrentMinorFileVersion); + Assert.IsTrue(singletonPathManager.CommonDataDirectory.Equals(commonDataDirectory)); + Assert.IsTrue(singletonPathManager.DefaultPackagesDirectory.Equals(defaultPackagesDirectory)); + } + [Test] public void PackageDependenciesUpdatedAfterNodesAdded() {