Beispiel #1
0
        public PerProjectSettings(Lifetime lifetime, ISolution solution, ChangeManager changeManager,
                                  ModuleReferenceResolveSync moduleReferenceResolveSync,
                                  IViewableProjectsCollection projects,
                                  ISettingsSchema settingsSchema,
                                  SettingsStorageProvidersCollection settingsStorageProviders, IShellLocks locks,
                                  ILogger logger, InternKeyPathComponent interned,
                                  UnityProjectFileCacheProvider unityProjectFileCache)
        {
            mySolution                 = solution;
            myChangeManager            = changeManager;
            mySettingsSchema           = settingsSchema;
            mySettingsStorageProviders = settingsStorageProviders;
            myLocks    = locks;
            myLogger   = logger;
            myInterned = interned;
            myUnityProjectFileCache = unityProjectFileCache;
            myProjectMountPoints    = new Dictionary <IProject, SettingsStorageMountPoint>();
            myProjectLifetimes      = new Dictionary <IProject, Lifetime>();

            changeManager.RegisterChangeProvider(lifetime, this);
            changeManager.AddDependency(lifetime, this, moduleReferenceResolveSync);

            projects.Projects.View(lifetime, (projectLifetime, project) =>
            {
                myProjectLifetimes.Add(project, projectLifetime);

                if (!project.IsUnityProject())
                {
                    return;
                }

                InitialiseProjectSettings(project);
            });
        }
Beispiel #2
0
        public PerProjectSettings(Lifetime lifetime, IViewableProjectsCollection projects,
                                  ISettingsSchema settingsSchema,
                                  SettingsStorageProvidersCollection settingsStorageProviders, IShellLocks locks,
                                  ILogger logger, InternKeyPathComponent interned,
                                  LangVersionCacheProvider langVersionCache)
        {
            this.settingsSchema = settingsSchema;
            this.logger         = logger;
            myLangVersionCache  = langVersionCache;
            projects.Projects.View(lifetime, (projectLifetime, project) =>
            {
                if (!project.IsUnityProject())
                {
                    return;
                }

                var mountPoint = CreateMountPoint(projectLifetime, project, settingsStorageProviders, locks, logger, interned);
                InitialiseSettingValues(project, mountPoint);

                // Just to make things more interesting, the langversion cache isn't
                // necessarily updated by the time we get called, so wire up a callback
                myLangVersionCache.RegisterDataChangedCallback(projectLifetime, project.ProjectFileLocation,
                                                               () => InitialiseSettingValues(project, mountPoint));
            });
        }
        private SettingsStorageMountPoint CreateMountPoint(Lifetime lifetime, string name, double priority,
                                                           IIsAvailable isAvailable, SettingsStorageProvidersCollection settingsStorageProviders)
        {
            var storage    = SettingsStorageFactory.CreateStorage(lifetime, name, myLogger, myInternedKeyPaths);
            var mountPoint = new SettingsStorageMountPoint(storage, SettingsStorageMountPoint.MountPath.Default,
                                                           MountPointFlags.IsDefaultValues, priority, isAvailable, name);

            settingsStorageProviders.MountPoints.Add(lifetime, mountPoint);
            settingsStorageProviders.Storages.Add(lifetime, storage);

            return(mountPoint);
        }
Beispiel #4
0
 public PerProjectSettings(ISettingsSchema settingsSchema,
                           SettingsStorageProvidersCollection settingsStorageProviders, IShellLocks locks,
                           ILogger logger, InternKeyPathComponent interned,
                           UnityProjectFileCacheProvider unityProjectFileCache)
 {
     mySettingsSchema           = settingsSchema;
     mySettingsStorageProviders = settingsStorageProviders;
     myLocks    = locks;
     myLogger   = logger;
     myInterned = interned;
     myUnityProjectFileCache = unityProjectFileCache;
     myProjectMountPoints    = new Dictionary <IProject, SettingsStorageMountPoint>();
 }
 public SettingsLayersProvider(Lifetime lifetime, ISolution solution, IShellLocks locks,
                               SettingsStorageProvidersCollection settingsStorageProviders,
                               IEnumerable <IUnitySolutionSettingsProvider> solutionSettingsProviders,
                               IEnumerable <IUnityProjectSettingsProvider> projectSettingsProviders,
                               InternKeyPathComponent internedKeyPaths,
                               ILogger logger)
 {
     myLifetime = lifetime;
     mySolution = solution;
     myLocks    = locks;
     mySettingsStorageProviders  = settingsStorageProviders;
     mySolutionSettingsProviders = solutionSettingsProviders;
     myProjectSettingsProviders  = projectSettingsProviders;
     myInternedKeyPaths          = internedKeyPaths;
     myLogger = logger;
 }
