-
Notifications
You must be signed in to change notification settings - Fork 6
/
FindAndLoadSettings.cs
78 lines (67 loc) · 4.1 KB
/
FindAndLoadSettings.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
using System;
using JetBrains.Application.FileSystemTracker;
using JetBrains.Application.Settings;
using JetBrains.Application.Settings.Implementation;
using JetBrains.Application.Settings.Storage.DefaultBody;
using JetBrains.Application.Settings.Storage.Persistence;
using JetBrains.Application.Settings.UserInterface;
using JetBrains.Application.Threading;
using JetBrains.DataFlow;
using JetBrains.Lifetimes;
using JetBrains.ProjectModel;
using JetBrains.ProjectModel.DataContext;
using JetBrains.ProjectModel.Settings.Storages;
using JetBrains.Util;
using JetBrains.Util.Logging;
namespace ReshSettingsDiscover
{
[SolutionComponent]
public class FindAndLoadSettings
{
#region Init
public FindAndLoadSettings(Lifetime lifetimeComponent, SettingsStorageProvidersCollection publisher, SolutionFileLocationLive solfile, IThreading threading, IFileSystemTracker filetracker, FileSettingsStorageBehavior behavior, ISolution solution, IShellLocks locks)
{
// In case the solution path changes, watch each value anew
solfile.SolutionFileLocation.ForEachValue_NotNull(lifetimeComponent, (lifetimeLocation, location) =>
{
double priority = ProjectModelSettingsStorageMountPointPriorityClasses.SolutionShared;
for(VirtualFileSystemPath dir = location.Directory; !dir.IsNullOrEmpty(); dir = dir.Directory)
{
try
{
priority *= .9; // The upper folder, the lower priority (regular solution-shared file takes over all of them)
// Walk up folders
// TODO: add file-system-watcher here
foreach(VirtualFileSystemPath settingsfile in dir.GetChildFiles("*." + AutoLoadExtension, PathSearchFlags.ExcludeDirectories | PathSearchFlags.ExcludeHidden))
{
var relativePath = settingsfile.MakeRelativeTo(location.Directory).FullPath;
var name = relativePath.Replace("." + AutoLoadExtension, "");
// Physical storage
var fsSettingsfile = FileSystemPath.Parse(settingsfile.FullPath);
IProperty<FileSystemPath> livepath = new Property<FileSystemPath>("StoragePath", fsSettingsfile);
var storage = new XmlFileSettingsStorage(lifetimeLocation, name, livepath, SettingsStoreSerializationToXmlDiskFile.SavingEmptyContent.KeepFile, threading, filetracker, behavior, null);
// Mount as a layer
IIsAvailable availability = new IsAvailableByDataConstant<ISolution>(lifetimeLocation, ProjectModelDataConstants.SOLUTION, solution, locks); // Only when querying in solution context (includes Application-Wide)
ISettingsStorageMountPoint mount = new SettingsStorageMountPoint(storage.Storage, SettingsStorageMountPoint.MountPath.Default, 0, priority, availability, name);
// Metadata
livepath.FlowInto(lifetimeLocation, mount.Metadata.GetOrCreateProperty(UserFriendlySettingsLayers.DiskFilePath, null, true));
mount.Metadata.Set(UserFriendlySettingsLayers.Origin, string.Format("Automatically loaded from solution parent folder, \"{0}\"", relativePath));
mount.Metadata.Set(UserInjectedSettingsLayers.IsHostingUserInjections, true);
// Publish
publisher.Storages.Add(lifetimeLocation, storage.Storage);
publisher.MountPoints.Add(lifetimeLocation, mount);
}
}
catch(Exception ex)
{
Logger.LogException(ex);
}
}
});
}
#endregion
#region Attributes
public static readonly string AutoLoadExtension = "AutoLoad.DotSettings";
#endregion
}
}