Beispiel #6
0
        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 (FileSystemPath 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 (FileSystemPath settingsfile in dir.GetChildFiles("*." + AutoLoadExtension, PathSearchFlags.ExcludeDirectories | PathSearchFlags.ExcludeHidden))
                        {
                            var relativePath = settingsfile.MakeRelativeTo(location.Directory).FullPath;
                            var name         = relativePath.Replace("." + AutoLoadExtension, "");

                            // Physical storage
                            IProperty <FileSystemPath> livepath = new Property <FileSystemPath>(lifetimeLocation, "StoragePath", settingsfile);
                            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);
                    }
                }
            });
        }
        public PerProjectSettings(Lifetime lifetime, IViewableProjectsCollection projects,
                                  ISettingsSchema settingsSchema,
                                  SettingsStorageProvidersCollection settingsStorageProviders, IShellLocks locks,
                                  ILogger logger, InternKeyPathComponent interned)
        {
            this.settingsSchema = settingsSchema;
            this.logger         = logger;
            projects.Projects.View(lifetime, (projectLifetime, project) =>
            {
                if (!project.HasFlavour <UnityProjectFlavor>())
                {
                    return;
                }

                var mountPoint = CreateMountPoint(projectLifetime, project, settingsStorageProviders, locks, logger, interned);
                InitNamespaceProviderSettings(mountPoint);
                InitLanguageLevelSettings(mountPoint);
            });
        }
        private static SettingsStorageMountPoint CreateMountPoint(Lifetime projectLifetime,
                                                                  IProject project, SettingsStorageProvidersCollection settingsStorageProviders,
                                                                  IShellLocks locks, ILogger logger,
                                                                  InternKeyPathComponent interned)
        {
            var storageName = $"Project {project.Name} (Unity)";
            var storage     = SettingsStorageFactory.CreateStorage(projectLifetime, storageName, logger, interned);
            var isAvailable = new IsAvailableByDataConstant <IProject>(projectLifetime,
                                                                       ProjectModelDataConstants.Project, project, locks);

            // Set at a priority less than the .csproj.dotSettings layer, so we can be overridden
            var priority   = ProjectModelSettingsStorageMountPointPriorityClasses.ProjectShared * 0.9;
            var mountPoint = new SettingsStorageMountPoint(storage, SettingsStorageMountPoint.MountPath.Default,
                                                           MountPointFlags.IsDefaultValues, priority, isAvailable, storageName);

            settingsStorageProviders.MountPoints.Add(projectLifetime, mountPoint);
            settingsStorageProviders.Storages.Add(projectLifetime, storage);

            return(mountPoint);
        }
        public PerProjectSettings(ISolution solution, ChangeManager changeManager,
                                  ISettingsSchema settingsSchema,
                                  SettingsStorageProvidersCollection settingsStorageProviders, IShellLocks locks,
                                  ILogger logger, InternKeyPathComponent interned,
                                  UnityProjectFileCacheProvider unityProjectFileCache,
                                  ProjectReferenceChangeTracker changeTracker)
        {
            mySolution                 = solution;
            myChangeManager            = changeManager;
            mySettingsSchema           = settingsSchema;
            mySettingsStorageProviders = settingsStorageProviders;
            myLocks    = locks;
            myLogger   = logger;
            myInterned = interned;
            myUnityProjectFileCache = unityProjectFileCache;
            myProjectMountPoints    = new Dictionary <IProject, SettingsStorageMountPoint>();
            myProjectLifetimes      = new Dictionary <IProject, Lifetime>();

            changeTracker.RegisterProjectChangeHandler(InitialiseProjectSettings);
        }